| 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)));
|
|
|