diff options
-rw-r--r-- | chromecast/media/cdm/browser_cdm_cast.cc | 9 | ||||
-rw-r--r-- | content/browser/media/cdm/browser_cdm_manager.cc | 7 | ||||
-rw-r--r-- | media/base/cdm_callback_promise.cc | 11 | ||||
-rw-r--r-- | media/base/cdm_callback_promise.h | 2 | ||||
-rw-r--r-- | media/base/cdm_promise.h | 13 | ||||
-rw-r--r-- | media/blink/cdm_result_promise.h | 12 | ||||
-rw-r--r-- | media/blink/new_session_cdm_result_promise.cc | 2 | ||||
-rw-r--r-- | media/mojo/services/mojo_cdm_promise.cc | 7 | ||||
-rw-r--r-- | media/mojo/services/mojo_cdm_promise.h | 4 |
9 files changed, 55 insertions, 12 deletions
diff --git a/chromecast/media/cdm/browser_cdm_cast.cc b/chromecast/media/cdm/browser_cdm_cast.cc index 380c362..e5585c5 100644 --- a/chromecast/media/cdm/browser_cdm_cast.cc +++ b/chromecast/media/cdm/browser_cdm_cast.cc @@ -29,8 +29,11 @@ class CdmPromiseInternal : public ::media::CdmPromiseTemplate<T...> { promise_(std::move(promise)) {} ~CdmPromiseInternal() final { - // Promise must be resolved or rejected before destruction. - DCHECK(!promise_); + if (IsPromiseSettled()) + return; + + DCHECK(promise_); + RejectPromiseOnDestruction(); } // CdmPromiseTemplate<> implementation. @@ -48,7 +51,9 @@ class CdmPromiseInternal : public ::media::CdmPromiseTemplate<T...> { } private: + using ::media::CdmPromiseTemplate<T...>::IsPromiseSettled; using ::media::CdmPromiseTemplate<T...>::MarkPromiseSettled; + using ::media::CdmPromiseTemplate<T...>::RejectPromiseOnDestruction; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; scoped_ptr<::media::CdmPromiseTemplate<T...>> promise_; diff --git a/content/browser/media/cdm/browser_cdm_manager.cc b/content/browser/media/cdm/browser_cdm_manager.cc index c83bdd2..db94775 100644 --- a/content/browser/media/cdm/browser_cdm_manager.cc +++ b/content/browser/media/cdm/browser_cdm_manager.cc @@ -72,7 +72,10 @@ class CdmPromiseInternal : public media::CdmPromiseTemplate<T...> { DCHECK(manager_); } - ~CdmPromiseInternal() final {} + ~CdmPromiseInternal() final { + if (!IsPromiseSettled()) + RejectPromiseOnDestruction(); + } // CdmPromiseTemplate<> implementation. void resolve(const T&... result) final; @@ -88,7 +91,9 @@ class CdmPromiseInternal : public media::CdmPromiseTemplate<T...> { } private: + using media::CdmPromiseTemplate<T...>::IsPromiseSettled; using media::CdmPromiseTemplate<T...>::MarkPromiseSettled; + using media::CdmPromiseTemplate<T...>::RejectPromiseOnDestruction; base::WeakPtr<BrowserCdmManager> const manager_; const int render_frame_id_; diff --git a/media/base/cdm_callback_promise.cc b/media/base/cdm_callback_promise.cc index 496ad1a..21a3412 100644 --- a/media/base/cdm_callback_promise.cc +++ b/media/base/cdm_callback_promise.cc @@ -4,6 +4,7 @@ #include "media/base/cdm_callback_promise.h" +#include "base/callback_helpers.h" #include "base/logging.h" namespace media { @@ -19,12 +20,17 @@ CdmCallbackPromise<T...>::CdmCallbackPromise( template <typename... T> CdmCallbackPromise<T...>::~CdmCallbackPromise() { + if (IsPromiseSettled()) + return; + + DCHECK(!resolve_cb_.is_null() && !reject_cb_.is_null()); + RejectPromiseOnDestruction(); } template <typename... T> void CdmCallbackPromise<T...>::resolve(const T&... result) { MarkPromiseSettled(); - resolve_cb_.Run(result...); + base::ResetAndReturn(&resolve_cb_).Run(result...); } template <typename... T> @@ -32,7 +38,8 @@ void CdmCallbackPromise<T...>::reject(MediaKeys::Exception exception_code, uint32_t system_code, const std::string& error_message) { MarkPromiseSettled(); - reject_cb_.Run(exception_code, system_code, error_message); + base::ResetAndReturn(&reject_cb_) + .Run(exception_code, system_code, error_message); } // Explicit template instantiation for the Promises needed. diff --git a/media/base/cdm_callback_promise.h b/media/base/cdm_callback_promise.h index b271a79..3ddc340 100644 --- a/media/base/cdm_callback_promise.h +++ b/media/base/cdm_callback_promise.h @@ -36,7 +36,9 @@ class MEDIA_EXPORT CdmCallbackPromise : public CdmPromiseTemplate<T...> { const std::string& error_message) override; private: + using CdmPromiseTemplate<T...>::IsPromiseSettled; using CdmPromiseTemplate<T...>::MarkPromiseSettled; + using CdmPromiseTemplate<T...>::RejectPromiseOnDestruction; base::Callback<void(const T&...)> resolve_cb_; PromiseRejectedCB reject_cb_; diff --git a/media/base/cdm_promise.h b/media/base/cdm_promise.h index 0c44f80..dc11e7a 100644 --- a/media/base/cdm_promise.h +++ b/media/base/cdm_promise.h @@ -99,6 +99,8 @@ class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise { } protected: + bool IsPromiseSettled() const { return is_settled_; } + // All implementations must call this method in resolve() and reject() methods // to indicate that the promise has been settled. void MarkPromiseSettled() { @@ -107,6 +109,17 @@ class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise { is_settled_ = true; } + // Must be called by the concrete destructor if !IsPromiseSettled(). + // Note: We can't call reject() in ~CdmPromise() because reject() is virtual. + void RejectPromiseOnDestruction() { + DCHECK(!is_settled_); + std::string message = + "Unfulfilled promise rejected automatically during destruction."; + DVLOG(1) << message; + reject(MediaKeys::INVALID_STATE_ERROR, 0, message); + DCHECK(is_settled_); + } + private: // Keep track of whether the promise has been resolved or rejected yet. bool is_settled_; diff --git a/media/blink/cdm_result_promise.h b/media/blink/cdm_result_promise.h index 179654e..0f7eeb1 100644 --- a/media/blink/cdm_result_promise.h +++ b/media/blink/cdm_result_promise.h @@ -24,7 +24,7 @@ namespace media { // If constructed with a |uma_name|, CdmResultPromise will report the promise // result (success or rejection code) to UMA. template <typename... T> -class CdmResultPromise : public media::CdmPromiseTemplate<T...> { +class CdmResultPromise : public CdmPromiseTemplate<T...> { public: CdmResultPromise(const blink::WebContentDecryptionModuleResult& result, const std::string& uma_name); @@ -32,12 +32,14 @@ class CdmResultPromise : public media::CdmPromiseTemplate<T...> { // CdmPromiseTemplate<T> implementation. void resolve(const T&... result) override; - void reject(media::MediaKeys::Exception exception_code, + void reject(MediaKeys::Exception exception_code, uint32_t system_code, const std::string& error_message) override; private: - using media::CdmPromiseTemplate<T...>::MarkPromiseSettled; + using CdmPromiseTemplate<T...>::IsPromiseSettled; + using CdmPromiseTemplate<T...>::MarkPromiseSettled; + using CdmPromiseTemplate<T...>::RejectPromiseOnDestruction; blink::WebContentDecryptionModuleResult web_cdm_result_; @@ -56,6 +58,8 @@ CdmResultPromise<T...>::CdmResultPromise( template <typename... T> CdmResultPromise<T...>::~CdmResultPromise() { + if (!IsPromiseSettled()) + RejectPromiseOnDestruction(); } // "inline" is needed to prevent multiple definition error. @@ -68,7 +72,7 @@ inline void CdmResultPromise<>::resolve() { } template <typename... T> -void CdmResultPromise<T...>::reject(media::MediaKeys::Exception exception_code, +void CdmResultPromise<T...>::reject(MediaKeys::Exception exception_code, uint32_t system_code, const std::string& error_message) { MarkPromiseSettled(); diff --git a/media/blink/new_session_cdm_result_promise.cc b/media/blink/new_session_cdm_result_promise.cc index 4a97c34..1d7ad29 100644 --- a/media/blink/new_session_cdm_result_promise.cc +++ b/media/blink/new_session_cdm_result_promise.cc @@ -36,6 +36,8 @@ NewSessionCdmResultPromise::NewSessionCdmResultPromise( } NewSessionCdmResultPromise::~NewSessionCdmResultPromise() { + if (!IsPromiseSettled()) + RejectPromiseOnDestruction(); } void NewSessionCdmResultPromise::resolve(const std::string& session_id) { diff --git a/media/mojo/services/mojo_cdm_promise.cc b/media/mojo/services/mojo_cdm_promise.cc index 25131b2..ab699a2 100644 --- a/media/mojo/services/mojo_cdm_promise.cc +++ b/media/mojo/services/mojo_cdm_promise.cc @@ -37,8 +37,11 @@ MojoCdmPromise<T...>::MojoCdmPromise(const CallbackType& callback) template <typename... T> MojoCdmPromise<T...>::~MojoCdmPromise() { - if (!callback_.is_null()) - DVLOG(1) << "Promise not resolved before destruction."; + if (IsPromiseSettled()) + return; + + DCHECK(!callback_.is_null()); + RejectPromiseOnDestruction(); } template <typename... T> diff --git a/media/mojo/services/mojo_cdm_promise.h b/media/mojo/services/mojo_cdm_promise.h index f56a589..e2797c2 100644 --- a/media/mojo/services/mojo_cdm_promise.h +++ b/media/mojo/services/mojo_cdm_promise.h @@ -33,7 +33,9 @@ class MojoCdmPromise : public CdmPromiseTemplate<T...> { const std::string& error_message) final; private: - using media::CdmPromiseTemplate<T...>::MarkPromiseSettled; + using CdmPromiseTemplate<T...>::IsPromiseSettled; + using CdmPromiseTemplate<T...>::MarkPromiseSettled; + using CdmPromiseTemplate<T...>::RejectPromiseOnDestruction; CallbackType callback_; }; |