| 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_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "components/browser_sync/profile_sync_service.h" | 23 #include "components/browser_sync/profile_sync_service.h" |
| 24 #include "components/prefs/pref_service.h" | 24 #include "components/prefs/pref_service.h" |
| 25 #include "components/rappor/public/rappor_utils.h" | 25 #include "components/rappor/public/rappor_utils.h" |
| 26 #include "components/rappor/rappor_service_impl.h" | 26 #include "components/rappor/rappor_service_impl.h" |
| 27 #include "content/public/browser/permission_type.h" | 27 #include "content/public/browser/permission_type.h" |
| 28 #include "content/public/common/origin_util.h" | 28 #include "content/public/common/origin_util.h" |
| 29 #include "url/gurl.h" | 29 #include "url/gurl.h" |
| 30 | 30 |
| 31 // UMA keys need to be statically initialized so plain function would not | 31 // UMA keys need to be statically initialized so plain function would not |
| 32 // work. Use macros instead. | 32 // work. Use macros instead. |
| 33 #define PERMISSION_ACTION_UMA(secure_origin, permission, permission_secure, \ | 33 #define PERMISSION_ACTION_UMA(secure_origin, permission, permission_secure, \ |
| 34 permission_insecure, action) \ | 34 permission_insecure, action) \ |
| 35 UMA_HISTOGRAM_ENUMERATION(permission, static_cast<int>(action), \ | 35 UMA_HISTOGRAM_ENUMERATION(permission, action, PermissionAction::NUM); \ |
| 36 static_cast<int>(PermissionAction::NUM)); \ | 36 if (secure_origin) { \ |
| 37 if (secure_origin) { \ | 37 UMA_HISTOGRAM_ENUMERATION(permission_secure, action, \ |
| 38 UMA_HISTOGRAM_ENUMERATION(permission_secure, static_cast<int>(action), \ | 38 PermissionAction::NUM); \ |
| 39 static_cast<int>(PermissionAction::NUM)); \ | 39 } else { \ |
| 40 } else { \ | 40 UMA_HISTOGRAM_ENUMERATION(permission_insecure, action, \ |
| 41 UMA_HISTOGRAM_ENUMERATION(permission_insecure, static_cast<int>(action), \ | 41 PermissionAction::NUM); \ |
| 42 static_cast<int>(PermissionAction::NUM)); \ | |
| 43 } | 42 } |
| 44 | 43 |
| 45 #define PERMISSION_BUBBLE_TYPE_UMA(metric_name, permission_bubble_type) \ | 44 #define PERMISSION_BUBBLE_TYPE_UMA(metric_name, permission_bubble_type) \ |
| 46 UMA_HISTOGRAM_ENUMERATION( \ | 45 UMA_HISTOGRAM_ENUMERATION(metric_name, permission_bubble_type, \ |
| 47 metric_name, \ | 46 PermissionRequestType::NUM) |
| 48 static_cast<base::HistogramBase::Sample>(permission_bubble_type), \ | |
| 49 static_cast<base::HistogramBase::Sample>(PermissionRequestType::NUM)) | |
| 50 | 47 |
| 51 #define PERMISSION_BUBBLE_GESTURE_TYPE_UMA(gesture_metric_name, \ | 48 #define PERMISSION_BUBBLE_GESTURE_TYPE_UMA(gesture_metric_name, \ |
| 52 no_gesture_metric_name, \ | 49 no_gesture_metric_name, \ |
| 53 gesture_type, \ | 50 gesture_type, \ |
| 54 permission_bubble_type) \ | 51 permission_bubble_type) \ |
| 55 if (gesture_type == PermissionRequestGestureType::GESTURE) { \ | 52 if (gesture_type == PermissionRequestGestureType::GESTURE) { \ |
| 56 PERMISSION_BUBBLE_TYPE_UMA(gesture_metric_name, permission_bubble_type); \ | 53 PERMISSION_BUBBLE_TYPE_UMA(gesture_metric_name, permission_bubble_type); \ |
| 57 } else if (gesture_type == PermissionRequestGestureType::NO_GESTURE) { \ | 54 } else if (gesture_type == PermissionRequestGestureType::NO_GESTURE) { \ |
| 58 PERMISSION_BUBBLE_TYPE_UMA(no_gesture_metric_name, \ | 55 PERMISSION_BUBBLE_TYPE_UMA(no_gesture_metric_name, \ |
| 59 permission_bubble_type); \ | 56 permission_bubble_type); \ |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 121 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 125 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 122 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
| 126 } | 123 } |
| 127 } | 124 } |
| 128 | 125 |
| 129 PermissionType permission; | 126 PermissionType permission; |
| 130 bool success = PermissionUtil::GetPermissionType(content_type, &permission); | 127 bool success = PermissionUtil::GetPermissionType(content_type, &permission); |
| 131 DCHECK(success); | 128 DCHECK(success); |
| 132 | 129 |
| 133 bool secure_origin = content::IsOriginSecure(requesting_origin); | 130 bool secure_origin = content::IsOriginSecure(requesting_origin); |
| 134 UMA_HISTOGRAM_ENUMERATION( | 131 UMA_HISTOGRAM_ENUMERATION("ContentSettings.PermissionRequested", permission, |
| 135 "ContentSettings.PermissionRequested", | 132 PermissionType::NUM); |
| 136 static_cast<base::HistogramBase::Sample>(permission), | |
| 137 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); | |
| 138 if (secure_origin) { | 133 if (secure_origin) { |
| 139 UMA_HISTOGRAM_ENUMERATION( | 134 UMA_HISTOGRAM_ENUMERATION( |
| 140 "ContentSettings.PermissionRequested_SecureOrigin", | 135 "ContentSettings.PermissionRequested_SecureOrigin", permission, |
| 141 static_cast<base::HistogramBase::Sample>(permission), | 136 PermissionType::NUM); |
| 142 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); | |
| 143 } else { | 137 } else { |
| 144 UMA_HISTOGRAM_ENUMERATION( | 138 UMA_HISTOGRAM_ENUMERATION( |
| 145 "ContentSettings.PermissionRequested_InsecureOrigin", | 139 "ContentSettings.PermissionRequested_InsecureOrigin", permission, |
| 146 static_cast<base::HistogramBase::Sample>(permission), | 140 PermissionType::NUM); |
| 147 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); | |
| 148 } | 141 } |
| 149 } | 142 } |
| 150 | 143 |
| 151 } // anonymous namespace | 144 } // anonymous namespace |
| 152 | 145 |
| 153 // PermissionReportInfo ------------------------------------------------------- | 146 // PermissionReportInfo ------------------------------------------------------- |
| 154 PermissionReportInfo::PermissionReportInfo( | 147 PermissionReportInfo::PermissionReportInfo( |
| 155 const GURL& origin, | 148 const GURL& origin, |
| 156 ContentSettingsType permission, | 149 ContentSettingsType permission, |
| 157 PermissionAction action, | 150 PermissionAction action, |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 // applicable in prompt UIs where revocations are not possible. | 316 // applicable in prompt UIs where revocations are not possible. |
| 324 RecordPermissionAction(permission, PermissionAction::REVOKED, source_ui, | 317 RecordPermissionAction(permission, PermissionAction::REVOKED, source_ui, |
| 325 PermissionRequestGestureType::UNKNOWN, | 318 PermissionRequestGestureType::UNKNOWN, |
| 326 revoked_origin, profile); | 319 revoked_origin, profile); |
| 327 } | 320 } |
| 328 } | 321 } |
| 329 | 322 |
| 330 void PermissionUmaUtil::RecordEmbargoPromptSuppression( | 323 void PermissionUmaUtil::RecordEmbargoPromptSuppression( |
| 331 PermissionEmbargoStatus embargo_status) { | 324 PermissionEmbargoStatus embargo_status) { |
| 332 UMA_HISTOGRAM_ENUMERATION("Permissions.AutoBlocker.EmbargoPromptSuppression", | 325 UMA_HISTOGRAM_ENUMERATION("Permissions.AutoBlocker.EmbargoPromptSuppression", |
| 333 static_cast<int>(embargo_status), | 326 embargo_status, PermissionEmbargoStatus::NUM); |
| 334 static_cast<int>(PermissionEmbargoStatus::NUM)); | |
| 335 } | 327 } |
| 336 | 328 |
| 337 void PermissionUmaUtil::RecordEmbargoPromptSuppressionFromSource( | 329 void PermissionUmaUtil::RecordEmbargoPromptSuppressionFromSource( |
| 338 PermissionStatusSource source) { | 330 PermissionStatusSource source) { |
| 339 // Explicitly switch to ensure that any new PermissionStatusSource values are | 331 // Explicitly switch to ensure that any new PermissionStatusSource values are |
| 340 // dealt with appropriately. | 332 // dealt with appropriately. |
| 341 switch (source) { | 333 switch (source) { |
| 342 case PermissionStatusSource::MULTIPLE_DISMISSALS: | 334 case PermissionStatusSource::MULTIPLE_DISMISSALS: |
| 343 PermissionUmaUtil::RecordEmbargoPromptSuppression( | 335 PermissionUmaUtil::RecordEmbargoPromptSuppression( |
| 344 PermissionEmbargoStatus::REPEATED_DISMISSALS); | 336 PermissionEmbargoStatus::REPEATED_DISMISSALS); |
| 345 break; | 337 break; |
| 346 case PermissionStatusSource::SAFE_BROWSING_BLACKLIST: | 338 case PermissionStatusSource::SAFE_BROWSING_BLACKLIST: |
| 347 PermissionUmaUtil::RecordEmbargoPromptSuppression( | 339 PermissionUmaUtil::RecordEmbargoPromptSuppression( |
| 348 PermissionEmbargoStatus::PERMISSIONS_BLACKLISTING); | 340 PermissionEmbargoStatus::PERMISSIONS_BLACKLISTING); |
| 349 break; | 341 break; |
| 350 case PermissionStatusSource::UNSPECIFIED: | 342 case PermissionStatusSource::UNSPECIFIED: |
| 351 case PermissionStatusSource::KILL_SWITCH: | 343 case PermissionStatusSource::KILL_SWITCH: |
| 352 // The permission wasn't under embargo, so don't record anything. We may | 344 // The permission wasn't under embargo, so don't record anything. We may |
| 353 // embargo it later. | 345 // embargo it later. |
| 354 break; | 346 break; |
| 355 } | 347 } |
| 356 } | 348 } |
| 357 | 349 |
| 358 void PermissionUmaUtil::RecordEmbargoStatus( | 350 void PermissionUmaUtil::RecordEmbargoStatus( |
| 359 PermissionEmbargoStatus embargo_status) { | 351 PermissionEmbargoStatus embargo_status) { |
| 360 UMA_HISTOGRAM_ENUMERATION("Permissions.AutoBlocker.EmbargoStatus", | 352 UMA_HISTOGRAM_ENUMERATION("Permissions.AutoBlocker.EmbargoStatus", |
| 361 static_cast<int>(embargo_status), | 353 embargo_status, PermissionEmbargoStatus::NUM); |
| 362 static_cast<int>(PermissionEmbargoStatus::NUM)); | |
| 363 } | 354 } |
| 364 | 355 |
| 365 void PermissionUmaUtil::RecordSafeBrowsingResponse( | 356 void PermissionUmaUtil::RecordSafeBrowsingResponse( |
| 366 base::TimeDelta response_time, | 357 base::TimeDelta response_time, |
| 367 SafeBrowsingResponse response) { | 358 SafeBrowsingResponse response) { |
| 368 UMA_HISTOGRAM_TIMES("Permissions.AutoBlocker.SafeBrowsingResponseTime", | 359 UMA_HISTOGRAM_TIMES("Permissions.AutoBlocker.SafeBrowsingResponseTime", |
| 369 response_time); | 360 response_time); |
| 370 UMA_HISTOGRAM_ENUMERATION("Permissions.AutoBlocker.SafeBrowsingResponse", | 361 UMA_HISTOGRAM_ENUMERATION("Permissions.AutoBlocker.SafeBrowsingResponse", |
| 371 static_cast<int>(response), | 362 response, SafeBrowsingResponse::NUM); |
| 372 static_cast<int>(SafeBrowsingResponse::NUM)); | |
| 373 } | 363 } |
| 374 | 364 |
| 375 void PermissionUmaUtil::PermissionPromptShown( | 365 void PermissionUmaUtil::PermissionPromptShown( |
| 376 const std::vector<PermissionRequest*>& requests) { | 366 const std::vector<PermissionRequest*>& requests) { |
| 377 DCHECK(!requests.empty()); | 367 DCHECK(!requests.empty()); |
| 378 | 368 |
| 379 PermissionRequestType permission_prompt_type = | 369 PermissionRequestType permission_prompt_type = |
| 380 PermissionRequestType::MULTIPLE; | 370 PermissionRequestType::MULTIPLE; |
| 381 PermissionRequestGestureType permission_gesture_type = | 371 PermissionRequestGestureType permission_gesture_type = |
| 382 PermissionRequestGestureType::UNKNOWN; | 372 PermissionRequestGestureType::UNKNOWN; |
| 383 if (requests.size() == 1) { | 373 if (requests.size() == 1) { |
| 384 permission_prompt_type = requests[0]->GetPermissionRequestType(); | 374 permission_prompt_type = requests[0]->GetPermissionRequestType(); |
| 385 permission_gesture_type = requests[0]->GetGestureType(); | 375 permission_gesture_type = requests[0]->GetGestureType(); |
| 386 } | 376 } |
| 387 | 377 |
| 388 RecordPermissionPromptShown(permission_prompt_type, permission_gesture_type); | 378 RecordPermissionPromptShown(permission_prompt_type, permission_gesture_type); |
| 389 | 379 |
| 390 UMA_HISTOGRAM_ENUMERATION( | 380 UMA_HISTOGRAM_ENUMERATION(kPermissionsPromptRequestsPerPrompt, |
| 391 kPermissionsPromptRequestsPerPrompt, | 381 requests.size(), 10); |
| 392 static_cast<base::HistogramBase::Sample>(requests.size()), | |
| 393 static_cast<base::HistogramBase::Sample>(10)); | |
| 394 | 382 |
| 395 if (requests.size() > 1) { | 383 if (requests.size() > 1) { |
| 396 for (const auto* request : requests) { | 384 for (const auto* request : requests) { |
| 397 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleTypes, | 385 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleTypes, |
| 398 request->GetPermissionRequestType()); | 386 request->GetPermissionRequestType()); |
| 399 } | 387 } |
| 400 } | 388 } |
| 401 } | 389 } |
| 402 | 390 |
| 403 void PermissionUmaUtil::PermissionPromptAccepted( | 391 void PermissionUmaUtil::PermissionPromptAccepted( |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 ->ui_manager()->ReportPermissionAction(report_info); | 637 ->ui_manager()->ReportPermissionAction(report_info); |
| 650 } | 638 } |
| 651 | 639 |
| 652 bool secure_origin = content::IsOriginSecure(requesting_origin); | 640 bool secure_origin = content::IsOriginSecure(requesting_origin); |
| 653 | 641 |
| 654 switch (permission) { | 642 switch (permission) { |
| 655 // Geolocation, MidiSysEx, Push, Durable Storage, and Media permissions are | 643 // Geolocation, MidiSysEx, Push, Durable Storage, and Media permissions are |
| 656 // disabled on insecure origins, so there's no need to record metrics for | 644 // disabled on insecure origins, so there's no need to record metrics for |
| 657 // secure/insecue. | 645 // secure/insecue. |
| 658 case CONTENT_SETTINGS_TYPE_GEOLOCATION: | 646 case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
| 659 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.Geolocation", | 647 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.Geolocation", action, |
| 660 static_cast<int>(action), | 648 PermissionAction::NUM); |
| 661 static_cast<int>(PermissionAction::NUM)); | |
| 662 break; | 649 break; |
| 663 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: | 650 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
| 664 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Notifications", | 651 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Notifications", |
| 665 "Permissions.Action.SecureOrigin.Notifications", | 652 "Permissions.Action.SecureOrigin.Notifications", |
| 666 "Permissions.Action.InsecureOrigin.Notifications", | 653 "Permissions.Action.InsecureOrigin.Notifications", |
| 667 action); | 654 action); |
| 668 break; | 655 break; |
| 669 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: | 656 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
| 670 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.MidiSysEx", | 657 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.MidiSysEx", action, |
| 671 static_cast<int>(action), | 658 PermissionAction::NUM); |
| 672 static_cast<int>(PermissionAction::NUM)); | |
| 673 break; | 659 break; |
| 674 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: | 660 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: |
| 675 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.PushMessaging", | 661 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.PushMessaging", action, |
| 676 static_cast<int>(action), | 662 PermissionAction::NUM); |
| 677 static_cast<int>(PermissionAction::NUM)); | |
| 678 break; | 663 break; |
| 679 case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: | 664 case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
| 680 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.ProtectedMedia", | 665 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.ProtectedMedia", |
| 681 "Permissions.Action.SecureOrigin.ProtectedMedia", | 666 "Permissions.Action.SecureOrigin.ProtectedMedia", |
| 682 "Permissions.Action.InsecureOrigin.ProtectedMedia", | 667 "Permissions.Action.InsecureOrigin.ProtectedMedia", |
| 683 action); | 668 action); |
| 684 break; | 669 break; |
| 685 case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: | 670 case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
| 686 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.DurableStorage", | 671 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.DurableStorage", action, |
| 687 static_cast<int>(action), | 672 PermissionAction::NUM); |
| 688 static_cast<int>(PermissionAction::NUM)); | |
| 689 break; | 673 break; |
| 690 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: | 674 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: |
| 691 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.AudioCapture", | 675 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.AudioCapture", action, |
| 692 static_cast<int>(action), | 676 PermissionAction::NUM); |
| 693 static_cast<int>(PermissionAction::NUM)); | |
| 694 break; | 677 break; |
| 695 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: | 678 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: |
| 696 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.VideoCapture", | 679 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.VideoCapture", action, |
| 697 static_cast<int>(action), | 680 PermissionAction::NUM); |
| 698 static_cast<int>(PermissionAction::NUM)); | |
| 699 break; | 681 break; |
| 700 case CONTENT_SETTINGS_TYPE_PLUGINS: | 682 case CONTENT_SETTINGS_TYPE_PLUGINS: |
| 701 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Flash", | 683 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Flash", |
| 702 "Permissions.Action.SecureOrigin.Flash", | 684 "Permissions.Action.SecureOrigin.Flash", |
| 703 "Permissions.Action.InsecureOrigin.Flash", action); | 685 "Permissions.Action.InsecureOrigin.Flash", action); |
| 704 break; | 686 break; |
| 705 // The user is not prompted for these permissions, thus there is no | 687 // The user is not prompted for these permissions, thus there is no |
| 706 // permission action recorded for them. | 688 // permission action recorded for them. |
| 707 default: | 689 default: |
| 708 NOTREACHED() << "PERMISSION " | 690 NOTREACHED() << "PERMISSION " |
| 709 << PermissionUtil::GetPermissionString(permission) | 691 << PermissionUtil::GetPermissionString(permission) |
| 710 << " not accounted for"; | 692 << " not accounted for"; |
| 711 } | 693 } |
| 712 | 694 |
| 713 const std::string rappor_metric = GetRapporMetric(permission, action); | 695 const std::string rappor_metric = GetRapporMetric(permission, action); |
| 714 rappor::RapporServiceImpl* rappor_service = | 696 rappor::RapporServiceImpl* rappor_service = |
| 715 g_browser_process->rappor_service(); | 697 g_browser_process->rappor_service(); |
| 716 if (!rappor_metric.empty() && rappor_service) { | 698 if (!rappor_metric.empty() && rappor_service) { |
| 717 rappor_service->RecordSampleString( | 699 rappor_service->RecordSampleString( |
| 718 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 700 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 719 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 701 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
| 720 } | 702 } |
| 721 } | 703 } |
| OLD | NEW |