| 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/memory/ptr_util.h" |
| 9 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
| 10 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 13 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 14 #include "chrome/browser/media/media_access_handler.h" | 15 #include "chrome/browser/media/media_access_handler.h" |
| 15 #include "chrome/browser/media/webrtc/desktop_streams_registry.h" | 16 #include "chrome/browser/media/webrtc/desktop_streams_registry.h" |
| 16 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" | 17 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" |
| 17 #include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h" | 18 #include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 } | 82 } |
| 82 | 83 |
| 83 MediaCaptureDevicesDispatcher::MediaCaptureDevicesDispatcher() | 84 MediaCaptureDevicesDispatcher::MediaCaptureDevicesDispatcher() |
| 84 : is_device_enumeration_disabled_(false), | 85 : is_device_enumeration_disabled_(false), |
| 85 media_stream_capture_indicator_(new MediaStreamCaptureIndicator()) { | 86 media_stream_capture_indicator_(new MediaStreamCaptureIndicator()) { |
| 86 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 87 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 87 | 88 |
| 88 #if BUILDFLAG(ENABLE_EXTENSIONS) | 89 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 89 #if defined(OS_CHROMEOS) | 90 #if defined(OS_CHROMEOS) |
| 90 // Wrapper around ExtensionMediaAccessHandler used in Public Sessions. | 91 // Wrapper around ExtensionMediaAccessHandler used in Public Sessions. |
| 91 media_access_handlers_.push_back(new PublicSessionMediaAccessHandler()); | 92 media_access_handlers_.push_back( |
| 93 base::MakeUnique<PublicSessionMediaAccessHandler>()); |
| 92 #else | 94 #else |
| 93 media_access_handlers_.push_back(new ExtensionMediaAccessHandler()); | 95 media_access_handlers_.push_back( |
| 96 base::MakeUnique<ExtensionMediaAccessHandler>()); |
| 94 #endif | 97 #endif |
| 95 media_access_handlers_.push_back(new DesktopCaptureAccessHandler()); | 98 media_access_handlers_.push_back( |
| 99 base::MakeUnique<DesktopCaptureAccessHandler>()); |
| 96 #if defined(OS_CHROMEOS) | 100 #if defined(OS_CHROMEOS) |
| 97 // Wrapper around TabCaptureAccessHandler used in Public Sessions. | 101 // Wrapper around TabCaptureAccessHandler used in Public Sessions. |
| 98 media_access_handlers_.push_back(new PublicSessionTabCaptureAccessHandler()); | 102 media_access_handlers_.push_back( |
| 103 base::MakeUnique<PublicSessionTabCaptureAccessHandler>()); |
| 99 #else | 104 #else |
| 100 media_access_handlers_.push_back(new TabCaptureAccessHandler()); | 105 media_access_handlers_.push_back(base::MakeUnique<TabCaptureAccessHandler>()); |
| 101 #endif | 106 #endif |
| 102 #endif | 107 #endif |
| 103 media_access_handlers_.push_back(new PermissionBubbleMediaAccessHandler()); | 108 media_access_handlers_.push_back( |
| 109 base::MakeUnique<PermissionBubbleMediaAccessHandler>()); |
| 104 } | 110 } |
| 105 | 111 |
| 106 MediaCaptureDevicesDispatcher::~MediaCaptureDevicesDispatcher() {} | 112 MediaCaptureDevicesDispatcher::~MediaCaptureDevicesDispatcher() {} |
| 107 | 113 |
| 108 void MediaCaptureDevicesDispatcher::RegisterProfilePrefs( | 114 void MediaCaptureDevicesDispatcher::RegisterProfilePrefs( |
| 109 user_prefs::PrefRegistrySyncable* registry) { | 115 user_prefs::PrefRegistrySyncable* registry) { |
| 110 registry->RegisterStringPref(prefs::kDefaultAudioCaptureDevice, | 116 registry->RegisterStringPref(prefs::kDefaultAudioCaptureDevice, |
| 111 std::string()); | 117 std::string()); |
| 112 registry->RegisterStringPref(prefs::kDefaultVideoCaptureDevice, | 118 registry->RegisterStringPref(prefs::kDefaultVideoCaptureDevice, |
| 113 std::string()); | 119 std::string()); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 return MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices(); | 157 return MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices(); |
| 152 } | 158 } |
| 153 | 159 |
| 154 void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest( | 160 void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest( |
| 155 content::WebContents* web_contents, | 161 content::WebContents* web_contents, |
| 156 const content::MediaStreamRequest& request, | 162 const content::MediaStreamRequest& request, |
| 157 const content::MediaResponseCallback& callback, | 163 const content::MediaResponseCallback& callback, |
| 158 const extensions::Extension* extension) { | 164 const extensions::Extension* extension) { |
| 159 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 165 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 160 | 166 |
| 161 for (MediaAccessHandler* handler : media_access_handlers_) { | 167 for (const auto& handler : media_access_handlers_) { |
| 162 if (handler->SupportsStreamType(request.video_type, extension) || | 168 if (handler->SupportsStreamType(request.video_type, extension) || |
| 163 handler->SupportsStreamType(request.audio_type, extension)) { | 169 handler->SupportsStreamType(request.audio_type, extension)) { |
| 164 handler->HandleRequest(web_contents, request, callback, extension); | 170 handler->HandleRequest(web_contents, request, callback, extension); |
| 165 return; | 171 return; |
| 166 } | 172 } |
| 167 } | 173 } |
| 168 callback.Run(content::MediaStreamDevices(), | 174 callback.Run(content::MediaStreamDevices(), |
| 169 content::MEDIA_DEVICE_NOT_SUPPORTED, nullptr); | 175 content::MEDIA_DEVICE_NOT_SUPPORTED, nullptr); |
| 170 } | 176 } |
| 171 | 177 |
| 172 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( | 178 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
| 173 content::WebContents* web_contents, | 179 content::WebContents* web_contents, |
| 174 const GURL& security_origin, | 180 const GURL& security_origin, |
| 175 content::MediaStreamType type) { | 181 content::MediaStreamType type) { |
| 176 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 182 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 177 return CheckMediaAccessPermission(web_contents, security_origin, type, | 183 return CheckMediaAccessPermission(web_contents, security_origin, type, |
| 178 nullptr); | 184 nullptr); |
| 179 } | 185 } |
| 180 | 186 |
| 181 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( | 187 bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
| 182 content::WebContents* web_contents, | 188 content::WebContents* web_contents, |
| 183 const GURL& security_origin, | 189 const GURL& security_origin, |
| 184 content::MediaStreamType type, | 190 content::MediaStreamType type, |
| 185 const extensions::Extension* extension) { | 191 const extensions::Extension* extension) { |
| 186 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 192 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 187 for (MediaAccessHandler* handler : media_access_handlers_) { | 193 for (const auto& handler : media_access_handlers_) { |
| 188 if (handler->SupportsStreamType(type, extension)) { | 194 if (handler->SupportsStreamType(type, extension)) { |
| 189 return handler->CheckMediaAccessPermission(web_contents, security_origin, | 195 return handler->CheckMediaAccessPermission(web_contents, security_origin, |
| 190 type, extension); | 196 type, extension); |
| 191 } | 197 } |
| 192 } | 198 } |
| 193 return false; | 199 return false; |
| 194 } | 200 } |
| 195 | 201 |
| 196 void MediaCaptureDevicesDispatcher::GetDefaultDevicesForProfile( | 202 void MediaCaptureDevicesDispatcher::GetDefaultDevicesForProfile( |
| 197 Profile* profile, | 203 Profile* profile, |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 observer.OnUpdateVideoDevices(devices); | 354 observer.OnUpdateVideoDevices(devices); |
| 349 } | 355 } |
| 350 | 356 |
| 351 void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( | 357 void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( |
| 352 int render_process_id, | 358 int render_process_id, |
| 353 int render_frame_id, | 359 int render_frame_id, |
| 354 int page_request_id, | 360 int page_request_id, |
| 355 const GURL& security_origin, | 361 const GURL& security_origin, |
| 356 content::MediaStreamType stream_type, | 362 content::MediaStreamType stream_type, |
| 357 content::MediaRequestState state) { | 363 content::MediaRequestState state) { |
| 358 for (MediaAccessHandler* handler : media_access_handlers_) { | 364 for (const auto& handler : media_access_handlers_) { |
| 359 if (handler->SupportsStreamType(stream_type, nullptr)) { | 365 if (handler->SupportsStreamType(stream_type, nullptr)) { |
| 360 handler->UpdateMediaRequestState(render_process_id, render_frame_id, | 366 handler->UpdateMediaRequestState(render_process_id, render_frame_id, |
| 361 page_request_id, stream_type, state); | 367 page_request_id, stream_type, state); |
| 362 break; | 368 break; |
| 363 } | 369 } |
| 364 } | 370 } |
| 365 | 371 |
| 366 #if defined(OS_CHROMEOS) | 372 #if defined(OS_CHROMEOS) |
| 367 if (IsOriginForCasting(security_origin) && IsVideoMediaType(stream_type)) { | 373 if (IsOriginForCasting(security_origin) && IsVideoMediaType(stream_type)) { |
| 368 // Notify ash that casting state has changed. | 374 // Notify ash that casting state has changed. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 386 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 392 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 387 for (auto& observer : observers_) | 393 for (auto& observer : observers_) |
| 388 observer.OnCreatingAudioStream(render_process_id, render_frame_id); | 394 observer.OnCreatingAudioStream(render_process_id, render_frame_id); |
| 389 } | 395 } |
| 390 | 396 |
| 391 bool MediaCaptureDevicesDispatcher::IsInsecureCapturingInProgress( | 397 bool MediaCaptureDevicesDispatcher::IsInsecureCapturingInProgress( |
| 392 int render_process_id, | 398 int render_process_id, |
| 393 int render_frame_id) { | 399 int render_frame_id) { |
| 394 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 400 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 395 #if BUILDFLAG(ENABLE_EXTENSIONS) | 401 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 396 for (MediaAccessHandler* handler : media_access_handlers_) { | 402 for (const auto& handler : media_access_handlers_) { |
| 397 if (handler->SupportsStreamType(content::MEDIA_DESKTOP_VIDEO_CAPTURE, | 403 if (handler->SupportsStreamType(content::MEDIA_DESKTOP_VIDEO_CAPTURE, |
| 398 nullptr) || | 404 nullptr) || |
| 399 handler->SupportsStreamType(content::MEDIA_TAB_VIDEO_CAPTURE, | 405 handler->SupportsStreamType(content::MEDIA_TAB_VIDEO_CAPTURE, |
| 400 nullptr)) { | 406 nullptr)) { |
| 401 if (ToCaptureAccessHandlerBase(handler)->IsInsecureCapturingInProgress( | 407 if (ToCaptureAccessHandlerBase(handler.get()) |
| 402 render_process_id, render_frame_id)) | 408 ->IsInsecureCapturingInProgress(render_process_id, |
| 409 render_frame_id)) |
| 403 return true; | 410 return true; |
| 404 } | 411 } |
| 405 } | 412 } |
| 406 #endif | 413 #endif |
| 407 return false; | 414 return false; |
| 408 } | 415 } |
| 409 | 416 |
| 410 void MediaCaptureDevicesDispatcher::SetTestAudioCaptureDevices( | 417 void MediaCaptureDevicesDispatcher::SetTestAudioCaptureDevices( |
| 411 const MediaStreamDevices& devices) { | 418 const MediaStreamDevices& devices) { |
| 412 test_audio_devices_ = devices; | 419 test_audio_devices_ = devices; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 440 int render_frame_id, | 447 int render_frame_id, |
| 441 int page_request_id, | 448 int page_request_id, |
| 442 content::MediaStreamType stream_type, | 449 content::MediaStreamType stream_type, |
| 443 bool is_secure) { | 450 bool is_secure) { |
| 444 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 451 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 445 if (stream_type != content::MEDIA_TAB_VIDEO_CAPTURE && | 452 if (stream_type != content::MEDIA_TAB_VIDEO_CAPTURE && |
| 446 stream_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) | 453 stream_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) |
| 447 return; | 454 return; |
| 448 | 455 |
| 449 #if BUILDFLAG(ENABLE_EXTENSIONS) | 456 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 450 for (MediaAccessHandler* handler : media_access_handlers_) { | 457 for (const auto& handler : media_access_handlers_) { |
| 451 if (handler->SupportsStreamType(stream_type, nullptr)) { | 458 if (handler->SupportsStreamType(stream_type, nullptr)) { |
| 452 ToCaptureAccessHandlerBase(handler)->UpdateCapturingLinkSecured( | 459 ToCaptureAccessHandlerBase(handler.get()) |
| 453 render_process_id, render_frame_id, page_request_id, is_secure); | 460 ->UpdateCapturingLinkSecured(render_process_id, render_frame_id, |
| 461 page_request_id, is_secure); |
| 454 break; | 462 break; |
| 455 } | 463 } |
| 456 } | 464 } |
| 457 #endif | 465 #endif |
| 458 } | 466 } |
| OLD | NEW |