Index: chrome/browser/media/media_capture_devices_dispatcher.cc |
diff --git a/chrome/browser/media/media_capture_devices_dispatcher.cc b/chrome/browser/media/media_capture_devices_dispatcher.cc |
deleted file mode 100644 |
index adea25bdd4b46b61af1a074afcb9b3539b530cd7..0000000000000000000000000000000000000000 |
--- a/chrome/browser/media/media_capture_devices_dispatcher.cc |
+++ /dev/null |
@@ -1,443 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/media/media_capture_devices_dispatcher.h" |
- |
-#include "base/command_line.h" |
-#include "base/logging.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "build/build_config.h" |
-#include "chrome/browser/media/desktop_streams_registry.h" |
-#include "chrome/browser/media/media_access_handler.h" |
-#include "chrome/browser/media/media_stream_capture_indicator.h" |
-#include "chrome/browser/media/permission_bubble_media_access_handler.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
-#include "components/pref_registry/pref_registry_syncable.h" |
-#include "components/prefs/pref_service.h" |
-#include "components/prefs/scoped_user_pref_update.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/media_capture_devices.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/render_frame_host.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/common/media_stream_request.h" |
-#include "extensions/common/constants.h" |
-#include "media/base/media_switches.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "ash/shell.h" |
-#endif // defined(OS_CHROMEOS) |
- |
-#if defined(ENABLE_EXTENSIONS) |
-#include "chrome/browser/media/desktop_capture_access_handler.h" |
-#include "chrome/browser/media/extension_media_access_handler.h" |
-#include "chrome/browser/media/tab_capture_access_handler.h" |
-#include "extensions/browser/extension_registry.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/permissions/permissions_data.h" |
-#endif |
- |
-using content::BrowserThread; |
-using content::MediaCaptureDevices; |
-using content::MediaStreamDevices; |
- |
-namespace { |
- |
-// Finds a device in |devices| that has |device_id|, or NULL if not found. |
-const content::MediaStreamDevice* FindDeviceWithId( |
- const content::MediaStreamDevices& devices, |
- const std::string& device_id) { |
- content::MediaStreamDevices::const_iterator iter = devices.begin(); |
- for (; iter != devices.end(); ++iter) { |
- if (iter->id == device_id) { |
- return &(*iter); |
- } |
- } |
- return NULL; |
-} |
- |
-#if defined(ENABLE_EXTENSIONS) |
-inline CaptureAccessHandlerBase* ToCaptureAccessHandlerBase( |
- MediaAccessHandler* handler) { |
- return static_cast<CaptureAccessHandlerBase*>(handler); |
-} |
-#endif |
-} // namespace |
- |
-MediaCaptureDevicesDispatcher* MediaCaptureDevicesDispatcher::GetInstance() { |
- return base::Singleton<MediaCaptureDevicesDispatcher>::get(); |
-} |
- |
-MediaCaptureDevicesDispatcher::MediaCaptureDevicesDispatcher() |
- : is_device_enumeration_disabled_(false), |
- media_stream_capture_indicator_(new MediaStreamCaptureIndicator()) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
-#if defined(ENABLE_EXTENSIONS) |
- media_access_handlers_.push_back(new ExtensionMediaAccessHandler()); |
- media_access_handlers_.push_back(new DesktopCaptureAccessHandler()); |
- media_access_handlers_.push_back(new TabCaptureAccessHandler()); |
-#endif |
- media_access_handlers_.push_back(new PermissionBubbleMediaAccessHandler()); |
-} |
- |
-MediaCaptureDevicesDispatcher::~MediaCaptureDevicesDispatcher() {} |
- |
-void MediaCaptureDevicesDispatcher::RegisterProfilePrefs( |
- user_prefs::PrefRegistrySyncable* registry) { |
- registry->RegisterStringPref(prefs::kDefaultAudioCaptureDevice, |
- std::string()); |
- registry->RegisterStringPref(prefs::kDefaultVideoCaptureDevice, |
- std::string()); |
-} |
- |
-bool MediaCaptureDevicesDispatcher::IsOriginForCasting(const GURL& origin) { |
- // Whitelisted tab casting extensions. |
- return |
- // Dev |
- origin.spec() == "chrome-extension://enhhojjnijigcajfphajepfemndkmdlo/" || |
- // Canary |
- origin.spec() == "chrome-extension://hfaagokkkhdbgiakmmlclaapfelnkoah/" || |
- // Beta (internal) |
- origin.spec() == "chrome-extension://fmfcbgogabcbclcofgocippekhfcmgfj/" || |
- // Google Cast Beta |
- origin.spec() == "chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm/" || |
- // Google Cast Stable |
- origin.spec() == "chrome-extension://boadgeojelhgndaghljhdicfkmllpafd/" || |
- // http://crbug.com/457908 |
- origin.spec() == "chrome-extension://ekpaaapppgpmolpcldedioblbkmijaca/" || |
- // http://crbug.com/574889 |
- origin.spec() == "chrome-extension://pkedcjkdefgpdelpbcmbmeomcjbeemfm/"; |
-} |
- |
-void MediaCaptureDevicesDispatcher::AddObserver(Observer* observer) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (!observers_.HasObserver(observer)) |
- observers_.AddObserver(observer); |
-} |
- |
-void MediaCaptureDevicesDispatcher::RemoveObserver(Observer* observer) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- observers_.RemoveObserver(observer); |
-} |
- |
-const MediaStreamDevices& |
-MediaCaptureDevicesDispatcher::GetAudioCaptureDevices() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (is_device_enumeration_disabled_ || !test_audio_devices_.empty()) |
- return test_audio_devices_; |
- |
- return MediaCaptureDevices::GetInstance()->GetAudioCaptureDevices(); |
-} |
- |
-const MediaStreamDevices& |
-MediaCaptureDevicesDispatcher::GetVideoCaptureDevices() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (is_device_enumeration_disabled_ || !test_video_devices_.empty()) |
- return test_video_devices_; |
- |
- return MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices(); |
-} |
- |
-void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest( |
- content::WebContents* web_contents, |
- const content::MediaStreamRequest& request, |
- const content::MediaResponseCallback& callback, |
- const extensions::Extension* extension) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
- for (MediaAccessHandler* handler : media_access_handlers_) { |
- if (handler->SupportsStreamType(request.video_type, extension) || |
- handler->SupportsStreamType(request.audio_type, extension)) { |
- handler->HandleRequest(web_contents, request, callback, extension); |
- return; |
- } |
- } |
- callback.Run(content::MediaStreamDevices(), |
- content::MEDIA_DEVICE_NOT_SUPPORTED, nullptr); |
-} |
- |
-bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
- content::WebContents* web_contents, |
- const GURL& security_origin, |
- content::MediaStreamType type) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- return CheckMediaAccessPermission(web_contents, security_origin, type, |
- nullptr); |
-} |
- |
-bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
- content::WebContents* web_contents, |
- const GURL& security_origin, |
- content::MediaStreamType type, |
- const extensions::Extension* extension) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- for (MediaAccessHandler* handler : media_access_handlers_) { |
- if (handler->SupportsStreamType(type, extension)) { |
- return handler->CheckMediaAccessPermission(web_contents, security_origin, |
- type, extension); |
- } |
- } |
- return false; |
-} |
- |
-void MediaCaptureDevicesDispatcher::GetDefaultDevicesForProfile( |
- Profile* profile, |
- bool audio, |
- bool video, |
- content::MediaStreamDevices* devices) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- DCHECK(audio || video); |
- |
- PrefService* prefs = profile->GetPrefs(); |
- std::string default_device; |
- if (audio) { |
- default_device = prefs->GetString(prefs::kDefaultAudioCaptureDevice); |
- const content::MediaStreamDevice* device = |
- GetRequestedAudioDevice(default_device); |
- if (!device) |
- device = GetFirstAvailableAudioDevice(); |
- if (device) |
- devices->push_back(*device); |
- } |
- |
- if (video) { |
- default_device = prefs->GetString(prefs::kDefaultVideoCaptureDevice); |
- const content::MediaStreamDevice* device = |
- GetRequestedVideoDevice(default_device); |
- if (!device) |
- device = GetFirstAvailableVideoDevice(); |
- if (device) |
- devices->push_back(*device); |
- } |
-} |
- |
-const content::MediaStreamDevice* |
-MediaCaptureDevicesDispatcher::GetRequestedAudioDevice( |
- const std::string& requested_audio_device_id) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- const content::MediaStreamDevices& audio_devices = GetAudioCaptureDevices(); |
- const content::MediaStreamDevice* const device = |
- FindDeviceWithId(audio_devices, requested_audio_device_id); |
- return device; |
-} |
- |
-const content::MediaStreamDevice* |
-MediaCaptureDevicesDispatcher::GetFirstAvailableAudioDevice() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- const content::MediaStreamDevices& audio_devices = GetAudioCaptureDevices(); |
- if (audio_devices.empty()) |
- return NULL; |
- return &(*audio_devices.begin()); |
-} |
- |
-const content::MediaStreamDevice* |
-MediaCaptureDevicesDispatcher::GetRequestedVideoDevice( |
- const std::string& requested_video_device_id) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- const content::MediaStreamDevices& video_devices = GetVideoCaptureDevices(); |
- const content::MediaStreamDevice* const device = |
- FindDeviceWithId(video_devices, requested_video_device_id); |
- return device; |
-} |
- |
-const content::MediaStreamDevice* |
-MediaCaptureDevicesDispatcher::GetFirstAvailableVideoDevice() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- const content::MediaStreamDevices& video_devices = GetVideoCaptureDevices(); |
- if (video_devices.empty()) |
- return NULL; |
- return &(*video_devices.begin()); |
-} |
- |
-void MediaCaptureDevicesDispatcher::DisableDeviceEnumerationForTesting() { |
- is_device_enumeration_disabled_ = true; |
-} |
- |
-scoped_refptr<MediaStreamCaptureIndicator> |
-MediaCaptureDevicesDispatcher::GetMediaStreamCaptureIndicator() { |
- return media_stream_capture_indicator_; |
-} |
- |
-DesktopStreamsRegistry* |
-MediaCaptureDevicesDispatcher::GetDesktopStreamsRegistry() { |
- if (!desktop_streams_registry_) |
- desktop_streams_registry_.reset(new DesktopStreamsRegistry()); |
- return desktop_streams_registry_.get(); |
-} |
- |
-void MediaCaptureDevicesDispatcher::OnAudioCaptureDevicesChanged() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind( |
- &MediaCaptureDevicesDispatcher::NotifyAudioDevicesChangedOnUIThread, |
- base::Unretained(this))); |
-} |
- |
-void MediaCaptureDevicesDispatcher::OnVideoCaptureDevicesChanged() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind( |
- &MediaCaptureDevicesDispatcher::NotifyVideoDevicesChangedOnUIThread, |
- base::Unretained(this))); |
-} |
- |
-void MediaCaptureDevicesDispatcher::OnMediaRequestStateChanged( |
- int render_process_id, |
- int render_frame_id, |
- int page_request_id, |
- const GURL& security_origin, |
- content::MediaStreamType stream_type, |
- content::MediaRequestState state) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind( |
- &MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread, |
- base::Unretained(this), render_process_id, render_frame_id, |
- page_request_id, security_origin, stream_type, state)); |
-} |
- |
-void MediaCaptureDevicesDispatcher::OnCreatingAudioStream( |
- int render_process_id, |
- int render_frame_id) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind( |
- &MediaCaptureDevicesDispatcher::OnCreatingAudioStreamOnUIThread, |
- base::Unretained(this), render_process_id, render_frame_id)); |
-} |
- |
-void MediaCaptureDevicesDispatcher::NotifyAudioDevicesChangedOnUIThread() { |
- MediaStreamDevices devices = GetAudioCaptureDevices(); |
- FOR_EACH_OBSERVER(Observer, observers_, |
- OnUpdateAudioDevices(devices)); |
-} |
- |
-void MediaCaptureDevicesDispatcher::NotifyVideoDevicesChangedOnUIThread() { |
- MediaStreamDevices devices = GetVideoCaptureDevices(); |
- FOR_EACH_OBSERVER(Observer, observers_, |
- OnUpdateVideoDevices(devices)); |
-} |
- |
-void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( |
- int render_process_id, |
- int render_frame_id, |
- int page_request_id, |
- const GURL& security_origin, |
- content::MediaStreamType stream_type, |
- content::MediaRequestState state) { |
- for (MediaAccessHandler* handler : media_access_handlers_) { |
- if (handler->SupportsStreamType(stream_type, nullptr)) { |
- handler->UpdateMediaRequestState(render_process_id, render_frame_id, |
- page_request_id, stream_type, state); |
- break; |
- } |
- } |
- |
-#if defined(OS_CHROMEOS) |
- if (IsOriginForCasting(security_origin) && IsVideoMediaType(stream_type)) { |
- // Notify ash that casting state has changed. |
- if (state == content::MEDIA_REQUEST_STATE_DONE) { |
- ash::Shell::GetInstance()->OnCastingSessionStartedOrStopped(true); |
- } else if (state == content::MEDIA_REQUEST_STATE_CLOSING) { |
- ash::Shell::GetInstance()->OnCastingSessionStartedOrStopped(false); |
- } |
- } |
-#endif |
- |
- FOR_EACH_OBSERVER(Observer, observers_, |
- OnRequestUpdate(render_process_id, |
- render_frame_id, |
- stream_type, |
- state)); |
-} |
- |
-void MediaCaptureDevicesDispatcher::OnCreatingAudioStreamOnUIThread( |
- int render_process_id, |
- int render_frame_id) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- FOR_EACH_OBSERVER(Observer, observers_, |
- OnCreatingAudioStream(render_process_id, render_frame_id)); |
-} |
- |
-bool MediaCaptureDevicesDispatcher::IsInsecureCapturingInProgress( |
- int render_process_id, |
- int render_frame_id) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
-#if defined(ENABLE_EXTENSIONS) |
- for (MediaAccessHandler* handler : media_access_handlers_) { |
- if (handler->SupportsStreamType(content::MEDIA_DESKTOP_VIDEO_CAPTURE, |
- nullptr) || |
- handler->SupportsStreamType(content::MEDIA_TAB_VIDEO_CAPTURE, |
- nullptr)) { |
- if (ToCaptureAccessHandlerBase(handler)->IsInsecureCapturingInProgress( |
- render_process_id, render_frame_id)) |
- return true; |
- } |
- } |
-#endif |
- return false; |
-} |
- |
-void MediaCaptureDevicesDispatcher::SetTestAudioCaptureDevices( |
- const MediaStreamDevices& devices) { |
- test_audio_devices_ = devices; |
-} |
- |
-void MediaCaptureDevicesDispatcher::SetTestVideoCaptureDevices( |
- const MediaStreamDevices& devices) { |
- test_video_devices_ = devices; |
-} |
- |
-void MediaCaptureDevicesDispatcher::OnSetCapturingLinkSecured( |
- int render_process_id, |
- int render_frame_id, |
- int page_request_id, |
- content::MediaStreamType stream_type, |
- bool is_secure) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (stream_type != content::MEDIA_TAB_VIDEO_CAPTURE && |
- stream_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) |
- return; |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&MediaCaptureDevicesDispatcher::UpdateCapturingLinkSecured, |
- base::Unretained(this), render_process_id, render_frame_id, |
- page_request_id, stream_type, is_secure)); |
-} |
- |
-void MediaCaptureDevicesDispatcher::UpdateCapturingLinkSecured( |
- int render_process_id, |
- int render_frame_id, |
- int page_request_id, |
- content::MediaStreamType stream_type, |
- bool is_secure) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (stream_type != content::MEDIA_TAB_VIDEO_CAPTURE && |
- stream_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) |
- return; |
- |
-#if defined(ENABLE_EXTENSIONS) |
- for (MediaAccessHandler* handler : media_access_handlers_) { |
- if (handler->SupportsStreamType(stream_type, nullptr)) { |
- ToCaptureAccessHandlerBase(handler)->UpdateCapturingLinkSecured( |
- render_process_id, render_frame_id, page_request_id, is_secure); |
- break; |
- } |
- } |
-#endif |
-} |