Index: chrome/browser/permissions/permission_uma_util.cc |
diff --git a/chrome/browser/permissions/permission_uma_util.cc b/chrome/browser/permissions/permission_uma_util.cc |
index efbdf5f04b6c65ff92efbb88a5fa6d95f2c44fb1..70324dd516908e38589b4eabab7780f1869396de 100644 |
--- a/chrome/browser/permissions/permission_uma_util.cc |
+++ b/chrome/browser/permissions/permission_uma_util.cc |
@@ -6,13 +6,21 @@ |
#include <utility> |
+#include "base/command_line.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/strings/stringprintf.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/permissions/permission_manager.h" |
#include "chrome/browser/permissions/permission_util.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/safe_browsing/safe_browsing_service.h" |
+#include "chrome/browser/safe_browsing/ui_manager.h" |
+#include "chrome/browser/sync/profile_sync_service_factory.h" |
#include "chrome/browser/ui/website_settings/permission_bubble_request.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/pref_names.h" |
+#include "components/browser_sync/browser/profile_sync_service.h" |
+#include "components/prefs/pref_service.h" |
#include "components/rappor/rappor_service.h" |
#include "components/rappor/rappor_utils.h" |
#include "content/public/browser/permission_type.h" |
@@ -74,99 +82,6 @@ const std::string GetRapporMetric(PermissionType permission, |
permission_str.c_str(), action_str.c_str()); |
} |
-void RecordPermissionAction(PermissionType permission, |
- PermissionAction action, |
- const GURL& requesting_origin) { |
- bool secure_origin = content::IsOriginSecure(requesting_origin); |
- |
- switch (permission) { |
- case PermissionType::GEOLOCATION: |
- PERMISSION_ACTION_UMA( |
- secure_origin, |
- "Permissions.Action.Geolocation", |
- "Permissions.Action.SecureOrigin.Geolocation", |
- "Permissions.Action.InsecureOrigin.Geolocation", |
- action); |
- break; |
- case PermissionType::NOTIFICATIONS: |
- PERMISSION_ACTION_UMA( |
- secure_origin, |
- "Permissions.Action.Notifications", |
- "Permissions.Action.SecureOrigin.Notifications", |
- "Permissions.Action.InsecureOrigin.Notifications", |
- action); |
- break; |
- case PermissionType::MIDI_SYSEX: |
- PERMISSION_ACTION_UMA( |
- secure_origin, |
- "Permissions.Action.MidiSysEx", |
- "Permissions.Action.SecureOrigin.MidiSysEx", |
- "Permissions.Action.InsecureOrigin.MidiSysEx", |
- action); |
- break; |
- case PermissionType::PUSH_MESSAGING: |
- PERMISSION_ACTION_UMA( |
- secure_origin, |
- "Permissions.Action.PushMessaging", |
- "Permissions.Action.SecureOrigin.PushMessaging", |
- "Permissions.Action.InsecureOrigin.PushMessaging", |
- action); |
- break; |
- case PermissionType::PROTECTED_MEDIA_IDENTIFIER: |
- PERMISSION_ACTION_UMA( |
- secure_origin, |
- "Permissions.Action.ProtectedMedia", |
- "Permissions.Action.SecureOrigin.ProtectedMedia", |
- "Permissions.Action.InsecureOrigin.ProtectedMedia", |
- action); |
- break; |
- case PermissionType::DURABLE_STORAGE: |
- PERMISSION_ACTION_UMA( |
- secure_origin, |
- "Permissions.Action.DurableStorage", |
- "Permissions.Action.SecureOrigin.DurableStorage", |
- "Permissions.Action.InsecureOrigin.DurableStorage", |
- action); |
- break; |
- case PermissionType::AUDIO_CAPTURE: |
- // Media permissions are disabled on insecure origins, so there's no |
- // need to record metrics for secure/insecue. |
- UMA_HISTOGRAM_ENUMERATION("Permissions.Action.AudioCapture", action, |
- PERMISSION_ACTION_NUM); |
- break; |
- case PermissionType::VIDEO_CAPTURE: |
- UMA_HISTOGRAM_ENUMERATION("Permissions.Action.VideoCapture", action, |
- PERMISSION_ACTION_NUM); |
- break; |
- // The user is not prompted for these permissions, thus there is no |
- // permission action recorded for them. |
- case PermissionType::MIDI: |
- case PermissionType::BACKGROUND_SYNC: |
- case PermissionType::NUM: |
- NOTREACHED() << "PERMISSION " |
- << PermissionUtil::GetPermissionString(permission) |
- << " not accounted for"; |
- } |
- |
- // Retrieve the name of the RAPPOR metric. Currently, the new metric name is |
- // the deprecated name with "2" on the end, e.g. |
- // ContentSettings.PermissionActions_Geolocation.Granted.Url2. For simplicity, |
- // we retrieve the deprecated name and append the "2" for the new name. |
- // TODO(dominickn): remove the deprecated metric and replace it solely with |
- // the new one in GetRapporMetric - crbug.com/605836. |
- const std::string deprecated_metric = GetRapporMetric(permission, action); |
- rappor::RapporService* rappor_service = g_browser_process->rappor_service(); |
- if (!deprecated_metric.empty() && rappor_service) { |
- rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, |
- requesting_origin); |
- |
- std::string rappor_metric = deprecated_metric + "2"; |
- rappor_service->RecordSample( |
- rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
- rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
- } |
-} |
- |
void RecordPermissionRequest(PermissionType permission, |
const GURL& requesting_origin, |
const GURL& embedding_origin, |
@@ -280,34 +195,39 @@ void PermissionUmaUtil::PermissionRequested(PermissionType permission, |
} |
void PermissionUmaUtil::PermissionGranted(PermissionType permission, |
- const GURL& requesting_origin) { |
- RecordPermissionAction(permission, GRANTED, requesting_origin); |
+ const GURL& requesting_origin, |
+ Profile* profile) { |
+ RecordPermissionAction(permission, GRANTED, requesting_origin, profile); |
} |
void PermissionUmaUtil::PermissionDenied(PermissionType permission, |
- const GURL& requesting_origin) { |
- RecordPermissionAction(permission, DENIED, requesting_origin); |
+ const GURL& requesting_origin, |
+ Profile* profile) { |
+ RecordPermissionAction(permission, DENIED, requesting_origin, profile); |
} |
void PermissionUmaUtil::PermissionDismissed(PermissionType permission, |
- const GURL& requesting_origin) { |
- RecordPermissionAction(permission, DISMISSED, requesting_origin); |
+ const GURL& requesting_origin, |
+ Profile* profile) { |
+ RecordPermissionAction(permission, DISMISSED, requesting_origin, profile); |
} |
void PermissionUmaUtil::PermissionIgnored(PermissionType permission, |
- const GURL& requesting_origin) { |
- RecordPermissionAction(permission, IGNORED, requesting_origin); |
+ const GURL& requesting_origin, |
+ Profile* profile) { |
+ RecordPermissionAction(permission, IGNORED, requesting_origin, profile); |
} |
void PermissionUmaUtil::PermissionRevoked(PermissionType permission, |
- const GURL& revoked_origin) { |
+ const GURL& revoked_origin, |
+ Profile* profile) { |
// TODO(tsergeant): Expand metrics definitions for revocation to include all |
// permissions. |
if (permission == PermissionType::NOTIFICATIONS || |
permission == PermissionType::GEOLOCATION || |
permission == PermissionType::AUDIO_CAPTURE || |
permission == PermissionType::VIDEO_CAPTURE) { |
- RecordPermissionAction(permission, REVOKED, revoked_origin); |
+ RecordPermissionAction(permission, REVOKED, revoked_origin, profile); |
} |
} |
@@ -374,3 +294,127 @@ void PermissionUmaUtil::PermissionPromptDenied( |
PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, |
requests[0]->GetPermissionBubbleType()); |
} |
+ |
+bool PermissionUmaUtil::IsOptedIntoPermissionActionReporting(Profile* profile) { |
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnablePermissionActionReporting)) |
+ return false; |
+ // TODO(stefanocs): Remove this check once all callsites have been updated |
+ // to not pass a nullptr. |
+ if (!profile) |
+ return false; |
+ if (profile->GetProfileType() == Profile::INCOGNITO_PROFILE) |
+ return false; |
+ if (!profile->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) |
+ return false; |
+ |
+ ProfileSyncService* profile_sync_service = |
+ ProfileSyncServiceFactory::GetForProfile(profile); |
+ |
+ // Do not report if profile can't get a profile sync service due to disable |
+ // sync flag. |
+ if (!profile_sync_service) |
+ return false; |
+ |
+ if (!profile_sync_service->CanSyncStart()) |
+ return false; |
+ |
+ syncer::ModelTypeSet preferred_data_types = |
+ profile_sync_service->GetPreferredDataTypes(); |
+ if (!preferred_data_types.Has(syncer::PROXY_TABS)) |
+ return false; |
+ if (!preferred_data_types.Has(syncer::PRIORITY_PREFERENCES)) |
+ return false; |
+ |
+ return true; |
+} |
+ |
+void PermissionUmaUtil::RecordPermissionAction(PermissionType permission, |
+ PermissionAction action, |
+ const GURL& requesting_origin, |
+ Profile* profile) { |
+ if (IsOptedIntoPermissionActionReporting(profile)) { |
+ // TODO(stefanocs): Add browsertests to make sure the reports are being |
+ // sent. |
+ g_browser_process->safe_browsing_service() |
+ ->ui_manager() |
+ ->ReportPermissionAction(requesting_origin, permission, action); |
+ } |
+ |
+ bool secure_origin = content::IsOriginSecure(requesting_origin); |
+ |
+ switch (permission) { |
+ case PermissionType::GEOLOCATION: |
+ PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Geolocation", |
+ "Permissions.Action.SecureOrigin.Geolocation", |
+ "Permissions.Action.InsecureOrigin.Geolocation", |
+ action); |
+ break; |
+ case PermissionType::NOTIFICATIONS: |
+ PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Notifications", |
+ "Permissions.Action.SecureOrigin.Notifications", |
+ "Permissions.Action.InsecureOrigin.Notifications", |
+ action); |
+ break; |
+ case PermissionType::MIDI_SYSEX: |
+ PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.MidiSysEx", |
+ "Permissions.Action.SecureOrigin.MidiSysEx", |
+ "Permissions.Action.InsecureOrigin.MidiSysEx", |
+ action); |
+ break; |
+ case PermissionType::PUSH_MESSAGING: |
+ PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.PushMessaging", |
+ "Permissions.Action.SecureOrigin.PushMessaging", |
+ "Permissions.Action.InsecureOrigin.PushMessaging", |
+ action); |
+ break; |
+ case PermissionType::PROTECTED_MEDIA_IDENTIFIER: |
+ PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.ProtectedMedia", |
+ "Permissions.Action.SecureOrigin.ProtectedMedia", |
+ "Permissions.Action.InsecureOrigin.ProtectedMedia", |
+ action); |
+ break; |
+ case PermissionType::DURABLE_STORAGE: |
+ PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.DurableStorage", |
+ "Permissions.Action.SecureOrigin.DurableStorage", |
+ "Permissions.Action.InsecureOrigin.DurableStorage", |
+ action); |
+ break; |
+ case PermissionType::AUDIO_CAPTURE: |
+ // Media permissions are disabled on insecure origins, so there's no |
+ // need to record metrics for secure/insecue. |
+ UMA_HISTOGRAM_ENUMERATION("Permissions.Action.AudioCapture", action, |
+ PERMISSION_ACTION_NUM); |
+ break; |
+ case PermissionType::VIDEO_CAPTURE: |
+ UMA_HISTOGRAM_ENUMERATION("Permissions.Action.VideoCapture", action, |
+ PERMISSION_ACTION_NUM); |
+ break; |
+ // The user is not prompted for these permissions, thus there is no |
+ // permission action recorded for them. |
+ case PermissionType::MIDI: |
+ case PermissionType::BACKGROUND_SYNC: |
+ case PermissionType::NUM: |
+ NOTREACHED() << "PERMISSION " |
+ << PermissionUtil::GetPermissionString(permission) |
+ << " not accounted for"; |
+ } |
+ |
+ // Retrieve the name of the RAPPOR metric. Currently, the new metric name is |
+ // the deprecated name with "2" on the end, e.g. |
+ // ContentSettings.PermissionActions_Geolocation.Granted.Url2. For simplicity, |
+ // we retrieve the deprecated name and append the "2" for the new name. |
+ // TODO(dominickn): remove the deprecated metric and replace it solely with |
+ // the new one in GetRapporMetric - crbug.com/605836. |
+ const std::string deprecated_metric = GetRapporMetric(permission, action); |
+ rappor::RapporService* rappor_service = g_browser_process->rappor_service(); |
+ if (!deprecated_metric.empty() && rappor_service) { |
+ rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, |
+ requesting_origin); |
+ |
+ std::string rappor_metric = deprecated_metric + "2"; |
+ rappor_service->RecordSample( |
+ rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
+ rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
+ } |
+} |