Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(817)

Unified Diff: third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp

Issue 2407013002: EME: Improve promise lifetime (Closed)
Patch Set: remove m_contextDestroyed Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp
index 40d3e7fa1d64910517529b7aa182df489d8c7f13..6cb53412610345a24a65d8a47c146768599b3f61 100644
--- a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp
+++ b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeySession.cpp
@@ -38,7 +38,6 @@
#include "modules/encryptedmedia/EncryptedMediaUtils.h"
#include "modules/encryptedmedia/MediaKeyMessageEvent.h"
#include "modules/encryptedmedia/MediaKeys.h"
-#include "modules/encryptedmedia/SimpleContentDecryptionModuleResultPromise.h"
#include "platform/ContentDecryptionModuleResult.h"
#include "platform/ContentType.h"
#include "platform/Timer.h"
@@ -231,6 +230,9 @@ class NewSessionResultPromise : public ContentDecryptionModuleResultPromise {
// ContentDecryptionModuleResult implementation.
void completeWithSession(
WebContentDecryptionModuleResult::SessionStatus status) override {
+ if (!isValidToFulfillPromise())
+ return;
+
if (status != WebContentDecryptionModuleResult::NewSession) {
NOTREACHED();
reject(InvalidStateError, "Unexpected completion.");
@@ -264,6 +266,9 @@ class LoadSessionResultPromise : public ContentDecryptionModuleResultPromise {
// ContentDecryptionModuleResult implementation.
void completeWithSession(
WebContentDecryptionModuleResult::SessionStatus status) override {
+ if (!isValidToFulfillPromise())
+ return;
xhwang 2016/10/13 19:29:58 We are checking this in both the sub class and bas
jrummell 2016/10/14 00:03:31 We need to check before we attempt to create any o
+
switch (status) {
case WebContentDecryptionModuleResult::NewSession:
m_session->finishLoad();
@@ -292,6 +297,29 @@ class LoadSessionResultPromise : public ContentDecryptionModuleResultPromise {
Member<MediaKeySession> m_session;
};
+// This class wraps the promise resolver used by update/close/remove. The
+// implementation of complete() will resolve the promise with void. All other
+// complete() methods are not expected to be called (and will reject the
+// promise).
+class SimpleResultPromise : public ContentDecryptionModuleResultPromise {
+ public:
+ SimpleResultPromise(ScriptState* scriptState, MediaKeySession* session)
+ : ContentDecryptionModuleResultPromise(scriptState), m_session(session) {}
+
+ ~SimpleResultPromise() override {}
+
+ // ContentDecryptionModuleResultPromise implementation.
+ void complete() override { resolve(); }
xhwang 2016/10/13 19:29:58 Just FWIW, we are not checking isValidToFulfillPro
jrummell 2016/10/14 00:03:31 Added.
+
+ DEFINE_INLINE_TRACE() {
+ visitor->trace(m_session);
+ ContentDecryptionModuleResultPromise::trace(visitor);
+ }
+
+ private:
+ Member<MediaKeySession> m_session;
xhwang 2016/10/13 19:29:58 Add a comment about why we need this here.
jrummell 2016/10/14 00:03:31 Done.
+};
+
MediaKeySession* MediaKeySession::create(
ScriptState* scriptState,
MediaKeys* mediaKeys,
@@ -546,8 +574,7 @@ ScriptPromise MediaKeySession::update(ScriptState* scriptState,
DOMArrayBuffer::create(response.data(), response.byteLength());
// 4. Let promise be a new promise.
- SimpleContentDecryptionModuleResultPromise* result =
- new SimpleContentDecryptionModuleResultPromise(scriptState);
+ SimpleResultPromise* result = new SimpleResultPromise(scriptState, this);
ScriptPromise promise = result->promise();
// 5. Run the following steps asynchronously (documented in
@@ -580,8 +607,7 @@ ScriptPromise MediaKeySession::close(ScriptState* scriptState) {
return ScriptPromise::cast(scriptState, ScriptValue());
// 3. Let promise be a new promise.
- SimpleContentDecryptionModuleResultPromise* result =
- new SimpleContentDecryptionModuleResultPromise(scriptState);
+ SimpleResultPromise* result = new SimpleResultPromise(scriptState, this);
ScriptPromise promise = result->promise();
// 4. Run the following steps asynchronously (documented in
@@ -627,8 +653,7 @@ ScriptPromise MediaKeySession::remove(ScriptState* scriptState) {
}
// 4. Let promise be a new promise.
- SimpleContentDecryptionModuleResultPromise* result =
- new SimpleContentDecryptionModuleResultPromise(scriptState);
+ SimpleResultPromise* result = new SimpleResultPromise(scriptState, this);
ScriptPromise promise = result->promise();
// 5. Run the following steps asynchronously (documented in

Powered by Google App Engine
This is Rietveld 408576698