diff options
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.cc | 18 |
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(); |