Chromium Code Reviews| 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 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |