| 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 |