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..494149e9c0963e5856abe3fc8d4e5ee3a2fee638 100644 |
--- a/media/mojo/clients/mojo_cdm.cc |
+++ b/media/mojo/clients/mojo_cdm.cc |
@@ -122,14 +122,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()); |
@@ -148,6 +148,12 @@ 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; |
+ } |
+ |
remote_cdm_->SetServerCertificate( |
certificate, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
base::Unretained(this), base::Passed(&promise))); |
@@ -161,6 +167,12 @@ 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; |
+ } |
+ |
remote_cdm_->CreateSessionAndGenerateRequest( |
session_type, init_data_type, init_data, |
base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, base::Unretained(this), |
@@ -173,6 +185,12 @@ void MojoCdm::LoadSession(SessionType session_type, |
DVLOG(2) << __func__; |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!remote_cdm_) { |
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0, |
+ "CDM connection lost."); |
+ return; |
+ } |
+ |
remote_cdm_->LoadSession( |
session_type, session_id, |
base::Bind(&MojoCdm::OnNewSessionCdmPromiseResult, base::Unretained(this), |
@@ -185,6 +203,12 @@ void MojoCdm::UpdateSession(const std::string& session_id, |
DVLOG(2) << __func__; |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!remote_cdm_) { |
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0, |
+ "CDM connection lost."); |
+ return; |
+ } |
+ |
remote_cdm_->UpdateSession( |
session_id, response, |
base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, base::Unretained(this), |
@@ -196,6 +220,12 @@ void MojoCdm::CloseSession(const std::string& session_id, |
DVLOG(2) << __func__; |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!remote_cdm_) { |
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0, |
+ "CDM connection lost."); |
+ return; |
+ } |
+ |
remote_cdm_->CloseSession( |
session_id, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
base::Unretained(this), base::Passed(&promise))); |
@@ -206,6 +236,12 @@ void MojoCdm::RemoveSession(const std::string& session_id, |
DVLOG(2) << __func__; |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!remote_cdm_) { |
+ promise->reject(media::CdmPromise::INVALID_STATE_ERROR, 0, |
+ "CDM connection lost."); |
+ return; |
+ } |
+ |
remote_cdm_->RemoveSession( |
session_id, base::Bind(&MojoCdm::OnSimpleCdmPromiseResult, |
base::Unretained(this), base::Passed(&promise))); |