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

Side by Side Diff: chrome/browser/media/media_stream_devices_controller.cc

Issue 1401073002: Add Rappor reporting for grant/deny/cancel/ignore of Mediastream permissions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/media/media_stream_devices_controller.h" 5 #include "chrome/browser/media/media_stream_devices_controller.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/prefs/scoped_user_pref_update.h" 10 #include "base/prefs/scoped_user_pref_update.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 13 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
14 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 14 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
15 #include "chrome/browser/media/media_capture_devices_dispatcher.h" 15 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
16 #include "chrome/browser/media/media_permission.h" 16 #include "chrome/browser/media/media_permission.h"
17 #include "chrome/browser/media/media_stream_capture_indicator.h" 17 #include "chrome/browser/media/media_stream_capture_indicator.h"
18 #include "chrome/browser/media/media_stream_device_permissions.h" 18 #include "chrome/browser/media/media_stream_device_permissions.h"
19 #include "chrome/browser/permissions/permission_context_uma_util.h"
19 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/ui/browser.h" 21 #include "chrome/browser/ui/browser.h"
21 #include "chrome/common/chrome_switches.h" 22 #include "chrome/common/chrome_switches.h"
22 #include "chrome/common/pref_names.h" 23 #include "chrome/common/pref_names.h"
23 #include "chrome/grit/generated_resources.h" 24 #include "chrome/grit/generated_resources.h"
24 #include "components/content_settings/core/browser/host_content_settings_map.h" 25 #include "components/content_settings/core/browser/host_content_settings_map.h"
25 #include "components/content_settings/core/common/content_settings_pattern.h" 26 #include "components/content_settings/core/common/content_settings_pattern.h"
26 #include "components/pref_registry/pref_registry_syncable.h" 27 #include "components/pref_registry/pref_registry_syncable.h"
27 #include "content/public/browser/browser_thread.h" 28 #include "content/public/browser/browser_thread.h"
28 #include "content/public/browser/render_widget_host_view.h" 29 #include "content/public/browser/render_widget_host_view.h"
29 #include "content/public/common/media_stream_request.h" 30 #include "content/public/common/media_stream_request.h"
30 #include "content/public/common/origin_util.h" 31 #include "content/public/common/origin_util.h"
31 #include "extensions/common/constants.h" 32 #include "extensions/common/constants.h"
32 #include "grit/theme_resources.h" 33 #include "grit/theme_resources.h"
33 #include "ui/base/l10n/l10n_util.h" 34 #include "ui/base/l10n/l10n_util.h"
34 35
35 #if defined(OS_ANDROID) 36 #if defined(OS_ANDROID)
36 #include <vector> 37 #include <vector>
37 38
38 #include "chrome/browser/android/preferences/pref_service_bridge.h" 39 #include "chrome/browser/android/preferences/pref_service_bridge.h"
39 #include "chrome/browser/permissions/permission_update_infobar_delegate_android. h" 40 #include "chrome/browser/permissions/permission_update_infobar_delegate_android. h"
40 #include "content/public/browser/android/content_view_core.h" 41 #include "content/public/browser/android/content_view_core.h"
41 #include "ui/android/window_android.h" 42 #include "ui/android/window_android.h"
42 #endif // OS_ANDROID 43 #endif // OS_ANDROID
43 44
44 using content::BrowserThread; 45 using content::BrowserThread;
45 46
46 namespace { 47 namespace {
47 48
48 enum DevicePermissionActions {
49 kAllowHttps = 0,
50 kAllowHttp,
51 kDeny,
52 kCancel,
53 kPermissionActionsMax // Must always be last!
54 };
55
56 // Returns true if the given ContentSettingsType is being requested in 49 // Returns true if the given ContentSettingsType is being requested in
57 // |request|. 50 // |request|.
58 bool ContentTypeIsRequested(ContentSettingsType type, 51 bool ContentTypeIsRequested(ContentSettingsType type,
59 const content::MediaStreamRequest& request) { 52 const content::MediaStreamRequest& request) {
60 if (request.request_type == content::MEDIA_OPEN_DEVICE) 53 if (request.request_type == content::MEDIA_OPEN_DEVICE)
61 return true; 54 return true;
62 55
63 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC) 56 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)
64 return request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE; 57 return request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE;
65 58
66 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) 59 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)
67 return request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE; 60 return request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE;
68 61
69 return false; 62 return false;
70 } 63 }
71 64
65 typedef base::Callback<void(ContentSettingsType, const GURL&)>
66 PermissionActionFunction;
mlamouri (slow - plz ping) 2015/10/21 08:34:08 nit: using PermissionActionCallback = [...];
tsergeant 2015/10/26 03:21:19 Done, thanks.
67
68 // Calls |action_function| for each permission requested by |request|.
69 void RecordPermissionAction(const content::MediaStreamRequest& request,
70 PermissionActionFunction action_function) {
mlamouri (slow - plz ping) 2015/10/21 08:34:08 nit: s/action_function/callback/
tsergeant 2015/10/26 03:21:19 Done
71 if (ContentTypeIsRequested(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
72 request)) {
73 action_function.Run(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
74 request.security_origin);
75 }
76 if (ContentTypeIsRequested(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, request)) {
77 action_function.Run(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
78 request.security_origin);
79 }
80 }
81
72 } // namespace 82 } // namespace
73 83
74 MediaStreamDevicesController::MediaStreamDevicesController( 84 MediaStreamDevicesController::MediaStreamDevicesController(
75 content::WebContents* web_contents, 85 content::WebContents* web_contents,
76 const content::MediaStreamRequest& request, 86 const content::MediaStreamRequest& request,
77 const content::MediaResponseCallback& callback) 87 const content::MediaResponseCallback& callback)
78 : web_contents_(web_contents), 88 : web_contents_(web_contents),
79 request_(request), 89 request_(request),
80 callback_(callback), 90 callback_(callback),
81 persist_permission_changes_(true) { 91 persist_permission_changes_(true) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 return; 127 return;
118 } 128 }
119 #endif 129 #endif
120 130
121 // Otherwise we can run the callback immediately. 131 // Otherwise we can run the callback immediately.
122 RunCallback(old_audio_setting_, old_video_setting_, denial_reason); 132 RunCallback(old_audio_setting_, old_video_setting_, denial_reason);
123 } 133 }
124 134
125 MediaStreamDevicesController::~MediaStreamDevicesController() { 135 MediaStreamDevicesController::~MediaStreamDevicesController() {
126 if (!callback_.is_null()) { 136 if (!callback_.is_null()) {
137 RecordPermissionAction(
138 request_, base::Bind(PermissionContextUmaUtil::PermissionIgnored));
127 callback_.Run(content::MediaStreamDevices(), 139 callback_.Run(content::MediaStreamDevices(),
128 content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN, 140 content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN,
129 scoped_ptr<content::MediaStreamUI>()); 141 scoped_ptr<content::MediaStreamUI>());
130 } 142 }
131 } 143 }
132 144
133 // static 145 // static
134 void MediaStreamDevicesController::RegisterProfilePrefs( 146 void MediaStreamDevicesController::RegisterProfilePrefs(
135 user_prefs::PrefRegistrySyncable* prefs) { 147 user_prefs::PrefRegistrySyncable* prefs) {
136 prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true); 148 prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true);
(...skipping 18 matching lines...) Expand all
155 return old_video_setting_ == CONTENT_SETTING_ASK; 167 return old_video_setting_ == CONTENT_SETTING_ASK;
156 } 168 }
157 169
158 const std::string& MediaStreamDevicesController::GetSecurityOriginSpec() const { 170 const std::string& MediaStreamDevicesController::GetSecurityOriginSpec() const {
159 return request_.security_origin.spec(); 171 return request_.security_origin.spec();
160 } 172 }
161 173
162 void MediaStreamDevicesController::ForcePermissionDeniedTemporarily() { 174 void MediaStreamDevicesController::ForcePermissionDeniedTemporarily() {
163 base::AutoReset<bool> persist_permissions( 175 base::AutoReset<bool> persist_permissions(
164 &persist_permission_changes_, false); 176 &persist_permission_changes_, false);
165 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 177 RecordPermissionAction(
166 kDeny, kPermissionActionsMax); 178 request_, base::Bind(PermissionContextUmaUtil::PermissionDenied));
167 RunCallback(CONTENT_SETTING_BLOCK, 179 RunCallback(CONTENT_SETTING_BLOCK,
168 CONTENT_SETTING_BLOCK, 180 CONTENT_SETTING_BLOCK,
169 content::MEDIA_DEVICE_PERMISSION_DENIED); 181 content::MEDIA_DEVICE_PERMISSION_DENIED);
170 } 182 }
171 183
172 int MediaStreamDevicesController::GetIconId() const { 184 int MediaStreamDevicesController::GetIconId() const {
173 if (IsAskingForVideo()) 185 if (IsAskingForVideo())
174 return IDR_INFOBAR_MEDIA_STREAM_CAMERA; 186 return IDR_INFOBAR_MEDIA_STREAM_CAMERA;
175 187
176 return IDR_INFOBAR_MEDIA_STREAM_MIC; 188 return IDR_INFOBAR_MEDIA_STREAM_MIC;
(...skipping 20 matching lines...) Expand all
197 209
198 bool MediaStreamDevicesController::HasUserGesture() const { 210 bool MediaStreamDevicesController::HasUserGesture() const {
199 return request_.user_gesture; 211 return request_.user_gesture;
200 } 212 }
201 213
202 GURL MediaStreamDevicesController::GetRequestingHostname() const { 214 GURL MediaStreamDevicesController::GetRequestingHostname() const {
203 return request_.security_origin; 215 return request_.security_origin;
204 } 216 }
205 217
206 void MediaStreamDevicesController::PermissionGranted() { 218 void MediaStreamDevicesController::PermissionGranted() {
207 GURL origin(GetSecurityOriginSpec()); 219 RecordPermissionAction(
208 if (content::IsOriginSecure(origin)) { 220 request_, base::Bind(PermissionContextUmaUtil::PermissionGranted));
209 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions",
210 kAllowHttps, kPermissionActionsMax);
211 } else {
212 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions",
213 kAllowHttp, kPermissionActionsMax);
214 }
215 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 221 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
216 old_audio_setting_, CONTENT_SETTING_ALLOW), 222 old_audio_setting_, CONTENT_SETTING_ALLOW),
217 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 223 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
218 old_video_setting_, CONTENT_SETTING_ALLOW), 224 old_video_setting_, CONTENT_SETTING_ALLOW),
219 content::MEDIA_DEVICE_PERMISSION_DENIED); 225 content::MEDIA_DEVICE_PERMISSION_DENIED);
220 } 226 }
221 227
222 void MediaStreamDevicesController::PermissionDenied() { 228 void MediaStreamDevicesController::PermissionDenied() {
223 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 229 RecordPermissionAction(
224 kDeny, kPermissionActionsMax); 230 request_, base::Bind(PermissionContextUmaUtil::PermissionDenied));
225 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 231 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
226 old_audio_setting_, CONTENT_SETTING_BLOCK), 232 old_audio_setting_, CONTENT_SETTING_BLOCK),
227 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 233 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
228 old_video_setting_, CONTENT_SETTING_BLOCK), 234 old_video_setting_, CONTENT_SETTING_BLOCK),
229 content::MEDIA_DEVICE_PERMISSION_DENIED); 235 content::MEDIA_DEVICE_PERMISSION_DENIED);
230 } 236 }
231 237
232 void MediaStreamDevicesController::Cancelled() { 238 void MediaStreamDevicesController::Cancelled() {
233 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 239 RecordPermissionAction(
234 kCancel, kPermissionActionsMax); 240 request_, base::Bind(PermissionContextUmaUtil::PermissionDismissed));
235 RunCallback(old_audio_setting_, old_video_setting_, 241 RunCallback(old_audio_setting_, old_video_setting_,
236 content::MEDIA_DEVICE_PERMISSION_DISMISSED); 242 content::MEDIA_DEVICE_PERMISSION_DISMISSED);
237 } 243 }
238 244
239 void MediaStreamDevicesController::RequestFinished() { 245 void MediaStreamDevicesController::RequestFinished() {
240 delete this; 246 delete this;
241 } 247 }
242 248
243 content::MediaStreamDevices MediaStreamDevicesController::GetDevices( 249 content::MediaStreamDevices MediaStreamDevicesController::GetDevices(
244 ContentSetting audio_setting, 250 ContentSetting audio_setting,
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 if (android_permission_blocked) 536 if (android_permission_blocked)
531 return false; 537 return false;
532 538
533 // Don't approve device requests if the tab was hidden. 539 // Don't approve device requests if the tab was hidden.
534 // TODO(qinmin): Add a test for this. http://crbug.com/396869. 540 // TODO(qinmin): Add a test for this. http://crbug.com/396869.
535 // TODO(raymes): Shouldn't this apply to all permissions not just audio/video? 541 // TODO(raymes): Shouldn't this apply to all permissions not just audio/video?
536 return web_contents_->GetRenderWidgetHostView()->IsShowing(); 542 return web_contents_->GetRenderWidgetHostView()->IsShowing();
537 #endif 543 #endif
538 return true; 544 return true;
539 } 545 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698