Chromium Code Reviews| Index: third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp |
| diff --git a/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp b/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp |
| index 58b35116e66ac7d09d376be848413d8994f3eb3a..93e50d4ecb51d2d97eaf08e759892405006db342 100644 |
| --- a/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp |
| +++ b/third_party/WebKit/Source/modules/encryptedmedia/ContentDecryptionModuleResultPromise.cpp |
| @@ -66,6 +66,9 @@ void ContentDecryptionModuleResultPromise::completeWithError( |
| WebContentDecryptionModuleException exceptionCode, |
| unsigned long systemCode, |
| const WebString& errorMessage) { |
| + if (!isValidToFulfillPromise()) |
| + return; |
| + |
| // Non-zero |systemCode| is appended to the |errorMessage|. If the |
| // |errorMessage| is empty, we'll report "Rejected with system code |
| // (systemCode)". |
| @@ -87,24 +90,8 @@ ScriptPromise ContentDecryptionModuleResultPromise::promise() { |
| void ContentDecryptionModuleResultPromise::reject(ExceptionCode code, |
| const String& errorMessage) { |
| - // Reject the promise asynchronously. This avoids problems when gc is |
| - // destroying objects that result in unfulfilled promises being rejected. |
| - // (Resolving promises is still done synchronously as there may be events |
| - // already posted that need to happen only after the promise is resolved.) |
| - // TODO(jrummell): Make resolving a promise asynchronous as well (including |
| - // making sure events still happen after the promise is resolved). |
| - if (getExecutionContext()) { |
| - getExecutionContext()->postTask( |
| - BLINK_FROM_HERE, |
| - createSameThreadTask( |
| - &ContentDecryptionModuleResultPromise::rejectInternal, |
| - wrapPersistent(this), code, errorMessage)); |
| - } |
| -} |
| + DCHECK(isValidToFulfillPromise()); |
| -void ContentDecryptionModuleResultPromise::rejectInternal( |
| - ExceptionCode code, |
| - const String& errorMessage) { |
| m_resolver->reject(DOMException::create(code, errorMessage)); |
| m_resolver.clear(); |
| } |
| @@ -114,6 +101,12 @@ ExecutionContext* ContentDecryptionModuleResultPromise::getExecutionContext() |
| return m_resolver->getExecutionContext(); |
| } |
| +bool ContentDecryptionModuleResultPromise::isValidToFulfillPromise() { |
| + // getExecutionContext() is no longer valid once the context is destroyed. |
| + return getExecutionContext() && |
| + !getExecutionContext()->activeDOMObjectsAreStopped(); |
|
haraken
2016/10/14 00:48:41
Add a comment about why we need to check getExecut
jrummell
2016/10/14 02:13:30
Done.
|
| +} |
| + |
| DEFINE_TRACE(ContentDecryptionModuleResultPromise) { |
| visitor->trace(m_resolver); |
| ContentDecryptionModuleResult::trace(visitor); |