| 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(); |
| 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 |