| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" | 5 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "content/public/browser/web_contents.h" | 31 #include "content/public/browser/web_contents.h" |
| 32 #include "content/public/common/media_stream_request.h" | 32 #include "content/public/common/media_stream_request.h" |
| 33 #include "extensions/common/constants.h" | 33 #include "extensions/common/constants.h" |
| 34 #include "extensions/features/features.h" | 34 #include "extensions/features/features.h" |
| 35 #include "media/base/media_switches.h" | 35 #include "media/base/media_switches.h" |
| 36 | 36 |
| 37 #if defined(OS_CHROMEOS) | 37 #if defined(OS_CHROMEOS) |
| 38 #include "ash/shell.h" | 38 #include "ash/shell.h" |
| 39 #include "chrome/browser/media/public_session_media_access_handler.h" | 39 #include "chrome/browser/media/public_session_media_access_handler.h" |
| 40 #include "chrome/browser/media/public_session_tab_capture_access_handler.h" | 40 #include "chrome/browser/media/public_session_tab_capture_access_handler.h" |
| 41 #include "chrome/browser/media/saml_media_access_handler.h" |
| 41 #endif // defined(OS_CHROMEOS) | 42 #endif // defined(OS_CHROMEOS) |
| 42 | 43 |
| 43 #if BUILDFLAG(ENABLE_EXTENSIONS) | 44 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 44 #include "chrome/browser/media/extension_media_access_handler.h" | 45 #include "chrome/browser/media/extension_media_access_handler.h" |
| 45 #include "chrome/browser/media/webrtc/desktop_capture_access_handler.h" | 46 #include "chrome/browser/media/webrtc/desktop_capture_access_handler.h" |
| 46 #include "chrome/browser/media/webrtc/tab_capture_access_handler.h" | 47 #include "chrome/browser/media/webrtc/tab_capture_access_handler.h" |
| 47 #include "extensions/browser/extension_registry.h" | 48 #include "extensions/browser/extension_registry.h" |
| 48 #include "extensions/common/extension.h" | 49 #include "extensions/common/extension.h" |
| 49 #include "extensions/common/permissions/permissions_data.h" | 50 #include "extensions/common/permissions/permissions_data.h" |
| 50 #endif | 51 #endif |
| (...skipping 10 matching lines...) Expand all Loading... |
| 61 const std::string& device_id) { | 62 const std::string& device_id) { |
| 62 content::MediaStreamDevices::const_iterator iter = devices.begin(); | 63 content::MediaStreamDevices::const_iterator iter = devices.begin(); |
| 63 for (; iter != devices.end(); ++iter) { | 64 for (; iter != devices.end(); ++iter) { |
| 64 if (iter->id == device_id) { | 65 if (iter->id == device_id) { |
| 65 return &(*iter); | 66 return &(*iter); |
| 66 } | 67 } |
| 67 } | 68 } |
| 68 return NULL; | 69 return NULL; |
| 69 } | 70 } |
| 70 | 71 |
| 72 content::WebContents* WebContentsFromIds(int render_process_id, |
| 73 int render_frame_id) { |
| 74 return content::WebContents::FromRenderFrameHost( |
| 75 content::RenderFrameHost::FromID(render_process_id, render_frame_id)); |
| 76 } |
| 77 |
| 71 #if BUILDFLAG(ENABLE_EXTENSIONS) | 78 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 72 inline CaptureAccessHandlerBase* ToCaptureAccessHandlerBase( | 79 inline CaptureAccessHandlerBase* ToCaptureAccessHandlerBase( |
| 73 MediaAccessHandler* handler) { | 80 MediaAccessHandler* handler) { |
| 74 return static_cast<CaptureAccessHandlerBase*>(handler); | 81 return static_cast<CaptureAccessHandlerBase*>(handler); |
| 75 } | 82 } |
| 76 #endif | 83 #endif |
| 77 } // namespace | 84 } // namespace |
| 78 | 85 |
| 79 MediaCaptureDevicesDispatcher* MediaCaptureDevicesDispatcher::GetInstance() { | 86 MediaCaptureDevicesDispatcher* MediaCaptureDevicesDispatcher::GetInstance() { |
| 80 return base::Singleton<MediaCaptureDevicesDispatcher>::get(); | 87 return base::Singleton<MediaCaptureDevicesDispatcher>::get(); |
| 81 } | 88 } |
| 82 | 89 |
| 83 MediaCaptureDevicesDispatcher::MediaCaptureDevicesDispatcher() | 90 MediaCaptureDevicesDispatcher::MediaCaptureDevicesDispatcher() |
| 84 : is_device_enumeration_disabled_(false), | 91 : is_device_enumeration_disabled_(false), |
| 85 media_stream_capture_indicator_(new MediaStreamCaptureIndicator()) { | 92 media_stream_capture_indicator_(new MediaStreamCaptureIndicator()) { |
| 86 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 93 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 87 | 94 |
| 88 #if BUILDFLAG(ENABLE_EXTENSIONS) | 95 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 89 #if defined(OS_CHROMEOS) | 96 #if defined(OS_CHROMEOS) |
| 97 media_access_handlers_.push_back(new SamlMediaAccessHandler()); |
| 90 // Wrapper around ExtensionMediaAccessHandler used in Public Sessions. | 98 // Wrapper around ExtensionMediaAccessHandler used in Public Sessions. |
| 91 media_access_handlers_.push_back(new PublicSessionMediaAccessHandler()); | 99 media_access_handlers_.push_back(new PublicSessionMediaAccessHandler()); |
| 92 #else | 100 #else |
| 93 media_access_handlers_.push_back(new ExtensionMediaAccessHandler()); | 101 media_access_handlers_.push_back(new ExtensionMediaAccessHandler()); |
| 94 #endif | 102 #endif |
| 95 media_access_handlers_.push_back(new DesktopCaptureAccessHandler()); | 103 media_access_handlers_.push_back(new DesktopCaptureAccessHandler()); |
| 96 #if defined(OS_CHROMEOS) | 104 #if defined(OS_CHROMEOS) |
| 97 // Wrapper around TabCaptureAccessHandler used in Public Sessions. | 105 // Wrapper around TabCaptureAccessHandler used in Public Sessions. |
| 98 media_access_handlers_.push_back(new PublicSessionTabCaptureAccessHandler()); | 106 media_access_handlers_.push_back(new PublicSessionTabCaptureAccessHandler()); |
| 99 #else | 107 #else |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 } | 160 } |
| 153 | 161 |
| 154 void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest( | 162 void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest( |
| 155 content::WebContents* web_contents, | 163 content::WebContents* web_contents, |
| 156 const content::MediaStreamRequest& request, | 164 const content::MediaStreamRequest& request, |
| 157 const content::MediaResponseCallback& callback, | 165 const content::MediaResponseCallback& callback, |
| 158 const extensions::Extension* extension) { | 166 const extensions::Extension* extension) { |
| 159 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 167 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 160 | 168 |
| 161 for (MediaAccessHandler* handler : media_access_handlers_) { | 169 for (MediaAccessHandler* handler : media_access_handlers_) { |
| 162 if (handler->SupportsStreamType(request.video_type, extension) || | 170 if (handler->SupportsStreamType(web_contents, request.video_type, |
| 163 handler->SupportsStreamType(request.audio_type, extension)) { | 171 extension) || |
| 172 handler->SupportsStreamType(web_contents, request.audio_type, |
| 173 extension)) { |
| 164 handler->HandleRequest(web_contents, request, callback, extension); | 174 handler->HandleRequest(web_contents, request, callback, extension); |
| 165 return; | 175 return; |
| 166 } | 176 } |
| 167 } | 177 } |
| 168 callback.Run(content::MediaStreamDevices(), | 178 callback.Run(content::MediaStreamDevices(), |
| 169 content::MEDIA_DEVICE_NOT_SUPPORTED, nullptr); | 179 content::MEDIA_DEVICE_NOT_SUPPORTED, nullptr); |
| 170 } | 180 } |
| 171 | 181 |
| 172 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( | 182 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
| 173 content::WebContents* web_contents, | 183 content::WebContents* web_contents, |
| 174 const GURL& security_origin, | 184 const GURL& security_origin, |
| 175 content::MediaStreamType type) { | 185 content::MediaStreamType type) { |
| 176 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 186 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 177 return CheckMediaAccessPermission(web_contents, security_origin, type, | 187 return CheckMediaAccessPermission(web_contents, security_origin, type, |
| 178 nullptr); | 188 nullptr); |
| 179 } | 189 } |
| 180 | 190 |
| 181 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( | 191 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
| 182 content::WebContents* web_contents, | 192 content::WebContents* web_contents, |
| 183 const GURL& security_origin, | 193 const GURL& security_origin, |
| 184 content::MediaStreamType type, | 194 content::MediaStreamType type, |
| 185 const extensions::Extension* extension) { | 195 const extensions::Extension* extension) { |
| 186 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 196 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 187 for (MediaAccessHandler* handler : media_access_handlers_) { | 197 for (MediaAccessHandler* handler : media_access_handlers_) { |
| 188 if (handler->SupportsStreamType(type, extension)) { | 198 if (handler->SupportsStreamType(web_contents, type, extension)) { |
| 189 return handler->CheckMediaAccessPermission(web_contents, security_origin, | 199 return handler->CheckMediaAccessPermission(web_contents, security_origin, |
| 190 type, extension); | 200 type, extension); |
| 191 } | 201 } |
| 192 } | 202 } |
| 193 return false; | 203 return false; |
| 194 } | 204 } |
| 195 | 205 |
| 196 void MediaCaptureDevicesDispatcher::GetDefaultDevicesForProfile( | 206 void MediaCaptureDevicesDispatcher::GetDefaultDevicesForProfile( |
| 197 Profile* profile, | 207 Profile* profile, |
| 198 bool audio, | 208 bool audio, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 observer.OnUpdateVideoDevices(devices); | 358 observer.OnUpdateVideoDevices(devices); |
| 349 } | 359 } |
| 350 | 360 |
| 351 void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( | 361 void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( |
| 352 int render_process_id, | 362 int render_process_id, |
| 353 int render_frame_id, | 363 int render_frame_id, |
| 354 int page_request_id, | 364 int page_request_id, |
| 355 const GURL& security_origin, | 365 const GURL& security_origin, |
| 356 content::MediaStreamType stream_type, | 366 content::MediaStreamType stream_type, |
| 357 content::MediaRequestState state) { | 367 content::MediaRequestState state) { |
| 368 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 358 for (MediaAccessHandler* handler : media_access_handlers_) { | 369 for (MediaAccessHandler* handler : media_access_handlers_) { |
| 359 if (handler->SupportsStreamType(stream_type, nullptr)) { | 370 if (handler->SupportsStreamType( |
| 371 WebContentsFromIds(render_process_id, render_frame_id), stream_type, |
| 372 nullptr)) { |
| 360 handler->UpdateMediaRequestState(render_process_id, render_frame_id, | 373 handler->UpdateMediaRequestState(render_process_id, render_frame_id, |
| 361 page_request_id, stream_type, state); | 374 page_request_id, stream_type, state); |
| 362 break; | 375 break; |
| 363 } | 376 } |
| 364 } | 377 } |
| 365 | 378 |
| 366 #if defined(OS_CHROMEOS) | 379 #if defined(OS_CHROMEOS) |
| 367 if (IsOriginForCasting(security_origin) && IsVideoMediaType(stream_type)) { | 380 if (IsOriginForCasting(security_origin) && IsVideoMediaType(stream_type)) { |
| 368 // Notify ash that casting state has changed. | 381 // Notify ash that casting state has changed. |
| 369 if (state == content::MEDIA_REQUEST_STATE_DONE) { | 382 if (state == content::MEDIA_REQUEST_STATE_DONE) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 387 for (auto& observer : observers_) | 400 for (auto& observer : observers_) |
| 388 observer.OnCreatingAudioStream(render_process_id, render_frame_id); | 401 observer.OnCreatingAudioStream(render_process_id, render_frame_id); |
| 389 } | 402 } |
| 390 | 403 |
| 391 bool MediaCaptureDevicesDispatcher::IsInsecureCapturingInProgress( | 404 bool MediaCaptureDevicesDispatcher::IsInsecureCapturingInProgress( |
| 392 int render_process_id, | 405 int render_process_id, |
| 393 int render_frame_id) { | 406 int render_frame_id) { |
| 394 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 407 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 395 #if BUILDFLAG(ENABLE_EXTENSIONS) | 408 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 396 for (MediaAccessHandler* handler : media_access_handlers_) { | 409 for (MediaAccessHandler* handler : media_access_handlers_) { |
| 397 if (handler->SupportsStreamType(content::MEDIA_DESKTOP_VIDEO_CAPTURE, | 410 if (handler->SupportsStreamType( |
| 398 nullptr) || | 411 WebContentsFromIds(render_process_id, render_frame_id), |
| 399 handler->SupportsStreamType(content::MEDIA_TAB_VIDEO_CAPTURE, | 412 content::MEDIA_DESKTOP_VIDEO_CAPTURE, nullptr) || |
| 400 nullptr)) { | 413 handler->SupportsStreamType( |
| 414 WebContentsFromIds(render_process_id, render_frame_id), |
| 415 content::MEDIA_TAB_VIDEO_CAPTURE, nullptr)) { |
| 401 if (ToCaptureAccessHandlerBase(handler)->IsInsecureCapturingInProgress( | 416 if (ToCaptureAccessHandlerBase(handler)->IsInsecureCapturingInProgress( |
| 402 render_process_id, render_frame_id)) | 417 render_process_id, render_frame_id)) |
| 403 return true; | 418 return true; |
| 404 } | 419 } |
| 405 } | 420 } |
| 406 #endif | 421 #endif |
| 407 return false; | 422 return false; |
| 408 } | 423 } |
| 409 | 424 |
| 410 void MediaCaptureDevicesDispatcher::SetTestAudioCaptureDevices( | 425 void MediaCaptureDevicesDispatcher::SetTestAudioCaptureDevices( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 441 int page_request_id, | 456 int page_request_id, |
| 442 content::MediaStreamType stream_type, | 457 content::MediaStreamType stream_type, |
| 443 bool is_secure) { | 458 bool is_secure) { |
| 444 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 459 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 445 if (stream_type != content::MEDIA_TAB_VIDEO_CAPTURE && | 460 if (stream_type != content::MEDIA_TAB_VIDEO_CAPTURE && |
| 446 stream_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) | 461 stream_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) |
| 447 return; | 462 return; |
| 448 | 463 |
| 449 #if BUILDFLAG(ENABLE_EXTENSIONS) | 464 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 450 for (MediaAccessHandler* handler : media_access_handlers_) { | 465 for (MediaAccessHandler* handler : media_access_handlers_) { |
| 451 if (handler->SupportsStreamType(stream_type, nullptr)) { | 466 if (handler->SupportsStreamType( |
| 467 WebContentsFromIds(render_process_id, render_frame_id), stream_type, |
| 468 nullptr)) { |
| 452 ToCaptureAccessHandlerBase(handler)->UpdateCapturingLinkSecured( | 469 ToCaptureAccessHandlerBase(handler)->UpdateCapturingLinkSecured( |
| 453 render_process_id, render_frame_id, page_request_id, is_secure); | 470 render_process_id, render_frame_id, page_request_id, is_secure); |
| 454 break; | 471 break; |
| 455 } | 472 } |
| 456 } | 473 } |
| 457 #endif | 474 #endif |
| 458 } | 475 } |
| OLD | NEW |