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

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: 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/browser_process.h"
13 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 14 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
14 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 15 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
15 #include "chrome/browser/media/media_capture_devices_dispatcher.h" 16 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
16 #include "chrome/browser/media/media_permission.h" 17 #include "chrome/browser/media/media_permission.h"
17 #include "chrome/browser/media/media_stream_capture_indicator.h" 18 #include "chrome/browser/media/media_stream_capture_indicator.h"
18 #include "chrome/browser/media/media_stream_device_permissions.h" 19 #include "chrome/browser/media/media_stream_device_permissions.h"
20 #include "chrome/browser/permissions/permission_context_uma_util.h"
19 #include "chrome/browser/profiles/profile.h" 21 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/ui/browser.h" 22 #include "chrome/browser/ui/browser.h"
21 #include "chrome/common/chrome_switches.h" 23 #include "chrome/common/chrome_switches.h"
22 #include "chrome/common/pref_names.h" 24 #include "chrome/common/pref_names.h"
23 #include "chrome/grit/generated_resources.h" 25 #include "chrome/grit/generated_resources.h"
24 #include "components/content_settings/core/browser/host_content_settings_map.h" 26 #include "components/content_settings/core/browser/host_content_settings_map.h"
25 #include "components/content_settings/core/common/content_settings_pattern.h" 27 #include "components/content_settings/core/common/content_settings_pattern.h"
26 #include "components/pref_registry/pref_registry_syncable.h" 28 #include "components/pref_registry/pref_registry_syncable.h"
29 #include "components/rappor/rappor_service.h"
30 #include "components/rappor/rappor_utils.h"
27 #include "content/public/browser/browser_thread.h" 31 #include "content/public/browser/browser_thread.h"
28 #include "content/public/browser/render_widget_host_view.h" 32 #include "content/public/browser/render_widget_host_view.h"
29 #include "content/public/common/media_stream_request.h" 33 #include "content/public/common/media_stream_request.h"
30 #include "content/public/common/origin_util.h" 34 #include "content/public/common/origin_util.h"
31 #include "extensions/common/constants.h" 35 #include "extensions/common/constants.h"
32 #include "grit/theme_resources.h" 36 #include "grit/theme_resources.h"
33 #include "ui/base/l10n/l10n_util.h" 37 #include "ui/base/l10n/l10n_util.h"
34 38
35 #if defined(OS_ANDROID) 39 #if defined(OS_ANDROID)
36 #include <vector> 40 #include <vector>
(...skipping 25 matching lines...) Expand all
62 66
63 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC) 67 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)
64 return request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE; 68 return request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE;
65 69
66 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) 70 if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)
67 return request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE; 71 return request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE;
68 72
69 return false; 73 return false;
70 } 74 }
71 75
76 void RecordPermissionActionImpl(const GURL& request_origin,
tsergeant 2015/10/12 04:06:44 It's possible for the request to be a from a chrom
kcarattini 2015/10/12 06:13:28 Good question. To be honest, I'd be interested in
77 PermissionAction action,
78 std::string permission_str) {
79 rappor::RapporService* rappor_service = g_browser_process->rappor_service();
80
81 scoped_ptr<rappor::Sample> sample =
82 rappor_service->CreateSample(rappor::SAFEBROWSING_RAPPOR_TYPE);
83 sample->SetStringField("Scheme", request_origin.scheme());
84 sample->SetStringField("Host", request_origin.host());
85 sample->SetStringField("Port", request_origin.port());
86 sample->SetStringField(
87 "Domain", rappor::GetDomainAndRegistrySampleFromGURL(request_origin));
88 sample->SetFlagsField("Actions", 1 << action,
89 PermissionAction::PERMISSION_ACTION_NUM);
90
91 rappor_service->RecordSampleObj(
92 "Permissions.Actions." + permission_str, sample.Pass());
93 }
94
95 // Record a Rappor sample for taking an |action| on a media |request|.
96 void RecordPermissionAction(const content::MediaStreamRequest& request,
97 PermissionAction action) {
98 if (ContentTypeIsRequested(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
99 request)) {
100 RecordPermissionActionImpl(request.security_origin, action, "Camera");
kcarattini 2015/10/12 06:13:28 I'm exporting a GetString method from permission_c
tsergeant 2015/10/13 03:31:23 Done.
101 }
102 if (ContentTypeIsRequested(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, request)) {
103 RecordPermissionActionImpl(request.security_origin, action, "Mic");
104 }
105 }
106
72 } // namespace 107 } // namespace
73 108
74 MediaStreamDevicesController::MediaStreamDevicesController( 109 MediaStreamDevicesController::MediaStreamDevicesController(
75 content::WebContents* web_contents, 110 content::WebContents* web_contents,
76 const content::MediaStreamRequest& request, 111 const content::MediaStreamRequest& request,
77 const content::MediaResponseCallback& callback) 112 const content::MediaResponseCallback& callback)
78 : web_contents_(web_contents), 113 : web_contents_(web_contents),
79 request_(request), 114 request_(request),
80 callback_(callback), 115 callback_(callback),
81 persist_permission_changes_(true) { 116 persist_permission_changes_(true) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 return; 152 return;
118 } 153 }
119 #endif 154 #endif
120 155
121 // Otherwise we can run the callback immediately. 156 // Otherwise we can run the callback immediately.
122 RunCallback(old_audio_setting_, old_video_setting_, denial_reason); 157 RunCallback(old_audio_setting_, old_video_setting_, denial_reason);
123 } 158 }
124 159
125 MediaStreamDevicesController::~MediaStreamDevicesController() { 160 MediaStreamDevicesController::~MediaStreamDevicesController() {
126 if (!callback_.is_null()) { 161 if (!callback_.is_null()) {
162 RecordPermissionAction(request_, PermissionAction::IGNORED);
127 callback_.Run(content::MediaStreamDevices(), 163 callback_.Run(content::MediaStreamDevices(),
128 content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN, 164 content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN,
129 scoped_ptr<content::MediaStreamUI>()); 165 scoped_ptr<content::MediaStreamUI>());
130 } 166 }
131 } 167 }
132 168
133 // static 169 // static
134 void MediaStreamDevicesController::RegisterProfilePrefs( 170 void MediaStreamDevicesController::RegisterProfilePrefs(
135 user_prefs::PrefRegistrySyncable* prefs) { 171 user_prefs::PrefRegistrySyncable* prefs) {
136 prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true); 172 prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, true);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 241
206 void MediaStreamDevicesController::PermissionGranted() { 242 void MediaStreamDevicesController::PermissionGranted() {
207 GURL origin(GetSecurityOriginSpec()); 243 GURL origin(GetSecurityOriginSpec());
208 if (content::IsOriginSecure(origin)) { 244 if (content::IsOriginSecure(origin)) {
209 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 245 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions",
210 kAllowHttps, kPermissionActionsMax); 246 kAllowHttps, kPermissionActionsMax);
211 } else { 247 } else {
212 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 248 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions",
213 kAllowHttp, kPermissionActionsMax); 249 kAllowHttp, kPermissionActionsMax);
214 } 250 }
251 RecordPermissionAction(request_, PermissionAction::GRANTED);
215 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 252 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
216 old_audio_setting_, CONTENT_SETTING_ALLOW), 253 old_audio_setting_, CONTENT_SETTING_ALLOW),
217 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 254 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
218 old_video_setting_, CONTENT_SETTING_ALLOW), 255 old_video_setting_, CONTENT_SETTING_ALLOW),
219 content::MEDIA_DEVICE_PERMISSION_DENIED); 256 content::MEDIA_DEVICE_PERMISSION_DENIED);
220 } 257 }
221 258
222 void MediaStreamDevicesController::PermissionDenied() { 259 void MediaStreamDevicesController::PermissionDenied() {
223 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 260 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions",
224 kDeny, kPermissionActionsMax); 261 kDeny, kPermissionActionsMax);
262 RecordPermissionAction(request_, PermissionAction::DENIED);
225 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 263 RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
226 old_audio_setting_, CONTENT_SETTING_BLOCK), 264 old_audio_setting_, CONTENT_SETTING_BLOCK),
227 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 265 GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
228 old_video_setting_, CONTENT_SETTING_BLOCK), 266 old_video_setting_, CONTENT_SETTING_BLOCK),
229 content::MEDIA_DEVICE_PERMISSION_DENIED); 267 content::MEDIA_DEVICE_PERMISSION_DENIED);
230 } 268 }
231 269
232 void MediaStreamDevicesController::Cancelled() { 270 void MediaStreamDevicesController::Cancelled() {
233 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 271 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions",
234 kCancel, kPermissionActionsMax); 272 kCancel, kPermissionActionsMax);
273 RecordPermissionAction(request_, PermissionAction::DISMISSED);
235 RunCallback(old_audio_setting_, old_video_setting_, 274 RunCallback(old_audio_setting_, old_video_setting_,
236 content::MEDIA_DEVICE_PERMISSION_DISMISSED); 275 content::MEDIA_DEVICE_PERMISSION_DISMISSED);
237 } 276 }
238 277
239 void MediaStreamDevicesController::RequestFinished() { 278 void MediaStreamDevicesController::RequestFinished() {
240 delete this; 279 delete this;
241 } 280 }
242 281
243 content::MediaStreamDevices MediaStreamDevicesController::GetDevices( 282 content::MediaStreamDevices MediaStreamDevicesController::GetDevices(
244 ContentSetting audio_setting, 283 ContentSetting audio_setting,
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 if (android_permission_blocked) 569 if (android_permission_blocked)
531 return false; 570 return false;
532 571
533 // Don't approve device requests if the tab was hidden. 572 // Don't approve device requests if the tab was hidden.
534 // TODO(qinmin): Add a test for this. http://crbug.com/396869. 573 // 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? 574 // TODO(raymes): Shouldn't this apply to all permissions not just audio/video?
536 return web_contents_->GetRenderWidgetHostView()->IsShowing(); 575 return web_contents_->GetRenderWidgetHostView()->IsShowing();
537 #endif 576 #endif
538 return true; 577 return true;
539 } 578 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/permissions/permission_context_uma_util.h » ('j') | tools/metrics/rappor/rappor.xml » ('J')

Powered by Google App Engine
This is Rietveld 408576698