Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/media/cdm/browser_cdm_manager.h" | 5 #include "content/browser/media/cdm/browser_cdm_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/task_runner.h" | 10 #include "base/task_runner.h" |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 218 case CREATE_SESSION_TYPE_MP4: | 218 case CREATE_SESSION_TYPE_MP4: |
| 219 mime_type = "video/mp4"; | 219 mime_type = "video/mp4"; |
| 220 break; | 220 break; |
| 221 default: | 221 default: |
| 222 NOTREACHED(); | 222 NOTREACHED(); |
| 223 return; | 223 return; |
| 224 } | 224 } |
| 225 | 225 |
| 226 #if defined(OS_ANDROID) | 226 #if defined(OS_ANDROID) |
| 227 if (CommandLine::ForCurrentProcess() | 227 if (CommandLine::ForCurrentProcess() |
| 228 ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) { | 228 ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) { |
|
gunsch
2014/11/17 16:57:33
somewhat related: is there any particular reason t
xhwang
2014/11/17 23:38:17
I guess it's because this flag is only defined on
| |
| 229 CreateSessionIfPermitted( | 229 CreateSessionIfPermitted( |
| 230 render_frame_id, cdm_id, session_id, mime_type, init_data, true); | 230 render_frame_id, cdm_id, session_id, mime_type, init_data, true); |
| 231 return; | 231 return; |
| 232 } | 232 } |
| 233 #endif | 233 #endif |
| 234 | 234 |
| 235 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); | 235 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); |
| 236 if (!cdm) { | 236 if (!cdm) { |
| 237 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; | 237 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; |
| 238 SendSessionError(render_frame_id, cdm_id, session_id); | 238 SendSessionError(render_frame_id, cdm_id, session_id); |
| 239 return; | 239 return; |
| 240 } | 240 } |
| 241 | 241 |
| 242 std::map<uint64, GURL>::const_iterator iter = | 242 std::map<uint64, GURL>::const_iterator iter = |
| 243 cdm_security_origin_map_.find(GetId(render_frame_id, cdm_id)); | 243 cdm_security_origin_map_.find(GetId(render_frame_id, cdm_id)); |
| 244 if (iter == cdm_security_origin_map_.end()) { | 244 if (iter == cdm_security_origin_map_.end()) { |
| 245 NOTREACHED(); | 245 NOTREACHED(); |
| 246 SendSessionError(render_frame_id, cdm_id, session_id); | 246 SendSessionError(render_frame_id, cdm_id, session_id); |
| 247 return; | 247 return; |
| 248 } | 248 } |
| 249 GURL security_origin = iter->second; | 249 GURL security_origin = iter->second; |
| 250 | 250 |
| 251 RenderFrameHost* rfh = | 251 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 252 RenderFrameHost::FromID(render_process_id_, render_frame_id); | 252 BrowserThread::PostTask( |
| 253 WebContents* web_contents = WebContents::FromRenderFrameHost(rfh); | 253 BrowserThread::UI, |
| 254 DCHECK(web_contents); | 254 FROM_HERE, |
| 255 GetContentClient()->browser()->RequestPermission( | 255 base::Bind(&BrowserCdmManager::RequestSessionPermission, |
| 256 content::PERMISSION_PROTECTED_MEDIA, | 256 this, |
| 257 web_contents, | 257 render_frame_id, |
| 258 0, // bridge id | 258 security_origin, |
| 259 security_origin, | 259 cdm_id, |
| 260 // Only implemented for Android infobars which do not support | 260 session_id, |
| 261 // user gestures. | 261 mime_type, |
| 262 true, | 262 init_data)); |
| 263 base::Bind(&BrowserCdmManager::CreateSessionIfPermitted, | 263 return; |
| 264 this, | 264 } |
| 265 render_frame_id, | 265 RequestSessionPermission(render_frame_id, |
| 266 cdm_id, | 266 security_origin, |
| 267 session_id, | 267 cdm_id, |
| 268 mime_type, | 268 session_id, |
| 269 init_data)); | 269 mime_type, |
| 270 init_data); | |
|
xhwang
2014/11/17 23:38:17
Can you do the thread check and post within Reques
gunsch
2014/11/19 21:59:01
Done.
| |
| 270 } | 271 } |
| 271 | 272 |
| 272 void BrowserCdmManager::OnUpdateSession( | 273 void BrowserCdmManager::OnUpdateSession( |
| 273 int render_frame_id, | 274 int render_frame_id, |
| 274 int cdm_id, | 275 int cdm_id, |
| 275 uint32 session_id, | 276 uint32 session_id, |
| 276 const std::vector<uint8>& response) { | 277 const std::vector<uint8>& response) { |
| 277 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); | 278 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); |
| 278 if (!cdm) { | 279 if (!cdm) { |
| 279 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; | 280 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 350 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 350 | 351 |
| 351 cdm_map_.erase(id); | 352 cdm_map_.erase(id); |
| 352 cdm_security_origin_map_.erase(id); | 353 cdm_security_origin_map_.erase(id); |
| 353 if (cdm_cancel_permission_map_.count(id)) { | 354 if (cdm_cancel_permission_map_.count(id)) { |
| 354 cdm_cancel_permission_map_[id].Run(); | 355 cdm_cancel_permission_map_[id].Run(); |
| 355 cdm_cancel_permission_map_.erase(id); | 356 cdm_cancel_permission_map_.erase(id); |
| 356 } | 357 } |
| 357 } | 358 } |
| 358 | 359 |
| 360 void BrowserCdmManager::RequestSessionPermission( | |
| 361 int render_frame_id, | |
| 362 const GURL& security_origin, | |
| 363 int cdm_id, | |
| 364 uint32 session_id, | |
| 365 const std::string& content_type, | |
| 366 const std::vector<uint8>& init_data) { | |
| 367 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
|
xhwang
2014/11/17 23:38:17
See comment above. Check thread and post RequestSe
gunsch
2014/11/19 21:59:01
Done.
| |
| 368 RenderFrameHost* rfh = | |
| 369 RenderFrameHost::FromID(render_process_id_, render_frame_id); | |
| 370 WebContents* web_contents = WebContents::FromRenderFrameHost(rfh); | |
| 371 DCHECK(web_contents); | |
| 372 GetContentClient()->browser()->RequestPermission( | |
| 373 content::PERMISSION_PROTECTED_MEDIA, | |
| 374 web_contents, | |
| 375 0, // bridge id | |
| 376 security_origin, | |
| 377 // Only implemented for Android infobars which do not support | |
| 378 // user gestures. | |
| 379 true, | |
| 380 base::Bind(&BrowserCdmManager::CreateSessionIfPermitted, | |
| 381 this, | |
| 382 render_frame_id, | |
| 383 cdm_id, | |
| 384 session_id, | |
| 385 content_type, | |
| 386 init_data)); | |
| 387 } | |
| 388 | |
| 359 void BrowserCdmManager::CreateSessionIfPermitted( | 389 void BrowserCdmManager::CreateSessionIfPermitted( |
| 360 int render_frame_id, | 390 int render_frame_id, |
| 361 int cdm_id, | 391 int cdm_id, |
| 362 uint32 session_id, | 392 uint32 session_id, |
| 363 const std::string& content_type, | 393 const std::string& content_type, |
| 364 const std::vector<uint8>& init_data, | 394 const std::vector<uint8>& init_data, |
| 365 bool permitted) { | 395 bool permitted) { |
| 366 cdm_cancel_permission_map_.erase(GetId(render_frame_id, cdm_id)); | 396 cdm_cancel_permission_map_.erase(GetId(render_frame_id, cdm_id)); |
| 367 if (!permitted) { | 397 if (!permitted) { |
| 368 SendSessionError(render_frame_id, cdm_id, session_id); | 398 SendSessionError(render_frame_id, cdm_id, session_id); |
| 369 return; | 399 return; |
| 370 } | 400 } |
| 371 | 401 |
| 372 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); | 402 BrowserCdm* cdm = GetCdm(render_frame_id, cdm_id); |
| 373 if (!cdm) { | 403 if (!cdm) { |
| 374 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; | 404 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; |
| 375 SendSessionError(render_frame_id, cdm_id, session_id); | 405 SendSessionError(render_frame_id, cdm_id, session_id); |
| 376 return; | 406 return; |
| 377 } | 407 } |
| 378 | 408 |
| 379 // This could fail, in which case a SessionError will be fired. | 409 // This could fail, in which case a SessionError will be fired. |
| 380 cdm->CreateSession(session_id, content_type, &init_data[0], init_data.size()); | 410 cdm->CreateSession(session_id, content_type, &init_data[0], init_data.size()); |
| 381 } | 411 } |
| 382 | 412 |
| 383 } // namespace content | 413 } // namespace content |
| OLD | NEW |