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

Side by Side Diff: content/browser/media/media_devices_permission_checker.cc

Issue 2436113002: Introduce MediaDevicesPermissionChecker. (Closed)
Patch Set: address xhwang's comments Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/media/media_devices_permission_checker.h"
6
7 #include <utility>
8 #include <vector>
9
10 #include "base/bind.h"
11 #include "base/command_line.h"
12 #include "content/browser/frame_host/render_frame_host_delegate.h"
13 #include "content/browser/frame_host/render_frame_host_impl.h"
14 #include "content/common/media/media_devices.h"
15 #include "content/public/browser/browser_context.h"
16 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/render_process_host.h"
18 #include "content/public/common/content_switches.h"
19 #include "url/gurl.h"
20 #include "url/origin.h"
21
22 namespace content {
23
24 namespace {
25
26 MediaDevicesManager::BoolDeviceTypes DoCheckPermissionsOnUIThread(
27 MediaDevicesManager::BoolDeviceTypes requested_device_types,
28 int render_process_id,
29 int render_frame_id,
30 const url::Origin& security_origin) {
31 DCHECK_CURRENTLY_ON(BrowserThread::UI);
32 RenderFrameHostImpl* frame_host =
33 RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
34
35 // If there is no |frame_host|, return false for all permissions.
36 if (!frame_host)
37 return MediaDevicesManager::BoolDeviceTypes();
38
39 RenderFrameHostDelegate* delegate = frame_host->delegate();
40 GURL origin = security_origin.GetURL();
41
42 // Currently, the MEDIA_DEVICE_AUDIO_CAPTURE permission is used for
43 // both audio input and output.
44 // TODO(guidou): use specific permission for audio output when it becomes
45 // available. See http://crbug.com/556542.
46 bool has_audio_permission =
47 (requested_device_types[MEDIA_DEVICE_TYPE_AUDIO_INPUT] ||
48 requested_device_types[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT]) &&
49 delegate->CheckMediaAccessPermission(origin, MEDIA_DEVICE_AUDIO_CAPTURE);
50
51 MediaDevicesManager::BoolDeviceTypes result;
52 result[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = has_audio_permission;
53 result[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = has_audio_permission;
54 result[MEDIA_DEVICE_TYPE_VIDEO_INPUT] =
55 requested_device_types[MEDIA_DEVICE_TYPE_VIDEO_INPUT] &&
56 delegate->CheckMediaAccessPermission(origin, MEDIA_DEVICE_VIDEO_CAPTURE);
57
58 return result;
59 }
60
61 bool CheckSinglePermissionOnUIThread(MediaDeviceType device_type,
62 int render_process_id,
63 int render_frame_id,
64 const url::Origin& security_origin) {
65 DCHECK_CURRENTLY_ON(BrowserThread::UI);
66 MediaDevicesManager::BoolDeviceTypes requested;
67 requested[device_type] = true;
68 MediaDevicesManager::BoolDeviceTypes result = DoCheckPermissionsOnUIThread(
69 requested, render_process_id, render_frame_id, security_origin);
70 return result[device_type];
71 }
72
73 } // namespace
74
75 MediaDevicesPermissionChecker::MediaDevicesPermissionChecker()
76 : use_override_(base::CommandLine::ForCurrentProcess()->HasSwitch(
77 switches::kUseFakeUIForMediaStream)),
78 override_value_(
79 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
80 switches::kUseFakeUIForMediaStream) != "deny") {}
81
82 bool MediaDevicesPermissionChecker::CheckPermissionOnUIThread(
83 MediaDeviceType device_type,
84 int render_process_id,
85 int render_frame_id,
86 const url::Origin& security_origin) {
87 if (use_override_)
88 return override_value_;
89
90 return CheckSinglePermissionOnUIThread(device_type, render_process_id,
91 render_frame_id, security_origin);
92 }
93
94 void MediaDevicesPermissionChecker::CheckPermission(
95 MediaDeviceType device_type,
96 int render_process_id,
97 int render_frame_id,
98 const url::Origin& security_origin,
99 const base::Callback<void(bool)>& callback) {
100 if (use_override_) {
101 callback.Run(override_value_);
102 return;
103 }
104
105 BrowserThread::PostTaskAndReplyWithResult(
106 BrowserThread::UI, FROM_HERE,
107 base::Bind(&CheckSinglePermissionOnUIThread, device_type,
108 render_process_id, render_frame_id, security_origin),
109 callback);
110 }
111
112 MediaDevicesManager::BoolDeviceTypes
113 MediaDevicesPermissionChecker::CheckPermissionsOnUIThread(
114 MediaDevicesManager::BoolDeviceTypes requested_device_types,
115 int render_process_id,
116 int render_frame_id,
117 const url::Origin& security_origin) {
118 if (use_override_) {
119 MediaDevicesManager::BoolDeviceTypes result;
120 result.fill(override_value_);
121 return result;
122 }
123
124 return DoCheckPermissionsOnUIThread(requested_device_types, render_process_id,
125 render_frame_id, security_origin);
126 }
127
128 void MediaDevicesPermissionChecker::CheckPermissions(
129 MediaDevicesManager::BoolDeviceTypes requested,
130 int render_process_id,
131 int render_frame_id,
132 const url::Origin& security_origin,
133 const base::Callback<void(const MediaDevicesManager::BoolDeviceTypes&)>&
134 callback) {
135 if (use_override_) {
136 MediaDevicesManager::BoolDeviceTypes result;
137 result.fill(override_value_);
138 callback.Run(result);
139 return;
140 }
141
142 BrowserThread::PostTaskAndReplyWithResult(
143 BrowserThread::UI, FROM_HERE,
144 base::Bind(&DoCheckPermissionsOnUIThread, requested, render_process_id,
145 render_frame_id, security_origin),
146 callback);
147 }
148
149 void MediaDevicesPermissionChecker::OverridePermissionsForTesting(
150 bool override_value) {
151 use_override_ = true;
152 override_value_ = override_value;
153 }
154
155 } // namespace content
OLDNEW
« 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