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

Unified Diff: media/mojo/clients/mojo_cdm.cc

Issue 2561263002: [eme] Reject CDM calls after connection error (Closed)
Patch Set: changes Created 4 years 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/mojo/clients/mojo_cdm.cc
diff --git a/media/mojo/clients/mojo_cdm.cc b/media/mojo/clients/mojo_cdm.cc
index 042ef15f58b835a094b41ceecfe67bd106005994..f8ba6544cfaf2c8e819831866b88cc4db813046d 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,
@@ -122,14 +115,14 @@ void MojoCdm::InitializeCdm(const std::string& key_system,
base::Bind(&MojoCdm::OnCdmInitialized, base::Unretained(this)));
}
-// TODO(xhwang): Properly handle CDM calls after connection error.
-// See http://crbug.com/671362
void MojoCdm::OnConnectionError(uint32_t custom_reason,
const std::string& description) {
LOG(ERROR) << "Remote CDM connection error: custom_reason=" << custom_reason
<< ", description=\"" << description << "\"";
DCHECK(thread_checker_.CalledOnValidThread());
+ remote_cdm_.reset();
+
// Handle initial connection error.
if (pending_init_promise_) {
DCHECK(!cdm_session_tracker_.HasRemainingSessions());
@@ -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();
xhwang 2016/12/14 18:43:54 Thanks, I think you already fixed the second probl
jrummell 2016/12/15 21:53:56 Done.
cdm_session_tracker_.CloseRemainingSessions(session_closed_cb_);
}
@@ -148,9 +144,16 @@ void MojoCdm::SetServerCertificate(const std::vector<uint8_t>& certificate,
DVLOG(2) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
+ if (!remote_cdm_) {
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0,
+ "CDM connection lost.");
+ 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(
@@ -161,10 +164,17 @@ void MojoCdm::CreateSessionAndGenerateRequest(
DVLOG(2) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
+ if (!remote_cdm_) {
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0,
+ "CDM connection lost.");
+ 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(SessionType session_type,
@@ -173,10 +183,16 @@ void MojoCdm::LoadSession(SessionType session_type,
DVLOG(2) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
- remote_cdm_->LoadSession(
- session_type, session_id,
- base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, base::Unretained(this),
- base::Passed(&promise)));
+ if (!remote_cdm_) {
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0,
+ "CDM connection lost.");
+ return;
+ }
+
+ 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,
@@ -185,10 +201,16 @@ void MojoCdm::UpdateSession(const std::string& session_id,
DVLOG(2) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
- remote_cdm_->UpdateSession(
- session_id, response,
- base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, base::Unretained(this),
- base::Passed(&promise)));
+ if (!remote_cdm_) {
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0,
+ "CDM connection lost.");
+ return;
+ }
+
+ 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,
@@ -196,9 +218,16 @@ void MojoCdm::CloseSession(const std::string& session_id,
DVLOG(2) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
- remote_cdm_->CloseSession(
- session_id, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult,
- base::Unretained(this), base::Passed(&promise)));
+ if (!remote_cdm_) {
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0,
+ "CDM connection lost.");
+ return;
+ }
+
+ 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,
@@ -206,9 +235,16 @@ void MojoCdm::RemoveSession(const std::string& session_id,
DVLOG(2) << __func__;
DCHECK(thread_checker_.CalledOnValidThread());
- remote_cdm_->RemoveSession(
- session_id, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult,
- base::Unretained(this), base::Passed(&promise)));
+ if (!remote_cdm_) {
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0,
+ "CDM connection lost.");
+ return;
+ }
+
+ 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() {
@@ -305,7 +341,8 @@ 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);
return;
}
@@ -330,24 +367,28 @@ void MojoCdm::OnKeyAdded() {
decryptor_->OnKeyAdded();
}
-void MojoCdm::OnSimpleCdmPromiseResult(
- std::unique_ptr<SimpleCdmPromise> promise,
- mojom::CdmPromiseResultPtr result) {
- if (result->success)
- promise->resolve();
- else
- RejectPromise(std::move(promise), std::move(result));
+void MojoCdm::OnSimpleCdmPromiseResult(uint32_t promise_id,
+ mojom::CdmPromiseResultPtr result) {
+ if (result->success) {
+ 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

Powered by Google App Engine
This is Rietveld 408576698