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..c5b7466787c1a8fe9fde1729021837cd373c1284 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 |
@@ -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, |
@@ -581,9 +626,31 @@ void BrowserCdmManager::CreateSessionAndGenerateRequestIfPermitted( |
// Only the temporary session type is supported in browser CDM path. |
// TODO(xhwang): Add SessionType support if needed. |
xhwang
2015/05/28 23:17:39
Drop this comment now.
gunsch
2015/05/28 23:19:59
Done.
|
- 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()); |
+ |
+ 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()); |
} |
} // namespace content |