Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Unified Diff: content/browser/media/media_devices_permission_checker.cc

Issue 2436113002: Introduce MediaDevicesPermissionChecker. (Closed)
Patch Set: address xhwang's comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/media/media_devices_permission_checker.cc
diff --git a/content/browser/media/media_devices_permission_checker.cc b/content/browser/media/media_devices_permission_checker.cc
new file mode 100644
index 0000000000000000000000000000000000000000..813ba9e66f6928ce4d18815648c940fbf72d47bb
--- /dev/null
+++ b/content/browser/media/media_devices_permission_checker.cc
@@ -0,0 +1,155 @@
+// Copyright 2016 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 "content/browser/media/media_devices_permission_checker.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "content/browser/frame_host/render_frame_host_delegate.h"
+#include "content/browser/frame_host/render_frame_host_impl.h"
+#include "content/common/media/media_devices.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/common/content_switches.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+namespace content {
+
+namespace {
+
+MediaDevicesManager::BoolDeviceTypes DoCheckPermissionsOnUIThread(
+ MediaDevicesManager::BoolDeviceTypes requested_device_types,
+ int render_process_id,
+ int render_frame_id,
+ const url::Origin& security_origin) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ RenderFrameHostImpl* frame_host =
+ RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
+
+ // If there is no |frame_host|, return false for all permissions.
+ if (!frame_host)
+ return MediaDevicesManager::BoolDeviceTypes();
+
+ RenderFrameHostDelegate* delegate = frame_host->delegate();
+ GURL origin = security_origin.GetURL();
+
+ // Currently, the MEDIA_DEVICE_AUDIO_CAPTURE permission is used for
+ // both audio input and output.
+ // TODO(guidou): use specific permission for audio output when it becomes
+ // available. See http://crbug.com/556542.
+ bool has_audio_permission =
+ (requested_device_types[MEDIA_DEVICE_TYPE_AUDIO_INPUT] ||
+ requested_device_types[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT]) &&
+ delegate->CheckMediaAccessPermission(origin, MEDIA_DEVICE_AUDIO_CAPTURE);
+
+ MediaDevicesManager::BoolDeviceTypes result;
+ result[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = has_audio_permission;
+ result[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = has_audio_permission;
+ result[MEDIA_DEVICE_TYPE_VIDEO_INPUT] =
+ requested_device_types[MEDIA_DEVICE_TYPE_VIDEO_INPUT] &&
+ delegate->CheckMediaAccessPermission(origin, MEDIA_DEVICE_VIDEO_CAPTURE);
+
+ return result;
+}
+
+bool CheckSinglePermissionOnUIThread(MediaDeviceType device_type,
+ int render_process_id,
+ int render_frame_id,
+ const url::Origin& security_origin) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ MediaDevicesManager::BoolDeviceTypes requested;
+ requested[device_type] = true;
+ MediaDevicesManager::BoolDeviceTypes result = DoCheckPermissionsOnUIThread(
+ requested, render_process_id, render_frame_id, security_origin);
+ return result[device_type];
+}
+
+} // namespace
+
+MediaDevicesPermissionChecker::MediaDevicesPermissionChecker()
+ : use_override_(base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kUseFakeUIForMediaStream)),
+ override_value_(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kUseFakeUIForMediaStream) != "deny") {}
+
+bool MediaDevicesPermissionChecker::CheckPermissionOnUIThread(
+ MediaDeviceType device_type,
+ int render_process_id,
+ int render_frame_id,
+ const url::Origin& security_origin) {
+ if (use_override_)
+ return override_value_;
+
+ return CheckSinglePermissionOnUIThread(device_type, render_process_id,
+ render_frame_id, security_origin);
+}
+
+void MediaDevicesPermissionChecker::CheckPermission(
+ MediaDeviceType device_type,
+ int render_process_id,
+ int render_frame_id,
+ const url::Origin& security_origin,
+ const base::Callback<void(bool)>& callback) {
+ if (use_override_) {
+ callback.Run(override_value_);
+ return;
+ }
+
+ BrowserThread::PostTaskAndReplyWithResult(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&CheckSinglePermissionOnUIThread, device_type,
+ render_process_id, render_frame_id, security_origin),
+ callback);
+}
+
+MediaDevicesManager::BoolDeviceTypes
+MediaDevicesPermissionChecker::CheckPermissionsOnUIThread(
+ MediaDevicesManager::BoolDeviceTypes requested_device_types,
+ int render_process_id,
+ int render_frame_id,
+ const url::Origin& security_origin) {
+ if (use_override_) {
+ MediaDevicesManager::BoolDeviceTypes result;
+ result.fill(override_value_);
+ return result;
+ }
+
+ return DoCheckPermissionsOnUIThread(requested_device_types, render_process_id,
+ render_frame_id, security_origin);
+}
+
+void MediaDevicesPermissionChecker::CheckPermissions(
+ MediaDevicesManager::BoolDeviceTypes requested,
+ int render_process_id,
+ int render_frame_id,
+ const url::Origin& security_origin,
+ const base::Callback<void(const MediaDevicesManager::BoolDeviceTypes&)>&
+ callback) {
+ if (use_override_) {
+ MediaDevicesManager::BoolDeviceTypes result;
+ result.fill(override_value_);
+ callback.Run(result);
+ return;
+ }
+
+ BrowserThread::PostTaskAndReplyWithResult(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&DoCheckPermissionsOnUIThread, requested, render_process_id,
+ render_frame_id, security_origin),
+ callback);
+}
+
+void MediaDevicesPermissionChecker::OverridePermissionsForTesting(
+ bool override_value) {
+ use_override_ = true;
+ override_value_ = override_value;
+}
+
+} // namespace content
« no previous file with comments | « content/browser/media/media_devices_permission_checker.h ('k') | content/browser/renderer_host/media/audio_renderer_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698