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

Unified Diff: media/base/cdm_promise_adapter.cc

Issue 836783004: media: Handle promise resolve/rejection in CdmPromiseAdapter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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: media/base/cdm_promise_adapter.cc
diff --git a/media/base/cdm_promise_adapter.cc b/media/base/cdm_promise_adapter.cc
index 5c34da5d80914355eb3ed1bff22458538bad7fcb..a2c927006b4a11dc43316ecfccafefa251938df4 100644
--- a/media/base/cdm_promise_adapter.cc
+++ b/media/base/cdm_promise_adapter.cc
@@ -12,6 +12,8 @@ CdmPromiseAdapter::CdmPromiseAdapter() : next_promise_id_(1) {
}
CdmPromiseAdapter::~CdmPromiseAdapter() {
+ DCHECK(promises_.empty());
+ Clear();
}
uint32_t CdmPromiseAdapter::SavePromise(scoped_ptr<CdmPromise> promise) {
@@ -20,11 +22,38 @@ uint32_t CdmPromiseAdapter::SavePromise(scoped_ptr<CdmPromise> promise) {
return promise_id;
}
-scoped_ptr<CdmPromise> CdmPromiseAdapter::TakePromise(uint32_t promise_id) {
- PromiseMap::iterator it = promises_.find(promise_id);
- if (it == promises_.end())
- return nullptr;
- return promises_.take_and_erase(it);
+template <typename... T>
+void CdmPromiseAdapter::ResolvePromise(uint32_t promise_id,
+ const T&... result) {
+ scoped_ptr<CdmPromise> promise = TakePromise(promise_id);
+ if (!promise) {
+ NOTREACHED() << "Promise not found for " << promise_id;
+ return;
+ }
+
+ // Sanity check the type before we do static_cast.
+ CdmPromise::ResolveParameterType type = promise->GetResolveParameterType();
+ CdmPromise::ResolveParameterType expected = CdmPromiseTraits<T...>::kType;
+ if (type != expected) {
+ NOTREACHED() << "Promise type mismatch: " << type << " vs " << expected;
+ return;
+ }
+
+ static_cast<CdmPromiseTemplate<T...>*>(promise.get())->resolve(result...);
+}
+
+void CdmPromiseAdapter::RejectPromise(
+ uint32_t promise_id,
+ MediaKeys::Exception exception_code,
+ uint32 system_code,
+ const std::string& error_message) {
+ scoped_ptr<CdmPromise> promise = TakePromise(promise_id);
+ if (!promise) {
+ NOTREACHED() << "No promise found for promise_id " << promise_id;
+ return;
+ }
+
+ promise->reject(exception_code, system_code, error_message);
}
void CdmPromiseAdapter::Clear() {
@@ -34,4 +63,15 @@ void CdmPromiseAdapter::Clear() {
promises_.clear();
}
+scoped_ptr<CdmPromise> CdmPromiseAdapter::TakePromise(uint32_t promise_id) {
+ PromiseMap::iterator it = promises_.find(promise_id);
+ if (it == promises_.end())
+ return nullptr;
+ return promises_.take_and_erase(it);
+}
+
+// Explicit instantiation of function templates.
+template void CdmPromiseAdapter::ResolvePromise(uint32_t);
xhwang 2015/01/09 23:51:03 The template type is automatically deduced.
+template void CdmPromiseAdapter::ResolvePromise(uint32_t, const std::string&);
+
} // namespace media
« content/renderer/pepper/content_decryptor_delegate.cc ('K') | « media/base/cdm_promise_adapter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698