| 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" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
| 13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
| 14 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" | 14 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" |
| 15 #include "chrome/browser/permissions/permission_manager.h" | |
| 16 #include "chrome/browser/permissions/permission_request.h" | 15 #include "chrome/browser/permissions/permission_request.h" |
| 17 #include "chrome/browser/permissions/permission_util.h" | 16 #include "chrome/browser/permissions/permission_util.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 18 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 20 #include "chrome/browser/safe_browsing/ui_manager.h" | 19 #include "chrome/browser/safe_browsing/ui_manager.h" |
| 21 #include "chrome/browser/sync/profile_sync_service_factory.h" | 20 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 22 #include "chrome/common/chrome_switches.h" | 21 #include "chrome/common/chrome_switches.h" |
| 23 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
| 24 #include "components/browser_sync/profile_sync_service.h" | 23 #include "components/browser_sync/profile_sync_service.h" |
| 25 #include "components/prefs/pref_service.h" | 24 #include "components/prefs/pref_service.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 action_str = "Revoked"; | 83 action_str = "Revoked"; |
| 85 break; | 84 break; |
| 86 default: | 85 default: |
| 87 NOTREACHED(); | 86 NOTREACHED(); |
| 88 break; | 87 break; |
| 89 } | 88 } |
| 90 | 89 |
| 91 std::string permission_str = PermissionUtil::GetPermissionString(permission); | 90 std::string permission_str = PermissionUtil::GetPermissionString(permission); |
| 92 if (permission_str.empty()) | 91 if (permission_str.empty()) |
| 93 return ""; | 92 return ""; |
| 94 return base::StringPrintf("ContentSettings.PermissionActions_%s.%s.Url", | 93 return base::StringPrintf("ContentSettings.PermissionActions_%s.%s.Url2", |
| 95 permission_str.c_str(), action_str.c_str()); | 94 permission_str.c_str(), action_str.c_str()); |
| 96 } | 95 } |
| 97 | 96 |
| 98 void RecordPermissionRequest(ContentSettingsType content_type, | 97 void RecordPermissionRequest(ContentSettingsType content_type, |
| 99 const GURL& requesting_origin, | 98 const GURL& requesting_origin, |
| 100 const GURL& embedding_origin, | 99 const GURL& embedding_origin, |
| 101 Profile* profile) { | 100 Profile* profile) { |
| 102 rappor::RapporServiceImpl* rappor_service = | 101 rappor::RapporServiceImpl* rappor_service = |
| 103 g_browser_process->rappor_service(); | 102 g_browser_process->rappor_service(); |
| 104 if (rappor_service) { | 103 if (rappor_service) { |
| 105 if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { | 104 if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { |
| 106 // TODO(dominickn): remove this deprecated metric - crbug.com/605836. | |
| 107 rappor::SampleDomainAndRegistryFromGURL( | |
| 108 rappor_service, "ContentSettings.PermissionRequested.Geolocation.Url", | |
| 109 requesting_origin); | |
| 110 rappor_service->RecordSampleString( | 105 rappor_service->RecordSampleString( |
| 111 "ContentSettings.PermissionRequested.Geolocation.Url2", | 106 "ContentSettings.PermissionRequested.Geolocation.Url2", |
| 112 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 107 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 113 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 108 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
| 114 } else if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { | 109 } else if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { |
| 115 // TODO(dominickn): remove this deprecated metric - crbug.com/605836. | |
| 116 rappor::SampleDomainAndRegistryFromGURL( | |
| 117 rappor_service, | |
| 118 "ContentSettings.PermissionRequested.Notifications.Url", | |
| 119 requesting_origin); | |
| 120 rappor_service->RecordSampleString( | 110 rappor_service->RecordSampleString( |
| 121 "ContentSettings.PermissionRequested.Notifications.Url2", | 111 "ContentSettings.PermissionRequested.Notifications.Url2", |
| 122 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 112 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 123 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 113 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
| 124 } else if (content_type == CONTENT_SETTINGS_TYPE_MIDI || | 114 } else if (content_type == CONTENT_SETTINGS_TYPE_MIDI || |
| 125 content_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) { | 115 content_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) { |
| 126 // TODO(dominickn): remove this deprecated metric - crbug.com/605836. | |
| 127 rappor::SampleDomainAndRegistryFromGURL( | |
| 128 rappor_service, "ContentSettings.PermissionRequested.Midi.Url", | |
| 129 requesting_origin); | |
| 130 rappor_service->RecordSampleString( | 116 rappor_service->RecordSampleString( |
| 131 "ContentSettings.PermissionRequested.Midi.Url2", | 117 "ContentSettings.PermissionRequested.Midi.Url2", |
| 132 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 118 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 133 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 119 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
| 134 } else if (content_type == | 120 } else if (content_type == |
| 135 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER) { | 121 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER) { |
| 136 rappor_service->RecordSampleString( | 122 rappor_service->RecordSampleString( |
| 137 "ContentSettings.PermissionRequested.ProtectedMedia.Url2", | 123 "ContentSettings.PermissionRequested.ProtectedMedia.Url2", |
| 138 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 124 rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 139 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 125 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 153 UMA_HISTOGRAM_ENUMERATION( | 139 UMA_HISTOGRAM_ENUMERATION( |
| 154 "ContentSettings.PermissionRequested_SecureOrigin", | 140 "ContentSettings.PermissionRequested_SecureOrigin", |
| 155 static_cast<base::HistogramBase::Sample>(permission), | 141 static_cast<base::HistogramBase::Sample>(permission), |
| 156 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); | 142 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); |
| 157 } else { | 143 } else { |
| 158 UMA_HISTOGRAM_ENUMERATION( | 144 UMA_HISTOGRAM_ENUMERATION( |
| 159 "ContentSettings.PermissionRequested_InsecureOrigin", | 145 "ContentSettings.PermissionRequested_InsecureOrigin", |
| 160 static_cast<base::HistogramBase::Sample>(permission), | 146 static_cast<base::HistogramBase::Sample>(permission), |
| 161 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); | 147 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); |
| 162 } | 148 } |
| 163 | |
| 164 // In order to gauge the compatibility risk of implementing an improved | |
| 165 // iframe permissions security model, we would like to know the ratio of | |
| 166 // same-origin to cross-origin permission requests. Our estimate of this | |
| 167 // ratio could be somewhat biased by repeated requests coming from a | |
| 168 // single frame, but we expect this to be insignificant. | |
| 169 if (requesting_origin.GetOrigin() != embedding_origin.GetOrigin()) { | |
| 170 PermissionManager* manager = PermissionManager::Get(profile); | |
| 171 if (!manager) | |
| 172 return; | |
| 173 blink::mojom::PermissionStatus embedding_permission_status = | |
| 174 manager->GetPermissionStatus(content_type, embedding_origin, | |
| 175 embedding_origin); | |
| 176 | |
| 177 base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( | |
| 178 "Permissions.Requested.CrossOrigin_" + | |
| 179 PermissionUtil::GetPermissionString(content_type), | |
| 180 1, static_cast<int>(blink::mojom::PermissionStatus::LAST), | |
| 181 static_cast<int>(blink::mojom::PermissionStatus::LAST) + 1, | |
| 182 base::HistogramBase::kUmaTargetedHistogramFlag); | |
| 183 histogram->Add(static_cast<int>(embedding_permission_status)); | |
| 184 } else { | |
| 185 UMA_HISTOGRAM_ENUMERATION( | |
| 186 "Permissions.Requested.SameOrigin", | |
| 187 static_cast<base::HistogramBase::Sample>(permission), | |
| 188 static_cast<base::HistogramBase::Sample>(PermissionType::NUM)); | |
| 189 } | |
| 190 } | 149 } |
| 191 | 150 |
| 192 } // anonymous namespace | 151 } // anonymous namespace |
| 193 | 152 |
| 194 // PermissionReportInfo ------------------------------------------------------- | 153 // PermissionReportInfo ------------------------------------------------------- |
| 195 PermissionReportInfo::PermissionReportInfo( | 154 PermissionReportInfo::PermissionReportInfo( |
| 196 const GURL& origin, | 155 const GURL& origin, |
| 197 ContentSettingsType permission, | 156 ContentSettingsType permission, |
| 198 PermissionAction action, | 157 PermissionAction action, |
| 199 PermissionSourceUI source_ui, | 158 PermissionSourceUI source_ui, |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 PermissionPersistDecision::UNSPECIFIED, | 645 PermissionPersistDecision::UNSPECIFIED, |
| 687 autoblocker->GetDismissCount(requesting_origin, permission), | 646 autoblocker->GetDismissCount(requesting_origin, permission), |
| 688 autoblocker->GetIgnoreCount(requesting_origin, permission)); | 647 autoblocker->GetIgnoreCount(requesting_origin, permission)); |
| 689 g_browser_process->safe_browsing_service() | 648 g_browser_process->safe_browsing_service() |
| 690 ->ui_manager()->ReportPermissionAction(report_info); | 649 ->ui_manager()->ReportPermissionAction(report_info); |
| 691 } | 650 } |
| 692 | 651 |
| 693 bool secure_origin = content::IsOriginSecure(requesting_origin); | 652 bool secure_origin = content::IsOriginSecure(requesting_origin); |
| 694 | 653 |
| 695 switch (permission) { | 654 switch (permission) { |
| 655 // Geolocation, MidiSysEx, Push, Durable Storage, and Media permissions are |
| 656 // disabled on insecure origins, so there's no need to record metrics for |
| 657 // secure/insecue. |
| 696 case CONTENT_SETTINGS_TYPE_GEOLOCATION: | 658 case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
| 697 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Geolocation", | 659 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.Geolocation", |
| 698 "Permissions.Action.SecureOrigin.Geolocation", | 660 static_cast<int>(action), |
| 699 "Permissions.Action.InsecureOrigin.Geolocation", | 661 static_cast<int>(PermissionAction::NUM)); |
| 700 action); | |
| 701 break; | 662 break; |
| 702 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: | 663 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
| 703 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Notifications", | 664 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Notifications", |
| 704 "Permissions.Action.SecureOrigin.Notifications", | 665 "Permissions.Action.SecureOrigin.Notifications", |
| 705 "Permissions.Action.InsecureOrigin.Notifications", | 666 "Permissions.Action.InsecureOrigin.Notifications", |
| 706 action); | 667 action); |
| 707 break; | 668 break; |
| 708 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: | 669 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
| 709 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.MidiSysEx", | 670 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.MidiSysEx", |
| 710 "Permissions.Action.SecureOrigin.MidiSysEx", | 671 static_cast<int>(action), |
| 711 "Permissions.Action.InsecureOrigin.MidiSysEx", | 672 static_cast<int>(PermissionAction::NUM)); |
| 712 action); | |
| 713 break; | 673 break; |
| 714 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: | 674 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: |
| 715 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.PushMessaging", | 675 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.PushMessaging", |
| 716 "Permissions.Action.SecureOrigin.PushMessaging", | 676 static_cast<int>(action), |
| 717 "Permissions.Action.InsecureOrigin.PushMessaging", | 677 static_cast<int>(PermissionAction::NUM)); |
| 718 action); | |
| 719 break; | 678 break; |
| 720 case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: | 679 case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
| 721 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.ProtectedMedia", | 680 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.ProtectedMedia", |
| 722 "Permissions.Action.SecureOrigin.ProtectedMedia", | 681 "Permissions.Action.SecureOrigin.ProtectedMedia", |
| 723 "Permissions.Action.InsecureOrigin.ProtectedMedia", | 682 "Permissions.Action.InsecureOrigin.ProtectedMedia", |
| 724 action); | 683 action); |
| 725 break; | 684 break; |
| 726 case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: | 685 case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
| 727 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.DurableStorage", | 686 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.DurableStorage", |
| 728 "Permissions.Action.SecureOrigin.DurableStorage", | 687 static_cast<int>(action), |
| 729 "Permissions.Action.InsecureOrigin.DurableStorage", | 688 static_cast<int>(PermissionAction::NUM)); |
| 730 action); | |
| 731 break; | 689 break; |
| 732 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: | 690 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: |
| 733 // Media permissions are disabled on insecure origins, so there's no | |
| 734 // need to record metrics for secure/insecue. | |
| 735 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.AudioCapture", | 691 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.AudioCapture", |
| 736 static_cast<int>(action), | 692 static_cast<int>(action), |
| 737 static_cast<int>(PermissionAction::NUM)); | 693 static_cast<int>(PermissionAction::NUM)); |
| 738 break; | 694 break; |
| 739 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: | 695 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: |
| 740 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.VideoCapture", | 696 UMA_HISTOGRAM_ENUMERATION("Permissions.Action.VideoCapture", |
| 741 static_cast<int>(action), | 697 static_cast<int>(action), |
| 742 static_cast<int>(PermissionAction::NUM)); | 698 static_cast<int>(PermissionAction::NUM)); |
| 743 break; | 699 break; |
| 744 case CONTENT_SETTINGS_TYPE_PLUGINS: | 700 case CONTENT_SETTINGS_TYPE_PLUGINS: |
| 745 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Flash", | 701 PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Flash", |
| 746 "Permissions.Action.SecureOrigin.Flash", | 702 "Permissions.Action.SecureOrigin.Flash", |
| 747 "Permissions.Action.InsecureOrigin.Flash", action); | 703 "Permissions.Action.InsecureOrigin.Flash", action); |
| 748 break; | 704 break; |
| 749 // The user is not prompted for these permissions, thus there is no | 705 // The user is not prompted for these permissions, thus there is no |
| 750 // permission action recorded for them. | 706 // permission action recorded for them. |
| 751 default: | 707 default: |
| 752 NOTREACHED() << "PERMISSION " | 708 NOTREACHED() << "PERMISSION " |
| 753 << PermissionUtil::GetPermissionString(permission) | 709 << PermissionUtil::GetPermissionString(permission) |
| 754 << " not accounted for"; | 710 << " not accounted for"; |
| 755 } | 711 } |
| 756 | 712 |
| 757 // Retrieve the name of the RAPPOR metric. Currently, the new metric name is | 713 const std::string rappor_metric = GetRapporMetric(permission, action); |
| 758 // the deprecated name with "2" on the end, e.g. | |
| 759 // ContentSettings.PermissionActions_Geolocation.Granted.Url2. For simplicity, | |
| 760 // we retrieve the deprecated name and append the "2" for the new name. | |
| 761 // TODO(dominickn): remove the deprecated metric and replace it solely with | |
| 762 // the new one in GetRapporMetric - crbug.com/605836. | |
| 763 const std::string deprecated_metric = GetRapporMetric(permission, action); | |
| 764 rappor::RapporServiceImpl* rappor_service = | 714 rappor::RapporServiceImpl* rappor_service = |
| 765 g_browser_process->rappor_service(); | 715 g_browser_process->rappor_service(); |
| 766 if (!deprecated_metric.empty() && rappor_service) { | 716 if (!rappor_metric.empty() && rappor_service) { |
| 767 rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, | |
| 768 requesting_origin); | |
| 769 | |
| 770 std::string rappor_metric = deprecated_metric + "2"; | |
| 771 rappor_service->RecordSampleString( | 717 rappor_service->RecordSampleString( |
| 772 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 718 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 773 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 719 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
| 774 } | 720 } |
| 775 } | 721 } |
| OLD | NEW |