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 1b78ba3c095c64e01b55f4ccb297918ea186bc22..0d8e9393ade86896e98122d4deff4df629c89ee8 100644 |
| --- a/content/browser/media/cdm/browser_cdm_manager.cc |
| +++ b/content/browser/media/cdm/browser_cdm_manager.cc |
| @@ -311,6 +311,8 @@ void BrowserCdmManager::OnSetServerCertificate( |
| int cdm_id, |
| uint32_t promise_id, |
| const std::vector<uint8_t>& certificate) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| + |
| scoped_ptr<SimplePromise> promise( |
| new SimplePromise(this, render_frame_id, cdm_id, promise_id)); |
| @@ -335,6 +337,8 @@ void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
| uint32_t promise_id, |
| CdmHostMsg_CreateSession_InitDataType init_data_type, |
| const std::vector<uint8>& init_data) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| + |
| scoped_ptr<NewSessionPromise> promise( |
| new NewSessionPromise(this, render_frame_id, cdm_id, promise_id)); |
| @@ -365,9 +369,9 @@ void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
| #if defined(OS_ANDROID) |
| if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kDisableInfobarForProtectedMediaIdentifier)) { |
| - GenerateRequestIfPermitted( |
| - render_frame_id, cdm_id, eme_init_data_type, |
| - init_data, promise.Pass(), PERMISSION_STATUS_GRANTED); |
| + CreateSessionAndGenerateRequest(render_frame_id, cdm_id, eme_init_data_type, |
| + init_data, promise.Pass(), |
| + PERMISSION_STATUS_GRANTED); |
| return; |
| } |
| #endif |
| @@ -383,13 +387,13 @@ void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
| cdm_security_origin_map_.find(GetId(render_frame_id, cdm_id)); |
| if (iter == cdm_security_origin_map_.end()) { |
| NOTREACHED(); |
| - promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "CDM not found."); |
| + promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "Origin not found."); |
| return; |
| } |
| GURL security_origin = iter->second; |
| - RequestSessionPermission(render_frame_id, security_origin, cdm_id, |
| - eme_init_data_type, init_data, promise.Pass()); |
| + CheckPermissionStatus(render_frame_id, security_origin, cdm_id, |
| + eme_init_data_type, init_data, promise.Pass()); |
| } |
| void BrowserCdmManager::OnUpdateSession(int render_frame_id, |
| @@ -397,6 +401,8 @@ void BrowserCdmManager::OnUpdateSession(int render_frame_id, |
| uint32_t promise_id, |
| const std::string& session_id, |
| const std::vector<uint8>& response) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| + |
| scoped_ptr<SimplePromise> promise( |
| new SimplePromise(this, render_frame_id, cdm_id, promise_id)); |
| @@ -425,6 +431,8 @@ void BrowserCdmManager::OnCloseSession(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)); |
| @@ -438,6 +446,7 @@ void BrowserCdmManager::OnCloseSession(int render_frame_id, |
| } |
| void BrowserCdmManager::OnDestroyCdm(int render_frame_id, int cdm_id) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| RemoveCdm(GetId(render_frame_id, cdm_id)); |
| } |
| @@ -490,52 +499,64 @@ void BrowserCdmManager::RemoveCdm(uint64 id) { |
| cdm_map_.erase(id); |
| cdm_security_origin_map_.erase(id); |
| - if (cdm_cancel_permission_map_.count(id)) { |
| - cdm_cancel_permission_map_[id].Run(); |
| - cdm_cancel_permission_map_.erase(id); |
| - } |
| } |
| -void BrowserCdmManager::RequestSessionPermission( |
| +void BrowserCdmManager::CheckPermissionStatus( |
| int render_frame_id, |
| const GURL& security_origin, |
| int cdm_id, |
| media::EmeInitDataType init_data_type, |
| const std::vector<uint8>& init_data, |
| scoped_ptr<media::NewSessionCdmPromise> promise) { |
| + DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
|
ddorwin
2015/03/16 23:58:28
This seems inconsistent with the need for line 514
xhwang
2015/03/17 01:25:22
|task_runner_| is not always on the UI thread. Add
|
| + |
| + // RenderFrameHost::FromID() can only be called from the UI thread. |
| if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, |
| - base::Bind(&BrowserCdmManager::RequestSessionPermission, this, |
| + base::Bind(&BrowserCdmManager::CheckPermissionStatus, this, |
| render_frame_id, security_origin, cdm_id, init_data_type, |
| init_data, base::Passed(&promise))); |
| return; |
| } |
| + // Note: This part of code may not run on the |task_runner_|. Be careful |
| + // about thread safty! |
| + |
| RenderFrameHost* rfh = |
| RenderFrameHost::FromID(render_process_id_, render_frame_id); |
| WebContents* web_contents = WebContents::FromRenderFrameHost(rfh); |
| - DCHECK(web_contents); |
| - GetContentClient()->browser()->RequestPermission( |
| - content::PERMISSION_PROTECTED_MEDIA_IDENTIFIER, web_contents, |
| - 0, // bridge id |
| - security_origin, |
| - // Only implemented for Android infobars which do not support |
| - // user gestures. |
| - true, base::Bind(&BrowserCdmManager::GenerateRequestIfPermitted, this, |
| - render_frame_id, cdm_id, init_data_type, init_data, |
| - base::Passed(&promise))); |
| + |
| + GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); |
| + |
| + PermissionStatus permission_status = |
| + GetContentClient()->browser()->GetPermissionStatus( |
| + content::PERMISSION_PROTECTED_MEDIA_IDENTIFIER, |
| + web_contents->GetBrowserContext(), security_origin, embedding_origin); |
| + |
| + CreateSessionAndGenerateRequest(render_frame_id, cdm_id, init_data_type, |
|
ddorwin
2015/03/16 23:58:28
It seems odd to do this inside CheckPermissionStat
xhwang
2015/03/17 01:25:22
Good point. Updated.
|
| + init_data, promise.Pass(), permission_status); |
| } |
| -void BrowserCdmManager::GenerateRequestIfPermitted( |
| +void BrowserCdmManager::CreateSessionAndGenerateRequest( |
| int render_frame_id, |
| int cdm_id, |
| media::EmeInitDataType init_data_type, |
| const std::vector<uint8>& init_data, |
| scoped_ptr<media::NewSessionCdmPromise> promise, |
| - PermissionStatus permission) { |
| - cdm_cancel_permission_map_.erase(GetId(render_frame_id, cdm_id)); |
| - if (permission != PERMISSION_STATUS_GRANTED) { |
| + PermissionStatus permission_status) { |
| + // Make sure cdm->CreateSessionAndGenerateRequest() is called on the |
| + // |task_runner_|. |
| + if (!task_runner_->RunsTasksOnCurrentThread()) { |
| + task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&BrowserCdmManager::CreateSessionAndGenerateRequest, this, |
| + render_frame_id, cdm_id, init_data_type, init_data, |
| + base::Passed(&promise), permission_status)); |
| + return; |
| + } |
| + |
| + if (permission_status != PERMISSION_STATUS_GRANTED) { |
|
ddorwin
2015/03/16 23:58:28
Why do we do this here? Probably because GenerateR
xhwang
2015/03/17 01:25:22
Done.
|
| promise->reject(MediaKeys::NOT_SUPPORTED_ERROR, 0, "Permission denied."); |
| return; |
| } |