summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc')
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc b/chromium/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc
index fa1fb64ec8b..7b1ae6c4523 100644
--- a/chromium/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc
+++ b/chromium/third_party/blink/renderer/bindings/core/v8/script_promise_property_base.cc
@@ -16,7 +16,7 @@ ScriptPromisePropertyBase::ScriptPromisePropertyBase(
ExecutionContext* execution_context,
Name name)
: ContextClient(execution_context),
- isolate_(ToIsolate(execution_context)),
+ isolate_(execution_context->GetIsolate()),
name_(name),
state_(kPending) {}
@@ -166,8 +166,20 @@ void ScriptPromisePropertyBase::ClearWrappers() {
if (!wrapper.IsEmpty()) {
v8::Context::Scope scope(wrapper->CreationContext());
// TODO(peria): Use deleteProperty() if http://crbug.com/v8/6227 is fixed.
- ResolverSymbol().Set(wrapper, v8::Undefined(isolate_));
- PromiseSymbol().Set(wrapper, v8::Undefined(isolate_));
+
+ // Check whether the value has been set or not. Unfortunately, HasValue
+ // cannot be used as it triggers regular ScriptForbiddenScope through V8
+ // callbacks. GetOrUndefined avoids this because it does not enter a
+ // proper scope in V8.
+ v8::Local<v8::Value> cache;
+ if (ResolverSymbol().GetOrUndefined(wrapper).ToLocal(&cache) &&
+ !cache->IsUndefined()) {
+ ResolverSymbol().Set(wrapper, v8::Undefined(isolate_));
+ }
+ if (PromiseSymbol().GetOrUndefined(wrapper).ToLocal(&cache) &&
+ !cache->IsUndefined()) {
+ PromiseSymbol().Set(wrapper, v8::Undefined(isolate_));
+ }
}
}
wrappers_.clear();