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

Side by Side Diff: chrome/browser/permissions/permission_uma_util.cc

Issue 2250993002: Add prior dismissal and ignore count metrics for all permission actions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@kendra-permission-action-reporting
Patch Set: Address comments Created 4 years, 4 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/permissions/permission_uma_util.h" 5 #include "chrome/browser/permissions/permission_uma_util.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/histogram.h"
10 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
11 #include "base/strings/stringprintf.h" 12 #include "base/strings/stringprintf.h"
12 #include "chrome/browser/browser_process.h" 13 #include "chrome/browser/browser_process.h"
13 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" 14 #include "chrome/browser/permissions/permission_decision_auto_blocker.h"
14 #include "chrome/browser/permissions/permission_manager.h" 15 #include "chrome/browser/permissions/permission_manager.h"
15 #include "chrome/browser/permissions/permission_request.h" 16 #include "chrome/browser/permissions/permission_request.h"
16 #include "chrome/browser/permissions/permission_util.h" 17 #include "chrome/browser/permissions/permission_util.h"
17 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/safe_browsing/safe_browsing_service.h" 19 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
19 #include "chrome/browser/safe_browsing/ui_manager.h" 20 #include "chrome/browser/safe_browsing/ui_manager.h"
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 const char PermissionUmaUtil::kPermissionsPromptShown[] = 182 const char PermissionUmaUtil::kPermissionsPromptShown[] =
182 "Permissions.Prompt.Shown"; 183 "Permissions.Prompt.Shown";
183 const char PermissionUmaUtil::kPermissionsPromptShownGesture[] = 184 const char PermissionUmaUtil::kPermissionsPromptShownGesture[] =
184 "Permissions.Prompt.Shown.Gesture"; 185 "Permissions.Prompt.Shown.Gesture";
185 const char PermissionUmaUtil::kPermissionsPromptShownNoGesture[] = 186 const char PermissionUmaUtil::kPermissionsPromptShownNoGesture[] =
186 "Permissions.Prompt.Shown.NoGesture"; 187 "Permissions.Prompt.Shown.NoGesture";
187 const char PermissionUmaUtil::kPermissionsPromptAccepted[] = 188 const char PermissionUmaUtil::kPermissionsPromptAccepted[] =
188 "Permissions.Prompt.Accepted"; 189 "Permissions.Prompt.Accepted";
189 const char PermissionUmaUtil::kPermissionsPromptAcceptedGesture[] = 190 const char PermissionUmaUtil::kPermissionsPromptAcceptedGesture[] =
190 "Permissions.Prompt.Accepted.Gesture"; 191 "Permissions.Prompt.Accepted.Gesture";
192 const char
193 PermissionUmaUtil::kPermissionsPromptAcceptedPriorDismissCountPrefix[] =
194 "Permissions.Prompt.Accepted.PriorDismissCount.";
195 const char
196 PermissionUmaUtil::kPermissionsPromptAcceptedPriorIgnoreCountPrefix[] =
197 "Permissions.Prompt.Accepted.PriorIgnoreCount.";
191 const char PermissionUmaUtil::kPermissionsPromptAcceptedNoGesture[] = 198 const char PermissionUmaUtil::kPermissionsPromptAcceptedNoGesture[] =
192 "Permissions.Prompt.Accepted.NoGesture"; 199 "Permissions.Prompt.Accepted.NoGesture";
193 const char PermissionUmaUtil::kPermissionsPromptDenied[] = 200 const char PermissionUmaUtil::kPermissionsPromptDenied[] =
194 "Permissions.Prompt.Denied"; 201 "Permissions.Prompt.Denied";
195 const char PermissionUmaUtil::kPermissionsPromptDeniedGesture[] = 202 const char PermissionUmaUtil::kPermissionsPromptDeniedGesture[] =
196 "Permissions.Prompt.Denied.Gesture"; 203 "Permissions.Prompt.Denied.Gesture";
204 const char
205 PermissionUmaUtil::kPermissionsPromptDeniedPriorDismissCountPrefix[] =
206 "Permissions.Prompt.Denied.PriorDismissCount.";
207 const char
208 PermissionUmaUtil::kPermissionsPromptDeniedPriorIgnoreCountPrefix[] =
209 "Permissions.Prompt.Denied.PriorIgnoreCount.";
197 const char PermissionUmaUtil::kPermissionsPromptDeniedNoGesture[] = 210 const char PermissionUmaUtil::kPermissionsPromptDeniedNoGesture[] =
198 "Permissions.Prompt.Denied.NoGesture"; 211 "Permissions.Prompt.Denied.NoGesture";
212 const char
213 PermissionUmaUtil::kPermissionsPromptDismissedPriorDismissCountPrefix[] =
214 "Permissions.Prompt.Dismissed.PriorDismissCount.";
215 const char
216 PermissionUmaUtil::kPermissionsPromptDismissedPriorIgnoreCountPrefix[] =
217 "Permissions.Prompt.Dismissed.PriorIgnoreCount.";
218 const char
219 PermissionUmaUtil::kPermissionsPromptIgnoredPriorDismissCountPrefix[] =
220 "Permissions.Prompt.Ignored.PriorDismissCount.";
221 const char
222 PermissionUmaUtil::kPermissionsPromptIgnoredPriorIgnoreCountPrefix[] =
223 "Permissions.Prompt.Ignored.PriorIgnoreCount.";
raymes 2016/08/22 02:55:09 Can we group together the strings related to this
dominickn 2016/08/22 22:40:51 Done.
199 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] = 224 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] =
200 "Permissions.Prompt.RequestsPerPrompt"; 225 "Permissions.Prompt.RequestsPerPrompt";
201 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] = 226 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] =
202 "Permissions.Prompt.MergedBubbleTypes"; 227 "Permissions.Prompt.MergedBubbleTypes";
203 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] = 228 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] =
204 "Permissions.Prompt.MergedBubbleAccepted"; 229 "Permissions.Prompt.MergedBubbleAccepted";
205 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] = 230 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] =
206 "Permissions.Prompt.MergedBubbleDenied"; 231 "Permissions.Prompt.MergedBubbleDenied";
207 232
208 // Make sure you update histograms.xml permission histogram_suffix if you 233 // Make sure you update histograms.xml permission histogram_suffix if you
209 // add new permission 234 // add new permission
210 void PermissionUmaUtil::PermissionRequested(PermissionType permission, 235 void PermissionUmaUtil::PermissionRequested(PermissionType permission,
211 const GURL& requesting_origin, 236 const GURL& requesting_origin,
212 const GURL& embedding_origin, 237 const GURL& embedding_origin,
213 Profile* profile) { 238 Profile* profile) {
214 RecordPermissionRequest(permission, requesting_origin, embedding_origin, 239 RecordPermissionRequest(permission, requesting_origin, embedding_origin,
215 profile); 240 profile);
216 } 241 }
217 242
218 void PermissionUmaUtil::PermissionGranted( 243 void PermissionUmaUtil::PermissionGranted(
219 PermissionType permission, 244 PermissionType permission,
220 PermissionRequestGestureType gesture_type, 245 PermissionRequestGestureType gesture_type,
221 const GURL& requesting_origin, 246 const GURL& requesting_origin,
222 Profile* profile) { 247 Profile* profile) {
223 RecordPermissionAction(permission, GRANTED, PermissionSourceUI::PROMPT, 248 RecordPermissionAction(permission, GRANTED, PermissionSourceUI::PROMPT,
224 gesture_type, requesting_origin, profile); 249 gesture_type, requesting_origin, profile);
250 RecordPermissionPromptPriorCount(
251 permission, kPermissionsPromptAcceptedPriorDismissCountPrefix,
252 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin,
253 permission, profile));
254 RecordPermissionPromptPriorCount(
255 permission, kPermissionsPromptAcceptedPriorIgnoreCountPrefix,
256 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin,
257 permission, profile));
225 } 258 }
226 259
227 void PermissionUmaUtil::PermissionDenied( 260 void PermissionUmaUtil::PermissionDenied(
228 PermissionType permission, 261 PermissionType permission,
229 PermissionRequestGestureType gesture_type, 262 PermissionRequestGestureType gesture_type,
230 const GURL& requesting_origin, 263 const GURL& requesting_origin,
231 Profile* profile) { 264 Profile* profile) {
232 RecordPermissionAction(permission, DENIED, PermissionSourceUI::PROMPT, 265 RecordPermissionAction(permission, DENIED, PermissionSourceUI::PROMPT,
233 gesture_type, requesting_origin, profile); 266 gesture_type, requesting_origin, profile);
267 RecordPermissionPromptPriorCount(
268 permission, kPermissionsPromptDeniedPriorDismissCountPrefix,
269 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin,
270 permission, profile));
271 RecordPermissionPromptPriorCount(
272 permission, kPermissionsPromptDeniedPriorIgnoreCountPrefix,
273 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin,
274 permission, profile));
234 } 275 }
235 276
236 void PermissionUmaUtil::PermissionDismissed( 277 void PermissionUmaUtil::PermissionDismissed(
237 PermissionType permission, 278 PermissionType permission,
238 PermissionRequestGestureType gesture_type, 279 PermissionRequestGestureType gesture_type,
239 const GURL& requesting_origin, 280 const GURL& requesting_origin,
240 Profile* profile) { 281 Profile* profile) {
241 RecordPermissionAction(permission, DISMISSED, PermissionSourceUI::PROMPT, 282 RecordPermissionAction(permission, DISMISSED, PermissionSourceUI::PROMPT,
242 gesture_type, requesting_origin, profile); 283 gesture_type, requesting_origin, profile);
284 RecordPermissionPromptPriorCount(
285 permission, kPermissionsPromptDismissedPriorDismissCountPrefix,
286 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin,
287 permission, profile));
288 RecordPermissionPromptPriorCount(
289 permission, kPermissionsPromptDismissedPriorIgnoreCountPrefix,
290 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin,
291 permission, profile));
243 } 292 }
244 293
245 void PermissionUmaUtil::PermissionIgnored( 294 void PermissionUmaUtil::PermissionIgnored(
246 PermissionType permission, 295 PermissionType permission,
247 PermissionRequestGestureType gesture_type, 296 PermissionRequestGestureType gesture_type,
248 const GURL& requesting_origin, 297 const GURL& requesting_origin,
249 Profile* profile) { 298 Profile* profile) {
250 RecordPermissionAction(permission, IGNORED, PermissionSourceUI::PROMPT, 299 RecordPermissionAction(permission, IGNORED, PermissionSourceUI::PROMPT,
251 gesture_type, requesting_origin, profile); 300 gesture_type, requesting_origin, profile);
301 RecordPermissionPromptPriorCount(
302 permission, kPermissionsPromptIgnoredPriorDismissCountPrefix,
303 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin,
304 permission, profile));
305 RecordPermissionPromptPriorCount(
306 permission, kPermissionsPromptIgnoredPriorIgnoreCountPrefix,
307 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin,
308 permission, profile));
252 } 309 }
253 310
254 void PermissionUmaUtil::PermissionRevoked(PermissionType permission, 311 void PermissionUmaUtil::PermissionRevoked(PermissionType permission,
255 PermissionSourceUI source_ui, 312 PermissionSourceUI source_ui,
256 const GURL& revoked_origin, 313 const GURL& revoked_origin,
257 Profile* profile) { 314 Profile* profile) {
258 // TODO(tsergeant): Expand metrics definitions for revocation to include all 315 // TODO(tsergeant): Expand metrics definitions for revocation to include all
259 // permissions. 316 // permissions.
260 if (permission == PermissionType::NOTIFICATIONS || 317 if (permission == PermissionType::NOTIFICATIONS ||
261 permission == PermissionType::GEOLOCATION || 318 permission == PermissionType::GEOLOCATION ||
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 DCHECK(!requests.empty()); 404 DCHECK(!requests.empty());
348 DCHECK(requests.size() == 1); 405 DCHECK(requests.size() == 1);
349 406
350 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, 407 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied,
351 requests[0]->GetPermissionRequestType()); 408 requests[0]->GetPermissionRequestType());
352 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( 409 PERMISSION_BUBBLE_GESTURE_TYPE_UMA(
353 kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture, 410 kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture,
354 requests[0]->GetGestureType(), requests[0]->GetPermissionRequestType()); 411 requests[0]->GetGestureType(), requests[0]->GetPermissionRequestType());
355 } 412 }
356 413
357 void PermissionUmaUtil::PermissionPromptDismissed( 414 void PermissionUmaUtil::RecordPermissionPromptPriorCount(
358 content::PermissionType permission, 415 content::PermissionType permission,
416 const std::string& prefix,
359 int count) { 417 int count) {
360 switch (permission) { 418 // The user is not prompted for these permissions, thus there is no prompt
361 case PermissionType::GEOLOCATION: 419 // event to record a prior count for.
362 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.Geolocation", 420 DCHECK_NE(PermissionType::MIDI, permission);
363 count); 421 DCHECK_NE(PermissionType::BACKGROUND_SYNC, permission);
364 break; 422 DCHECK_NE(PermissionType::NUM, permission);
365 case PermissionType::NOTIFICATIONS:
366 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.Notifications",
367 count);
368 break;
369 case PermissionType::MIDI_SYSEX:
370 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.MidiSysEx",
371 count);
372 break;
373 case PermissionType::PUSH_MESSAGING:
374 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.PushMessaging",
375 count);
376 break;
377 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
378 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.ProtectedMedia",
379 count);
380 break;
381 case PermissionType::DURABLE_STORAGE:
382 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.DurableStorage",
383 count);
384 break;
385 case PermissionType::AUDIO_CAPTURE:
386 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.AudioCapture",
387 count);
388 break;
389 case PermissionType::VIDEO_CAPTURE:
390 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.VideoCapture",
391 count);
392 break;
393 // The user is not prompted for these permissions, thus there is no dismiss
394 // recorded for them.
395 case PermissionType::MIDI:
396 case PermissionType::BACKGROUND_SYNC:
397 case PermissionType::NUM:
398 NOTREACHED() << "PERMISSION "
399 << PermissionUtil::GetPermissionString(permission)
400 << " not accounted for";
401 }
402 }
403 423
404 void PermissionUmaUtil::PermissionPromptIgnored( 424 // Expand UMA_HISTOGRAM_COUNTS_100 so that we can use a dynamically suffixed
405 content::PermissionType permission, 425 // histogram name.
406 int count) { 426 base::Histogram::FactoryGet(
407 switch (permission) { 427 prefix + PermissionUtil::GetPermissionString(permission), 1, 100, 50,
408 case PermissionType::GEOLOCATION: 428 base::HistogramBase::kUmaTargetedHistogramFlag)
409 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.Geolocation", 429 ->Add(count);
410 count);
411 break;
412 case PermissionType::NOTIFICATIONS:
413 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.Notifications",
414 count);
415 break;
416 case PermissionType::MIDI_SYSEX:
417 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.MidiSysEx",
418 count);
419 break;
420 case PermissionType::PUSH_MESSAGING:
421 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.PushMessaging",
422 count);
423 break;
424 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
425 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.ProtectedMedia",
426 count);
427 break;
428 case PermissionType::DURABLE_STORAGE:
429 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.DurableStorage",
430 count);
431 break;
432 case PermissionType::AUDIO_CAPTURE:
433 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.AudioCapture",
434 count);
435 break;
436 case PermissionType::VIDEO_CAPTURE:
437 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.VideoCapture",
438 count);
439 break;
440 // The user is not prompted for these permissions, thus there is no
441 // ignore recorded for them.
442 case PermissionType::MIDI:
443 case PermissionType::BACKGROUND_SYNC:
444 case PermissionType::NUM:
445 NOTREACHED() << "PERMISSION "
446 << PermissionUtil::GetPermissionString(permission)
447 << " not accounted for";
448 }
449 } 430 }
450 431
451 void PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle( 432 void PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle(
452 content::PermissionType permission, 433 content::PermissionType permission,
453 bool toggle_enabled) { 434 bool toggle_enabled) {
454 switch (permission) { 435 switch (permission) {
455 case PermissionType::GEOLOCATION: 436 case PermissionType::GEOLOCATION:
456 UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Geolocation", 437 UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Geolocation",
457 toggle_enabled); 438 toggle_enabled);
458 break; 439 break;
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 if (!deprecated_metric.empty() && rappor_service) { 647 if (!deprecated_metric.empty() && rappor_service) {
667 rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, 648 rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric,
668 requesting_origin); 649 requesting_origin);
669 650
670 std::string rappor_metric = deprecated_metric + "2"; 651 std::string rappor_metric = deprecated_metric + "2";
671 rappor_service->RecordSample( 652 rappor_service->RecordSample(
672 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, 653 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE,
673 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); 654 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin));
674 } 655 }
675 } 656 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698