summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chromecast/media/cdm/browser_cdm_cast.cc9
-rw-r--r--content/browser/media/cdm/browser_cdm_manager.cc7
-rw-r--r--media/base/cdm_callback_promise.cc11
-rw-r--r--media/base/cdm_callback_promise.h2
-rw-r--r--media/base/cdm_promise.h13
-rw-r--r--media/blink/cdm_result_promise.h12
-rw-r--r--media/blink/new_session_cdm_result_promise.cc2
-rw-r--r--media/mojo/services/mojo_cdm_promise.cc7
-rw-r--r--media/mojo/services/mojo_cdm_promise.h4
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_;
};