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

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: Call PermissionContextUmaUtil methods 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 void (*PermissionActionFunction)(ContentSettingsType, const GURL&);
66
67 // Calls |action_function| for each permission requested by |request|.
68 void RecordPermissionAction(const content::MediaStreamRequest& request,
69 PermissionActionFunction action_function) {
70 if (ContentTypeIsRequested(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
71 request)) {
72 action_function(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
73 request.security_origin);
74 }
75 if (ContentTypeIsRequested(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, request)) {
76 action_function(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
77 request.security_origin);
78 }
79 }
80
72 } // namespace 81 } // namespace
73 82
74 MediaStreamDevicesController::MediaStreamDevicesController( 83 MediaStreamDevicesController::MediaStreamDevicesController(
75 content::WebContents* web_contents, 84 content::WebContents* web_contents,
76 const content::MediaStreamRequest& request, 85 const content::MediaStreamRequest& request,
77 const content::MediaResponseCallback& callback) 86 const content::MediaResponseCallback& callback)
78 : web_contents_(web_contents), 87 : web_contents_(web_contents),
79 request_(request), 88 request_(request),
80 callback_(callback), 89 callback_(callback),
81 persist_permission_changes_(true) { 90 persist_permission_changes_(true) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 return; 126 return;
118 } 127 }
119 #endif 128 #endif
120 129
121 // Otherwise we can run the callback immediately. 130 // Otherwise we can run the callback immediately.
122 RunCallback(old_audio_setting_, old_video_setting_, denial_reason); 131 RunCallback(old_audio_setting_, old_video_setting_, denial_reason);
123 } 132 }
124 133
125 MediaStreamDevicesController::~MediaStreamDevicesController() { 134 MediaStreamDevicesController::~MediaStreamDevicesController() {
126 if (!callback_.is_null()) { 135 if (!callback_.is_null()) {
136 RecordPermissionAction(request_,
137 &PermissionContextUmaUtil::PermissionIgnored);
127 callback_.Run(content::MediaStreamDevices(), 138 callback_.Run(content::MediaStreamDevices(),
128 content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN, 139 content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN,
129 scoped_ptr<content::MediaStreamUI>()); 140 scoped_ptr<content::MediaStreamUI>());
130 } 141 }
131 } 142 }
132 143
133 // static 144 // static
134 void MediaStreamDevicesController::RegisterProfilePrefs( 145 void MediaStreamDevicesController::RegisterProfilePrefs(
135 user_prefs::PrefRegistrySyncable* prefs) { 146 user_prefs::PrefRegistrySyncable* prefs) {
136 prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true); 147 prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true);
(...skipping 18 matching lines...) Expand all
155 return old_video_setting_ == CONTENT_SETTING_ASK; 166 return old_video_setting_ == CONTENT_SETTING_ASK;
156 } 167 }
157 168
158 const std::string& MediaStreamDevicesController::GetSecurityOriginSpec() const { 169 const std::string& MediaStreamDevicesController::GetSecurityOriginSpec() const {
159 return request_.security_origin.spec(); 170 return request_.security_origin.spec();
160 } 171 }
161 172
162 void MediaStreamDevicesController::ForcePermissionDeniedTemporarily() { 173 void MediaStreamDevicesController::ForcePermissionDeniedTemporarily() {
163 base::AutoReset<bool> persist_permissions( 174 base::AutoReset<bool> persist_permissions(
164 &persist_permission_changes_, false); 175 &persist_permission_changes_, false);
165 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 176 RecordPermissionAction(request_, &PermissionContextUmaUtil::PermissionDenied);
166 kDeny, kPermissionActionsMax);
167 RunCallback(CONTENT_SETTING_BLOCK, 177 RunCallback(CONTENT_SETTING_BLOCK,
168 CONTENT_SETTING_BLOCK, 178 CONTENT_SETTING_BLOCK,
169 content::MEDIA_DEVICE_PERMISSION_DENIED); 179 content::MEDIA_DEVICE_PERMISSION_DENIED);
170 } 180 }
171 181
172 int MediaStreamDevicesController::GetIconId() const { 182 int MediaStreamDevicesController::GetIconId() const {
173 if (IsAskingForVideo()) 183 if (IsAskingForVideo())
174 return IDR_INFOBAR_MEDIA_STREAM_CAMERA; 184 return IDR_INFOBAR_MEDIA_STREAM_CAMERA;
175 185
176 return IDR_INFOBAR_MEDIA_STREAM_MIC; 186 return IDR_INFOBAR_MEDIA_STREAM_MIC;
(...skipping 20 matching lines...) Expand all
197 207
198 bool MediaStreamDevicesController::HasUserGesture() const { 208 bool MediaStreamDevicesController::HasUserGesture() const {
199 return request_.user_gesture; 209 return request_.user_gesture;
200 } 210 }
201 211
202 GURL MediaStreamDevicesController::GetRequestingHostname() const { 212 GURL MediaStreamDevicesController::GetRequestingHostname() const {
203 return request_.security_origin; 213 return request_.security_origin;
204 } 214 }
205 215
206 void MediaStreamDevicesController::PermissionGranted() { 216 void MediaStreamDevicesController::PermissionGranted() {
207 GURL origin(GetSecurityOriginSpec()); 217 RecordPermissionAction(request_,
208 if (content::IsOriginSecure(origin)) { 218 &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, 219 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
216 old_audio_setting_, CONTENT_SETTING_ALLOW), 220 old_audio_setting_, CONTENT_SETTING_ALLOW),
217 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 221 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
218 old_video_setting_, CONTENT_SETTING_ALLOW), 222 old_video_setting_, CONTENT_SETTING_ALLOW),
219 content::MEDIA_DEVICE_PERMISSION_DENIED); 223 content::MEDIA_DEVICE_PERMISSION_DENIED);
220 } 224 }
221 225
222 void MediaStreamDevicesController::PermissionDenied() { 226 void MediaStreamDevicesController::PermissionDenied() {
223 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 227 RecordPermissionAction(request_, &PermissionContextUmaUtil::PermissionDenied);
224 kDeny, kPermissionActionsMax);
225 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 228 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
226 old_audio_setting_, CONTENT_SETTING_BLOCK), 229 old_audio_setting_, CONTENT_SETTING_BLOCK),
227 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 230 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
228 old_video_setting_, CONTENT_SETTING_BLOCK), 231 old_video_setting_, CONTENT_SETTING_BLOCK),
229 content::MEDIA_DEVICE_PERMISSION_DENIED); 232 content::MEDIA_DEVICE_PERMISSION_DENIED);
230 } 233 }
231 234
232 void MediaStreamDevicesController::Cancelled() { 235 void MediaStreamDevicesController::Cancelled() {
233 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 236 RecordPermissionAction(request_,
234 kCancel, kPermissionActionsMax); 237 &PermissionContextUmaUtil::PermissionDismissed);
235 RunCallback(old_audio_setting_, old_video_setting_, 238 RunCallback(old_audio_setting_, old_video_setting_,
236 content::MEDIA_DEVICE_PERMISSION_DISMISSED); 239 content::MEDIA_DEVICE_PERMISSION_DISMISSED);
237 } 240 }
238 241
239 void MediaStreamDevicesController::RequestFinished() { 242 void MediaStreamDevicesController::RequestFinished() {
240 delete this; 243 delete this;
241 } 244 }
242 245
243 content::MediaStreamDevices MediaStreamDevicesController::GetDevices( 246 content::MediaStreamDevices MediaStreamDevicesController::GetDevices(
244 ContentSetting audio_setting, 247 ContentSetting audio_setting,
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 if (android_permission_blocked) 533 if (android_permission_blocked)
531 return false; 534 return false;
532 535
533 // Don't approve device requests if the tab was hidden. 536 // Don't approve device requests if the tab was hidden.
534 // TODO(qinmin): Add a test for this. http://crbug.com/396869. 537 // 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? 538 // TODO(raymes): Shouldn't this apply to all permissions not just audio/video?
536 return web_contents_->GetRenderWidgetHostView()->IsShowing(); 539 return web_contents_->GetRenderWidgetHostView()->IsShowing();
537 #endif 540 #endif
538 return true; 541 return true;
539 } 542 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698