Chromium Code Reviews| 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 |
| index 47ba3dcae825ff4d475c4dffb98db300cd715799..d62404f597d63db5dd5f17de2b08198cb8a1f83a 100644 |
| --- a/chrome/browser/media/media_capture_devices_dispatcher.cc |
| +++ b/chrome/browser/media/media_capture_devices_dispatcher.cc |
| @@ -42,8 +42,6 @@ |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/media_stream_request.h" |
| #include "extensions/common/constants.h" |
| -#include "extensions/common/extension.h" |
| -#include "extensions/common/permissions/permissions_data.h" |
| #include "media/audio/audio_manager_base.h" |
| #include "media/base/media_switches.h" |
| #include "net/base/net_util.h" |
| @@ -54,13 +52,14 @@ |
| #include "ash/shell.h" |
| #endif // defined(OS_CHROMEOS) |
| - |
| #if defined(ENABLE_EXTENSIONS) |
| #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h" |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "extensions/browser/app_window/app_window.h" |
| #include "extensions/browser/app_window/app_window_registry.h" |
| #include "extensions/browser/extension_system.h" |
| +#include "extensions/common/extension.h" |
| +#include "extensions/common/permissions/permissions_data.h" |
| #endif |
| using content::BrowserThread; |
| @@ -92,6 +91,7 @@ const content::MediaStreamDevice* FindDeviceWithId( |
| return NULL; |
| } |
| +#if defined(ENABLE_EXTENSIONS) |
| // This is a short-term solution to grant camera and/or microphone access to |
| // extensions: |
| // 1. Virtual keyboard extension. |
| @@ -132,6 +132,7 @@ bool IsOriginForCasting(const GURL& origin) { |
| // Google Cast Stable |
| origin.spec() == "chrome-extension://boadgeojelhgndaghljhdicfkmllpafd/"; |
| } |
| +#endif // defined(ENABLE_EXTENSIONS) |
| // Helper to get title of the calling application shown in the screen capture |
| // notification. |
| @@ -140,13 +141,15 @@ base::string16 GetApplicationTitle(content::WebContents* web_contents, |
| // Use extension name as title for extensions and host/origin for drive-by |
| // web. |
| std::string title; |
| +#if defined(ENABLE_EXTENSIONS) |
| if (extension) { |
| title = extension->name(); |
| - } else { |
| - GURL url = web_contents->GetURL(); |
| - title = url.SchemeIsSecure() ? net::GetHostAndOptionalPort(url) |
| - : url.GetOrigin().spec(); |
| + return base::UTF8ToUTF16(title); |
| } |
| +#endif |
| + GURL url = web_contents->GetURL(); |
| + title = url.SchemeIsSecure() ? net::GetHostAndOptionalPort(url) |
| + : url.GetOrigin().spec(); |
| return base::UTF8ToUTF16(title); |
| } |
| @@ -154,7 +157,7 @@ base::string16 GetApplicationTitle(content::WebContents* web_contents, |
| // Registers to display notification if |display_notification| is true. |
| // Returns an instance of MediaStreamUI to be passed to content layer. |
| scoped_ptr<content::MediaStreamUI> GetDevicesForDesktopCapture( |
| - content::MediaStreamDevices& devices, |
| + content::MediaStreamDevices* devices, |
| content::DesktopMediaID media_id, |
| bool capture_audio, |
| bool display_notification, |
| @@ -164,11 +167,11 @@ scoped_ptr<content::MediaStreamUI> GetDevicesForDesktopCapture( |
| scoped_ptr<content::MediaStreamUI> ui; |
| // Add selected desktop source to the list. |
| - devices.push_back(content::MediaStreamDevice( |
| + devices->push_back(content::MediaStreamDevice( |
| content::MEDIA_DESKTOP_VIDEO_CAPTURE, media_id.ToString(), "Screen")); |
| if (capture_audio) { |
| // Use the special loopback device ID for system audio capture. |
| - devices.push_back(content::MediaStreamDevice( |
| + devices->push_back(content::MediaStreamDevice( |
| content::MEDIA_LOOPBACK_AUDIO_CAPTURE, |
| media::AudioManagerBase::kLoopbackInputDeviceId, "System Audio")); |
| } |
| @@ -212,10 +215,10 @@ gfx::NativeWindow FindParentWindowForWebContents( |
| } |
| #endif |
| +#if defined(ENABLE_EXTENSIONS) |
| const extensions::Extension* GetExtensionForOrigin( |
| Profile* profile, |
| const GURL& security_origin) { |
| -#if defined(ENABLE_EXTENSIONS) |
| if (!security_origin.SchemeIs(extensions::kExtensionScheme)) |
| return NULL; |
| @@ -225,10 +228,8 @@ const extensions::Extension* GetExtensionForOrigin( |
| extensions_service->extensions()->GetByID(security_origin.host()); |
| DCHECK(extension); |
| return extension; |
| -#else |
| - return NULL; |
| -#endif |
| } |
| +#endif |
| } // namespace |
| @@ -336,12 +337,18 @@ void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest( |
| request.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE) { |
| ProcessTabCaptureAccessRequest( |
| web_contents, request, callback, extension); |
| - } else if (extension && (extension->is_platform_app() || |
| - IsMediaRequestWhitelistedForExtension(extension))) { |
| - // For extensions access is approved based on extension permissions. |
| - ProcessMediaAccessRequestFromPlatformAppOrExtension( |
| - web_contents, request, callback, extension); |
| } else { |
| +#if defined(ENABLE_EXTENSIONS) |
| + bool is_whitelisted = |
| + extension && (extension->is_platform_app() || |
| + IsMediaRequestWhitelistedForExtension(extension)); |
| + if (is_whitelisted) { |
| + // For extensions access is approved based on extension permissions. |
| + ProcessMediaAccessRequestFromPlatformAppOrExtension( |
| + web_contents, request, callback, extension); |
| + return; |
| + } |
| +#endif |
| ProcessRegularMediaAccessRequest(web_contents, request, callback); |
| } |
| } |
| @@ -355,6 +362,7 @@ bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
| type == content::MEDIA_DEVICE_VIDEO_CAPTURE); |
| Profile* profile = Profile::FromBrowserContext(browser_context); |
| +#if defined(ENABLE_EXTENSIONS) |
| const extensions::Extension* extension = |
| GetExtensionForOrigin(profile, security_origin); |
| @@ -365,6 +373,7 @@ bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
| ? extensions::APIPermission::kAudioCapture |
| : extensions::APIPermission::kVideoCapture); |
| } |
| +#endif |
| if (CheckAllowAllMediaStreamContentForOrigin(profile, security_origin)) |
| return true; |
| @@ -521,7 +530,7 @@ void MediaCaptureDevicesDispatcher::ProcessDesktopCaptureAccessRequest( |
| loopback_audio_supported); |
| ui = GetDevicesForDesktopCapture( |
| - devices, media_id, capture_audio, true, |
| + &devices, media_id, capture_audio, true, |
| GetApplicationTitle(web_contents, extension), |
| base::UTF8ToUTF16(original_extension_name)); |
| @@ -544,14 +553,20 @@ void MediaCaptureDevicesDispatcher::ProcessScreenCaptureAccessRequest( |
| loopback_audio_supported = true; |
| #endif |
| - const bool component_extension = |
| + bool component_extension = false; |
| +#if defined(ENABLE_EXTENSIONS) |
| + component_extension = |
| extension && extension->location() == extensions::Manifest::COMPONENT; |
| +#endif |
| - const bool screen_capture_enabled = |
| - CommandLine::ForCurrentProcess()->HasSwitch( |
| - switches::kEnableUserMediaScreenCapturing) || |
| + bool screen_capture_enabled = |
| + base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableUserMediaScreenCapturing); |
| +#if defined(ENABLE_EXTENSIONS) |
| + screen_capture_enabled |= |
| IsOriginForCasting(request.security_origin) || |
| IsBuiltInExtension(request.security_origin); |
| +#endif |
| const bool origin_is_secure = |
| request.security_origin.SchemeIsSecure() || |
| @@ -589,8 +604,12 @@ void MediaCaptureDevicesDispatcher::ProcessScreenCaptureAccessRequest( |
| // For component extensions, bypass message box. |
| bool user_approved = false; |
| if (!component_extension) { |
| - base::string16 application_name = base::UTF8ToUTF16( |
| - extension ? extension->name() : request.security_origin.spec()); |
| + base::string16 application_name = |
| + base::UTF8ToUTF16(request.security_origin.spec()); |
| +#if defined(ENABLE_EXTENSIONS) |
| + if (extension) |
| + application_name = base::UTF8ToUTF16(extension->name()); |
| +#endif |
| base::string16 confirmation_text = l10n_util::GetStringFUTF16( |
| request.audio_type == content::MEDIA_NO_SERVICE ? |
| IDS_MEDIA_SCREEN_CAPTURE_CONFIRMATION_TEXT : |
| @@ -624,7 +643,7 @@ void MediaCaptureDevicesDispatcher::ProcessScreenCaptureAccessRequest( |
| // display the notification for stream capture. |
| bool display_notification = !component_extension; |
| - ui = GetDevicesForDesktopCapture(devices, screen_id, capture_audio, |
| + ui = GetDevicesForDesktopCapture(&devices, screen_id, capture_audio, |
| display_notification, application_title, |
| application_title); |
| DCHECK(!devices.empty()); |
| @@ -690,6 +709,7 @@ void MediaCaptureDevicesDispatcher::ProcessTabCaptureAccessRequest( |
| #endif // defined(ENABLE_EXTENSIONS) |
| } |
| +#if defined(ENABLE_EXTENSIONS) |
| void MediaCaptureDevicesDispatcher:: |
| ProcessMediaAccessRequestFromPlatformAppOrExtension( |
| content::WebContents* web_contents, |
| @@ -703,14 +723,16 @@ void MediaCaptureDevicesDispatcher:: |
| Profile* profile = |
| Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
| - bool audio_allowed = |
| + bool audio_allowed = false; |
|
vrk (LEFT CHROMIUM)
2014/10/17 19:56:44
nit: looks like these two "audio_allowed"/ "video_
Lei Zhang
2014/10/17 21:44:51
indeed, I had the ifdef inside the function before
|
| + bool video_allowed = false; |
| + audio_allowed = |
| request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE && |
| extension->permissions_data()->HasAPIPermission( |
| extensions::APIPermission::kAudioCapture) && |
| GetDevicePolicy(profile, extension->url(), |
| prefs::kAudioCaptureAllowed, |
| prefs::kAudioCaptureAllowedUrls) != ALWAYS_DENY; |
| - bool video_allowed = |
| + video_allowed = |
| request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE && |
| extension->permissions_data()->HasAPIPermission( |
| extensions::APIPermission::kVideoCapture) && |
| @@ -773,6 +795,7 @@ void MediaCaptureDevicesDispatcher:: |
| callback.Run(devices, result, ui.Pass()); |
| } |
| +#endif |
| void MediaCaptureDevicesDispatcher::ProcessRegularMediaAccessRequest( |
| content::WebContents* web_contents, |