OLD | NEW |
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 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 const char PermissionUmaUtil::kPermissionsPromptDeniedNoGesture[] = | 219 const char PermissionUmaUtil::kPermissionsPromptDeniedNoGesture[] = |
219 "Permissions.Prompt.Denied.NoGesture"; | 220 "Permissions.Prompt.Denied.NoGesture"; |
220 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] = | 221 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] = |
221 "Permissions.Prompt.RequestsPerPrompt"; | 222 "Permissions.Prompt.RequestsPerPrompt"; |
222 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] = | 223 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] = |
223 "Permissions.Prompt.MergedBubbleTypes"; | 224 "Permissions.Prompt.MergedBubbleTypes"; |
224 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] = | 225 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] = |
225 "Permissions.Prompt.MergedBubbleAccepted"; | 226 "Permissions.Prompt.MergedBubbleAccepted"; |
226 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] = | 227 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] = |
227 "Permissions.Prompt.MergedBubbleDenied"; | 228 "Permissions.Prompt.MergedBubbleDenied"; |
| 229 const char |
| 230 PermissionUmaUtil::kPermissionsPromptAcceptedPriorDismissCountPrefix[] = |
| 231 "Permissions.Prompt.Accepted.PriorDismissCount."; |
| 232 const char |
| 233 PermissionUmaUtil::kPermissionsPromptAcceptedPriorIgnoreCountPrefix[] = |
| 234 "Permissions.Prompt.Accepted.PriorIgnoreCount."; |
| 235 const char |
| 236 PermissionUmaUtil::kPermissionsPromptDeniedPriorDismissCountPrefix[] = |
| 237 "Permissions.Prompt.Denied.PriorDismissCount."; |
| 238 const char |
| 239 PermissionUmaUtil::kPermissionsPromptDeniedPriorIgnoreCountPrefix[] = |
| 240 "Permissions.Prompt.Denied.PriorIgnoreCount."; |
| 241 const char |
| 242 PermissionUmaUtil::kPermissionsPromptDismissedPriorDismissCountPrefix[] = |
| 243 "Permissions.Prompt.Dismissed.PriorDismissCount."; |
| 244 const char |
| 245 PermissionUmaUtil::kPermissionsPromptDismissedPriorIgnoreCountPrefix[] = |
| 246 "Permissions.Prompt.Dismissed.PriorIgnoreCount."; |
| 247 const char |
| 248 PermissionUmaUtil::kPermissionsPromptIgnoredPriorDismissCountPrefix[] = |
| 249 "Permissions.Prompt.Ignored.PriorDismissCount."; |
| 250 const char |
| 251 PermissionUmaUtil::kPermissionsPromptIgnoredPriorIgnoreCountPrefix[] = |
| 252 "Permissions.Prompt.Ignored.PriorIgnoreCount."; |
228 | 253 |
229 // Make sure you update histograms.xml permission histogram_suffix if you | 254 // Make sure you update histograms.xml permission histogram_suffix if you |
230 // add new permission | 255 // add new permission |
231 void PermissionUmaUtil::PermissionRequested(PermissionType permission, | 256 void PermissionUmaUtil::PermissionRequested(PermissionType permission, |
232 const GURL& requesting_origin, | 257 const GURL& requesting_origin, |
233 const GURL& embedding_origin, | 258 const GURL& embedding_origin, |
234 Profile* profile) { | 259 Profile* profile) { |
235 RecordPermissionRequest(permission, requesting_origin, embedding_origin, | 260 RecordPermissionRequest(permission, requesting_origin, embedding_origin, |
236 profile); | 261 profile); |
237 } | 262 } |
238 | 263 |
239 void PermissionUmaUtil::PermissionGranted( | 264 void PermissionUmaUtil::PermissionGranted( |
240 PermissionType permission, | 265 PermissionType permission, |
241 PermissionRequestGestureType gesture_type, | 266 PermissionRequestGestureType gesture_type, |
242 const GURL& requesting_origin, | 267 const GURL& requesting_origin, |
243 Profile* profile) { | 268 Profile* profile) { |
244 RecordPermissionAction(permission, GRANTED, PermissionSourceUI::PROMPT, | 269 RecordPermissionAction(permission, GRANTED, PermissionSourceUI::PROMPT, |
245 gesture_type, requesting_origin, profile); | 270 gesture_type, requesting_origin, profile); |
| 271 RecordPermissionPromptPriorCount( |
| 272 permission, kPermissionsPromptAcceptedPriorDismissCountPrefix, |
| 273 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, |
| 274 permission, profile)); |
| 275 RecordPermissionPromptPriorCount( |
| 276 permission, kPermissionsPromptAcceptedPriorIgnoreCountPrefix, |
| 277 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, |
| 278 permission, profile)); |
246 } | 279 } |
247 | 280 |
248 void PermissionUmaUtil::PermissionDenied( | 281 void PermissionUmaUtil::PermissionDenied( |
249 PermissionType permission, | 282 PermissionType permission, |
250 PermissionRequestGestureType gesture_type, | 283 PermissionRequestGestureType gesture_type, |
251 const GURL& requesting_origin, | 284 const GURL& requesting_origin, |
252 Profile* profile) { | 285 Profile* profile) { |
253 RecordPermissionAction(permission, DENIED, PermissionSourceUI::PROMPT, | 286 RecordPermissionAction(permission, DENIED, PermissionSourceUI::PROMPT, |
254 gesture_type, requesting_origin, profile); | 287 gesture_type, requesting_origin, profile); |
| 288 RecordPermissionPromptPriorCount( |
| 289 permission, kPermissionsPromptDeniedPriorDismissCountPrefix, |
| 290 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, |
| 291 permission, profile)); |
| 292 RecordPermissionPromptPriorCount( |
| 293 permission, kPermissionsPromptDeniedPriorIgnoreCountPrefix, |
| 294 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, |
| 295 permission, profile)); |
255 } | 296 } |
256 | 297 |
257 void PermissionUmaUtil::PermissionDismissed( | 298 void PermissionUmaUtil::PermissionDismissed( |
258 PermissionType permission, | 299 PermissionType permission, |
259 PermissionRequestGestureType gesture_type, | 300 PermissionRequestGestureType gesture_type, |
260 const GURL& requesting_origin, | 301 const GURL& requesting_origin, |
261 Profile* profile) { | 302 Profile* profile) { |
262 RecordPermissionAction(permission, DISMISSED, PermissionSourceUI::PROMPT, | 303 RecordPermissionAction(permission, DISMISSED, PermissionSourceUI::PROMPT, |
263 gesture_type, requesting_origin, profile); | 304 gesture_type, requesting_origin, profile); |
| 305 RecordPermissionPromptPriorCount( |
| 306 permission, kPermissionsPromptDismissedPriorDismissCountPrefix, |
| 307 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, |
| 308 permission, profile)); |
| 309 RecordPermissionPromptPriorCount( |
| 310 permission, kPermissionsPromptDismissedPriorIgnoreCountPrefix, |
| 311 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, |
| 312 permission, profile)); |
264 } | 313 } |
265 | 314 |
266 void PermissionUmaUtil::PermissionIgnored( | 315 void PermissionUmaUtil::PermissionIgnored( |
267 PermissionType permission, | 316 PermissionType permission, |
268 PermissionRequestGestureType gesture_type, | 317 PermissionRequestGestureType gesture_type, |
269 const GURL& requesting_origin, | 318 const GURL& requesting_origin, |
270 Profile* profile) { | 319 Profile* profile) { |
271 RecordPermissionAction(permission, IGNORED, PermissionSourceUI::PROMPT, | 320 RecordPermissionAction(permission, IGNORED, PermissionSourceUI::PROMPT, |
272 gesture_type, requesting_origin, profile); | 321 gesture_type, requesting_origin, profile); |
| 322 RecordPermissionPromptPriorCount( |
| 323 permission, kPermissionsPromptIgnoredPriorDismissCountPrefix, |
| 324 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, |
| 325 permission, profile)); |
| 326 RecordPermissionPromptPriorCount( |
| 327 permission, kPermissionsPromptIgnoredPriorIgnoreCountPrefix, |
| 328 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, |
| 329 permission, profile)); |
273 } | 330 } |
274 | 331 |
275 void PermissionUmaUtil::PermissionRevoked(PermissionType permission, | 332 void PermissionUmaUtil::PermissionRevoked(PermissionType permission, |
276 PermissionSourceUI source_ui, | 333 PermissionSourceUI source_ui, |
277 const GURL& revoked_origin, | 334 const GURL& revoked_origin, |
278 Profile* profile) { | 335 Profile* profile) { |
279 // TODO(tsergeant): Expand metrics definitions for revocation to include all | 336 // TODO(tsergeant): Expand metrics definitions for revocation to include all |
280 // permissions. | 337 // permissions. |
281 if (permission == PermissionType::NOTIFICATIONS || | 338 if (permission == PermissionType::NOTIFICATIONS || |
282 permission == PermissionType::GEOLOCATION || | 339 permission == PermissionType::GEOLOCATION || |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 DCHECK(!requests.empty()); | 425 DCHECK(!requests.empty()); |
369 DCHECK(requests.size() == 1); | 426 DCHECK(requests.size() == 1); |
370 | 427 |
371 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, | 428 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, |
372 requests[0]->GetPermissionRequestType()); | 429 requests[0]->GetPermissionRequestType()); |
373 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( | 430 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( |
374 kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture, | 431 kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture, |
375 requests[0]->GetGestureType(), requests[0]->GetPermissionRequestType()); | 432 requests[0]->GetGestureType(), requests[0]->GetPermissionRequestType()); |
376 } | 433 } |
377 | 434 |
378 void PermissionUmaUtil::PermissionPromptDismissed( | 435 void PermissionUmaUtil::RecordPermissionPromptPriorCount( |
379 content::PermissionType permission, | 436 content::PermissionType permission, |
| 437 const std::string& prefix, |
380 int count) { | 438 int count) { |
381 switch (permission) { | 439 // The user is not prompted for these permissions, thus there is no prompt |
382 case PermissionType::GEOLOCATION: | 440 // event to record a prior count for. |
383 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.Geolocation", | 441 DCHECK_NE(PermissionType::MIDI, permission); |
384 count); | 442 DCHECK_NE(PermissionType::BACKGROUND_SYNC, permission); |
385 break; | 443 DCHECK_NE(PermissionType::NUM, permission); |
386 case PermissionType::NOTIFICATIONS: | |
387 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.Notifications", | |
388 count); | |
389 break; | |
390 case PermissionType::MIDI_SYSEX: | |
391 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.MidiSysEx", | |
392 count); | |
393 break; | |
394 case PermissionType::PUSH_MESSAGING: | |
395 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.PushMessaging", | |
396 count); | |
397 break; | |
398 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: | |
399 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.ProtectedMedia", | |
400 count); | |
401 break; | |
402 case PermissionType::DURABLE_STORAGE: | |
403 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.DurableStorage", | |
404 count); | |
405 break; | |
406 case PermissionType::AUDIO_CAPTURE: | |
407 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.AudioCapture", | |
408 count); | |
409 break; | |
410 case PermissionType::VIDEO_CAPTURE: | |
411 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.VideoCapture", | |
412 count); | |
413 break; | |
414 // The user is not prompted for these permissions, thus there is no dismiss | |
415 // recorded for them. | |
416 case PermissionType::MIDI: | |
417 case PermissionType::BACKGROUND_SYNC: | |
418 case PermissionType::NUM: | |
419 NOTREACHED() << "PERMISSION " | |
420 << PermissionUtil::GetPermissionString(permission) | |
421 << " not accounted for"; | |
422 } | |
423 } | |
424 | 444 |
425 void PermissionUmaUtil::PermissionPromptIgnored( | 445 // Expand UMA_HISTOGRAM_COUNTS_100 so that we can use a dynamically suffixed |
426 content::PermissionType permission, | 446 // histogram name. |
427 int count) { | 447 base::Histogram::FactoryGet( |
428 switch (permission) { | 448 prefix + PermissionUtil::GetPermissionString(permission), 1, 100, 50, |
429 case PermissionType::GEOLOCATION: | 449 base::HistogramBase::kUmaTargetedHistogramFlag) |
430 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.Geolocation", | 450 ->Add(count); |
431 count); | |
432 break; | |
433 case PermissionType::NOTIFICATIONS: | |
434 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.Notifications", | |
435 count); | |
436 break; | |
437 case PermissionType::MIDI_SYSEX: | |
438 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.MidiSysEx", | |
439 count); | |
440 break; | |
441 case PermissionType::PUSH_MESSAGING: | |
442 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.PushMessaging", | |
443 count); | |
444 break; | |
445 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: | |
446 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.ProtectedMedia", | |
447 count); | |
448 break; | |
449 case PermissionType::DURABLE_STORAGE: | |
450 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.DurableStorage", | |
451 count); | |
452 break; | |
453 case PermissionType::AUDIO_CAPTURE: | |
454 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.AudioCapture", | |
455 count); | |
456 break; | |
457 case PermissionType::VIDEO_CAPTURE: | |
458 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.VideoCapture", | |
459 count); | |
460 break; | |
461 // The user is not prompted for these permissions, thus there is no | |
462 // ignore recorded for them. | |
463 case PermissionType::MIDI: | |
464 case PermissionType::BACKGROUND_SYNC: | |
465 case PermissionType::NUM: | |
466 NOTREACHED() << "PERMISSION " | |
467 << PermissionUtil::GetPermissionString(permission) | |
468 << " not accounted for"; | |
469 } | |
470 } | 451 } |
471 | 452 |
472 void PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle( | 453 void PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle( |
473 content::PermissionType permission, | 454 content::PermissionType permission, |
474 bool toggle_enabled) { | 455 bool toggle_enabled) { |
475 switch (permission) { | 456 switch (permission) { |
476 case PermissionType::GEOLOCATION: | 457 case PermissionType::GEOLOCATION: |
477 UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Geolocation", | 458 UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Geolocation", |
478 toggle_enabled); | 459 toggle_enabled); |
479 break; | 460 break; |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 if (!deprecated_metric.empty() && rappor_service) { | 676 if (!deprecated_metric.empty() && rappor_service) { |
696 rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, | 677 rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, |
697 requesting_origin); | 678 requesting_origin); |
698 | 679 |
699 std::string rappor_metric = deprecated_metric + "2"; | 680 std::string rappor_metric = deprecated_metric + "2"; |
700 rappor_service->RecordSample( | 681 rappor_service->RecordSample( |
701 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 682 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
702 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 683 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
703 } | 684 } |
704 } | 685 } |
OLD | NEW |