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..1c16e1d52177d150f20deec5c842857eb1b9e1a2 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); |
+ CreateSessionAndGenerateRequestIfPermitted( |
+ render_frame_id, cdm_id, eme_init_data_type, init_data, promise.Pass(), |
+ true /* allowed */); |
return; |
} |
#endif |
@@ -379,17 +383,11 @@ void BrowserCdmManager::OnCreateSessionAndGenerateRequest( |
return; |
} |
- std::map<uint64, GURL>::const_iterator iter = |
- 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."); |
- 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, cdm_id, |
+ base::Bind(&BrowserCdmManager::CreateSessionAndGenerateRequestIfPermitted, |
+ this, render_frame_id, cdm_id, eme_init_data_type, init_data, |
+ base::Passed(&promise))); |
} |
void BrowserCdmManager::OnUpdateSession(int render_frame_id, |
@@ -397,6 +395,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 +425,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 +440,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 +493,70 @@ 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) { |
+ const PermissionStatusCB& permission_status_cb) { |
+ // Always called on |task_runner_|, which may not be on the UI thread. |
+ DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ GURL security_origin; |
+ std::map<uint64, GURL>::const_iterator iter = |
+ cdm_security_origin_map_.find(GetId(render_frame_id, cdm_id)); |
+ DCHECK(iter != cdm_security_origin_map_.end()); |
+ if (iter != cdm_security_origin_map_.end()) |
+ security_origin = iter->second; |
+ |
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowserCdmManager::RequestSessionPermission, this, |
- render_frame_id, security_origin, cdm_id, init_data_type, |
- init_data, base::Passed(&promise))); |
- return; |
+ base::Bind(&BrowserCdmManager::CheckPermissionStatusOnUIThread, this, |
+ render_frame_id, security_origin, permission_status_cb)); |
+ } else { |
+ CheckPermissionStatusOnUIThread(render_frame_id, security_origin, |
+ permission_status_cb); |
} |
+} |
+ |
+// Note: This function runs on the UI thread, which may be different from |
+// |task_runner_|. Be careful about thread safety! |
+void BrowserCdmManager::CheckPermissionStatusOnUIThread( |
+ int render_frame_id, |
+ const GURL& security_origin, |
+ const base::Callback<void(bool)>& permission_status_cb) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
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))); |
-} |
- |
-void BrowserCdmManager::GenerateRequestIfPermitted( |
+ 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); |
+ |
+ bool allowed = (permission_status == PERMISSION_STATUS_GRANTED); |
+ if (!task_runner_->RunsTasksOnCurrentThread()) { |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(permission_status_cb, allowed)); |
+ } else { |
+ permission_status_cb.Run(allowed); |
+ } |
+} |
+ |
+void BrowserCdmManager::CreateSessionAndGenerateRequestIfPermitted( |
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) { |
+ bool permission_was_allowed) { |
+ DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ if (!permission_was_allowed) { |
promise->reject(MediaKeys::NOT_SUPPORTED_ERROR, 0, "Permission denied."); |
return; |
} |