Chromium Code Reviews| Index: content/browser/media/cdm/browser_cdm_manager.cc |
| diff --git a/content/browser/media/cdm/browser_cdm_manager.cc b/content/browser/media/cdm/browser_cdm_manager.cc |
| index 813a8bad696cee98598b8fccdf1463d40e6b1a97..19f8a97c4308212e69de7808afc83245d2a1d496 100644 |
| --- a/content/browser/media/cdm/browser_cdm_manager.cc |
| +++ b/content/browser/media/cdm/browser_cdm_manager.cc |
| @@ -177,8 +177,10 @@ bool BrowserCdmManager::OnMessageReceived(const IPC::Message& msg) { |
| IPC_MESSAGE_HANDLER(CdmHostMsg_SetServerCertificate, OnSetServerCertificate) |
| IPC_MESSAGE_HANDLER(CdmHostMsg_CreateSessionAndGenerateRequest, |
| OnCreateSessionAndGenerateRequest) |
| + IPC_MESSAGE_HANDLER(CdmHostMsg_LoadSession, OnLoadSession) |
| IPC_MESSAGE_HANDLER(CdmHostMsg_UpdateSession, OnUpdateSession) |
| IPC_MESSAGE_HANDLER(CdmHostMsg_CloseSession, OnCloseSession) |
| + IPC_MESSAGE_HANDLER(CdmHostMsg_RemoveSession, OnRemoveSession) |
| IPC_MESSAGE_HANDLER(CdmHostMsg_DestroyCdm, OnDestroyCdm) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| @@ -334,15 +336,14 @@ void BrowserCdmManager::OnSetServerCertificate( |
| } |
| void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
| - int render_frame_id, |
| - int cdm_id, |
| - uint32_t promise_id, |
| - CdmHostMsg_CreateSession_InitDataType init_data_type, |
| - const std::vector<uint8>& init_data) { |
| + const CdmHostMsg_CreateSessionAndGenerateRequest_Params& params) { |
| DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| + int render_frame_id = params.render_frame_id; |
| + int cdm_id = params.cdm_id; |
| + const std::vector<uint8>& init_data = params.init_data; |
| scoped_ptr<NewSessionPromise> promise( |
| - new NewSessionPromise(this, render_frame_id, cdm_id, promise_id)); |
| + new NewSessionPromise(this, render_frame_id, cdm_id, params.promise_id)); |
| if (init_data.size() > media::limits::kMaxInitDataLength) { |
| LOG(WARNING) << "InitData for ID: " << cdm_id |
| @@ -352,7 +353,7 @@ void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
| } |
| #if defined(OS_ANDROID) |
| // 'webm' initData is a single key ID. On Android the length is restricted. |
| - if (init_data_type == INIT_DATA_TYPE_WEBM && |
| + if (params.init_data_type == INIT_DATA_TYPE_WEBM && |
| init_data.size() != kAndroidKeyIdBytes) { |
| promise->reject(MediaKeys::INVALID_ACCESS_ERROR, 0, |
| "'webm' initData is not the correct length."); |
| @@ -361,7 +362,7 @@ void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
| #endif |
| media::EmeInitDataType eme_init_data_type; |
| - switch (init_data_type) { |
| + switch (params.init_data_type) { |
| case INIT_DATA_TYPE_WEBM: |
| eme_init_data_type = media::EmeInitDataType::WEBM; |
| break; |
| @@ -387,8 +388,33 @@ void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
| CheckPermissionStatus( |
| render_frame_id, cdm_id, |
| base::Bind(&BrowserCdmManager::CreateSessionAndGenerateRequestIfPermitted, |
| - this, render_frame_id, cdm_id, eme_init_data_type, init_data, |
| - base::Passed(&promise))); |
| + this, render_frame_id, cdm_id, params.session_type, |
| + eme_init_data_type, init_data, base::Passed(&promise))); |
| +} |
| + |
| +void BrowserCdmManager::OnLoadSession( |
| + int render_frame_id, |
| + int cdm_id, |
| + uint32_t promise_id, |
| + media::MediaKeys::SessionType session_type, |
| + const std::string& session_id) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| + |
| + scoped_ptr<NewSessionPromise> promise( |
| + new NewSessionPromise(this, render_frame_id, cdm_id, promise_id)); |
| + |
| + BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); |
| + if (!cdm) { |
| + DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; |
| + promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "CDM not found."); |
| + return; |
| + } |
| + |
| + CheckPermissionStatus( |
| + render_frame_id, cdm_id, |
| + base::Bind(&BrowserCdmManager::LoadSessionIfPermitted, |
| + this, render_frame_id, cdm_id, session_type, |
| + session_id, base::Passed(&promise))); |
| } |
| void BrowserCdmManager::OnUpdateSession(int render_frame_id, |
| @@ -440,6 +466,24 @@ void BrowserCdmManager::OnCloseSession(int render_frame_id, |
| cdm->CloseSession(session_id, promise.Pass()); |
| } |
| +void BrowserCdmManager::OnRemoveSession(int render_frame_id, |
| + int cdm_id, |
| + uint32_t promise_id, |
| + const std::string& session_id) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| + |
| + scoped_ptr<SimplePromise> promise( |
| + new SimplePromise(this, render_frame_id, cdm_id, promise_id)); |
| + |
| + BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); |
| + if (!cdm) { |
| + promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "CDM not found."); |
| + return; |
| + } |
| + |
| + cdm->RemoveSession(session_id, promise.Pass()); |
| +} |
| + |
| void BrowserCdmManager::OnDestroyCdm(int render_frame_id, int cdm_id) { |
| DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| RemoveCdm(GetId(render_frame_id, cdm_id)); |
| @@ -562,6 +606,7 @@ void BrowserCdmManager::CheckPermissionStatusOnUIThread( |
| void BrowserCdmManager::CreateSessionAndGenerateRequestIfPermitted( |
| int render_frame_id, |
| int cdm_id, |
| + media::MediaKeys::SessionType session_type, |
| media::EmeInitDataType init_data_type, |
| const std::vector<uint8>& init_data, |
| scoped_ptr<media::NewSessionCdmPromise> promise, |
| @@ -579,11 +624,31 @@ void BrowserCdmManager::CreateSessionAndGenerateRequestIfPermitted( |
| return; |
| } |
| - // Only the temporary session type is supported in browser CDM path. |
| - // TODO(xhwang): Add SessionType support if needed. |
| - cdm->CreateSessionAndGenerateRequest(media::MediaKeys::TEMPORARY_SESSION, |
| - init_data_type, init_data, |
| - promise.Pass()); |
| + cdm->CreateSessionAndGenerateRequest(session_type, init_data_type, |
| + init_data, promise.Pass()); |
| +} |
| + |
| +void BrowserCdmManager::LoadSessionIfPermitted( |
| + int render_frame_id, |
| + int cdm_id, |
| + media::MediaKeys::SessionType session_type, |
| + const std::string& session_id, |
| + scoped_ptr<media::NewSessionCdmPromise> promise, |
| + bool permission_was_allowed) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| + |
|
ddorwin
2015/05/28 23:51:50
Should we DCHECK session_type != temporary?
Or, DC
gunsch
2015/05/28 23:59:12
Done.
|
| + if (!permission_was_allowed) { |
| + promise->reject(MediaKeys::NOT_SUPPORTED_ERROR, 0, "Permission denied."); |
| + return; |
| + } |
| + |
| + BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); |
| + if (!cdm) { |
| + promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "CDM not found."); |
| + return; |
| + } |
| + |
| + cdm->LoadSession(session_type, session_id, promise.Pass()); |
|
ddorwin
2015/05/28 23:51:50
Blink checks the session type, right?
MediaDrmBri
gunsch
2015/05/28 23:59:12
Sure, promises were already rejected but NOTREACHE
|
| } |
| } // namespace content |