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