Index: media/mojo/clients/mojo_cdm.cc |
diff --git a/media/mojo/clients/mojo_cdm.cc b/media/mojo/clients/mojo_cdm.cc |
index 471647b1fd67c6a93ebc6bf6b7f24a9aa920e5da..10331747668601d06a161a7dd99a78182a7a1997 100644 |
--- a/media/mojo/clients/mojo_cdm.cc |
+++ b/media/mojo/clients/mojo_cdm.cc |
@@ -25,13 +25,6 @@ |
namespace media { |
-template <typename PromiseType> |
-static void RejectPromise(std::unique_ptr<PromiseType> promise, |
- mojom::CdmPromiseResultPtr result) { |
- promise->reject(result->exception, result->system_code, |
- result->error_message); |
-} |
- |
// static |
void MojoCdm::Create( |
const std::string& key_system, |
@@ -140,6 +133,9 @@ void MojoCdm::OnConnectionError(uint32_t custom_reason, |
return; |
} |
+ // As communication with the remote CDM is broken, reject any outstanding |
+ // promises and close all the existing sessions. |
+ cdm_promise_adapter_.Clear(); |
cdm_session_tracker_.CloseRemainingSessions(session_closed_cb_); |
} |
@@ -154,9 +150,10 @@ void MojoCdm::SetServerCertificate(const std::vector<uint8_t>& certificate, |
return; |
} |
+ uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
remote_cdm_->SetServerCertificate( |
certificate, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
- base::Unretained(this), base::Passed(&promise))); |
+ base::Unretained(this), promise_id)); |
} |
void MojoCdm::CreateSessionAndGenerateRequest( |
@@ -173,10 +170,11 @@ void MojoCdm::CreateSessionAndGenerateRequest( |
return; |
} |
+ uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
remote_cdm_->CreateSessionAndGenerateRequest( |
session_type, init_data_type, init_data, |
base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, base::Unretained(this), |
- base::Passed(&promise))); |
+ promise_id)); |
} |
void MojoCdm::LoadSession(CdmSessionType session_type, |
@@ -191,10 +189,10 @@ void MojoCdm::LoadSession(CdmSessionType session_type, |
return; |
} |
- remote_cdm_->LoadSession( |
- session_type, session_id, |
- base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, base::Unretained(this), |
- base::Passed(&promise))); |
+ uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
+ remote_cdm_->LoadSession(session_type, session_id, |
+ base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, |
+ base::Unretained(this), promise_id)); |
} |
void MojoCdm::UpdateSession(const std::string& session_id, |
@@ -209,10 +207,10 @@ void MojoCdm::UpdateSession(const std::string& session_id, |
return; |
} |
- remote_cdm_->UpdateSession( |
- session_id, response, |
- base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, base::Unretained(this), |
- base::Passed(&promise))); |
+ uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
+ remote_cdm_->UpdateSession(session_id, response, |
+ base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
+ base::Unretained(this), promise_id)); |
} |
void MojoCdm::CloseSession(const std::string& session_id, |
@@ -226,9 +224,10 @@ void MojoCdm::CloseSession(const std::string& session_id, |
return; |
} |
- remote_cdm_->CloseSession( |
- session_id, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
- base::Unretained(this), base::Passed(&promise))); |
+ uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
+ remote_cdm_->CloseSession(session_id, |
+ base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
+ base::Unretained(this), promise_id)); |
} |
void MojoCdm::RemoveSession(const std::string& session_id, |
@@ -242,9 +241,10 @@ void MojoCdm::RemoveSession(const std::string& session_id, |
return; |
} |
- remote_cdm_->RemoveSession( |
- session_id, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
- base::Unretained(this), base::Passed(&promise))); |
+ uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
+ remote_cdm_->RemoveSession(session_id, |
+ base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
+ base::Unretained(this), promise_id)); |
} |
CdmContext* MojoCdm::GetCdmContext() { |
@@ -341,7 +341,9 @@ void MojoCdm::OnCdmInitialized(mojom::CdmPromiseResultPtr result, |
DCHECK(pending_init_promise_); |
if (!result->success) { |
- RejectPromise(std::move(pending_init_promise_), std::move(result)); |
+ pending_init_promise_->reject(result->exception, result->system_code, |
+ result->error_message); |
+ pending_init_promise_.reset(); |
return; |
} |
@@ -366,24 +368,28 @@ void MojoCdm::OnKeyAdded() { |
decryptor_->OnKeyAdded(); |
} |
-void MojoCdm::OnSimpleCdmPromiseResult( |
- std::unique_ptr<SimpleCdmPromise> promise, |
- mojom::CdmPromiseResultPtr result) { |
+void MojoCdm::OnSimpleCdmPromiseResult(uint32_t promise_id, |
+ mojom::CdmPromiseResultPtr result) { |
if (result->success) |
- promise->resolve(); |
- else |
- RejectPromise(std::move(promise), std::move(result)); |
+ cdm_promise_adapter_.ResolvePromise(promise_id); |
+ else { |
+ cdm_promise_adapter_.RejectPromise(promise_id, result->exception, |
+ result->system_code, |
+ result->error_message); |
+ } |
} |
-void MojoCdm::OnNewSessionCdmPromiseResult( |
- std::unique_ptr<NewSessionCdmPromise> promise, |
- mojom::CdmPromiseResultPtr result, |
- const std::string& session_id) { |
+void MojoCdm::OnNewSessionCdmPromiseResult(uint32_t promise_id, |
+ mojom::CdmPromiseResultPtr result, |
+ const std::string& session_id) { |
if (result->success) { |
cdm_session_tracker_.AddSession(session_id); |
- promise->resolve(session_id); |
- } else |
- RejectPromise(std::move(promise), std::move(result)); |
+ cdm_promise_adapter_.ResolvePromise(promise_id, session_id); |
+ } else { |
+ cdm_promise_adapter_.RejectPromise(promise_id, result->exception, |
+ result->system_code, |
+ result->error_message); |
+ } |
} |
} // namespace media |