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 1db0f885648aa47237340cd8d58ce54dea3f901d..ea6f3a692f46588499189c69529733fcaaf84051 100644 |
--- a/chrome/browser/media/media_capture_devices_dispatcher.cc |
+++ b/chrome/browser/media/media_capture_devices_dispatcher.cc |
@@ -15,8 +15,12 @@ |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/content_settings/content_settings_provider.h" |
+#include "chrome/browser/content_settings/host_content_settings_map.h" |
+#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/media/desktop_streams_registry.h" |
#include "chrome/browser/media/media_stream_capture_indicator.h" |
+#include "chrome/browser/media/media_stream_devices_util.h" |
#include "chrome/browser/media/media_stream_infobar_delegate.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/browser.h" |
@@ -40,6 +44,7 @@ |
#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/browser/extension_system.h" |
#include "extensions/common/constants.h" |
#include "extensions/common/extension.h" |
#include "extensions/common/permissions/permissions_data.h" |
@@ -250,6 +255,20 @@ gfx::NativeWindow FindParentWindowForWebContents( |
} |
#endif |
+const extensions::Extension* GetExtensionForOrigin( |
+ Profile* profile, |
+ const GURL& security_origin) { |
+ if (!security_origin.SchemeIs(extensions::kExtensionScheme)) |
perkj_chrome
2014/08/28 15:09:40
Should this be CHECK( ?
Henrik Grunell
2014/08/29 07:59:09
No, it may or may not be an extension. If not, it'
|
+ return NULL; |
+ |
+ ExtensionService* extensions_service = |
+ extensions::ExtensionSystem::Get(profile)->extension_service(); |
+ const extensions::Extension* extension = |
+ extensions_service->extensions()->GetByID(security_origin.host()); |
+ DCHECK(extension); |
+ return extension; |
+} |
+ |
} // namespace |
MediaCaptureDevicesDispatcher::PendingAccessRequest::PendingAccessRequest( |
@@ -371,6 +390,54 @@ void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest( |
} |
} |
+bool MediaCaptureDevicesDispatcher::CheckMediaAccessPermission( |
+ content::BrowserContext* browser_context, |
+ const GURL& security_origin, |
+ content::MediaStreamType type) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(type == content::MEDIA_DEVICE_AUDIO_CAPTURE || |
+ type == content::MEDIA_DEVICE_VIDEO_CAPTURE); |
+ |
+ Profile* profile = Profile::FromBrowserContext(browser_context); |
+ const extensions::Extension* extension = |
+ GetExtensionForOrigin(profile, security_origin); |
+ |
+ if (extension && (extension->is_platform_app() || |
+ IsMediaRequestWhitelistedForExtension(extension))) { |
+ return extension->permissions_data()->HasAPIPermission( |
+ type == content::MEDIA_DEVICE_AUDIO_CAPTURE |
+ ? extensions::APIPermission::kAudioCapture |
+ : extensions::APIPermission::kVideoCapture); |
+ } else { |
perkj_chrome
2014/08/28 15:09:40
no need for else since you return above.
Henrik Grunell
2014/08/29 07:59:09
Done.
|
+ if (ShouldAlwaysAllowOrigin(profile, security_origin)) |
+ return true; |
+ |
+ const char* policy_name = type == content::MEDIA_DEVICE_AUDIO_CAPTURE |
+ ? prefs::kAudioCaptureAllowed |
+ : prefs::kVideoCaptureAllowed; |
+ const char* list_policy_name = type == content::MEDIA_DEVICE_AUDIO_CAPTURE |
+ ? prefs::kAudioCaptureAllowedUrls |
+ : prefs::kVideoCaptureAllowedUrls; |
+ if (GetDevicePolicy( |
+ profile, security_origin, policy_name, list_policy_name) == |
+ ALWAYS_ALLOW) { |
+ return true; |
+ } |
+ |
+ if (profile->GetHostContentSettingsMap()->GetContentSetting( |
+ security_origin, |
perkj_chrome
2014/08/28 15:09:40
same parameter twice? Why ? please comment in code
Henrik Grunell
2014/08/29 07:59:09
Done.
|
+ security_origin, |
+ type == content::MEDIA_DEVICE_AUDIO_CAPTURE |
+ ? CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC |
+ : CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, |
+ NO_RESOURCE_IDENTIFIER) == CONTENT_SETTING_ALLOW) { |
+ return true; |
+ } |
+ |
+ return false; |
+ } |
+} |
+ |
void MediaCaptureDevicesDispatcher::ProcessDesktopCaptureAccessRequest( |
content::WebContents* web_contents, |
const content::MediaStreamRequest& request, |