Index: components/safe_browsing_db/safe_browsing_prefs.cc |
diff --git a/components/safe_browsing_db/safe_browsing_prefs.cc b/components/safe_browsing_db/safe_browsing_prefs.cc |
index 66c1dbb6e477866287b7ecf8bbc8d27b4d5ad2af..d6a7308cae7dda94ca90dd3c991c10ae39452116 100644 |
--- a/components/safe_browsing_db/safe_browsing_prefs.cc |
+++ b/components/safe_browsing_db/safe_browsing_prefs.cc |
@@ -57,6 +57,25 @@ enum ActiveExtendedReportingPref { |
MAX_SBER_PREF |
}; |
+// A histogram for tracking a nullable boolean, which can be false, true or |
+// null. These values are written to logs. New enum values can be added, but |
+// existing enums must never be renumbered or deleted and reused. |
+enum NullableBoolean { |
+ NULLABLE_BOOLEAN_FALSE = 0, |
+ NULLABLE_BOOLEAN_TRUE = 1, |
+ NULLABLE_BOOLEAN_NULL = 2, |
+ MAX_NULLABLE_BOOLEAN |
+}; |
+ |
+NullableBoolean GetPrefValueOrNull(const PrefService& prefs, |
+ const std::string& pref_name) { |
+ if (!prefs.HasPrefPath(pref_name)) { |
+ return NULLABLE_BOOLEAN_NULL; |
+ } |
+ return prefs.GetBoolean(pref_name) ? NULLABLE_BOOLEAN_TRUE |
+ : NULLABLE_BOOLEAN_FALSE; |
+} |
+ |
// Update the correct UMA metric based on which pref was changed and which UI |
// the change was made on. |
void RecordExtendedReportingPrefChanged( |
@@ -125,6 +144,10 @@ const char kSafeBrowsingScoutReportingEnabled[] = |
"safebrowsing.scout_reporting_enabled"; |
const char kSafeBrowsingScoutGroupSelected[] = |
"safebrowsing.scout_group_selected"; |
+const char kSafeBrowsingSawInterstitialSber1[] = |
+ "safebrowsing.saw_interstitial_sber1"; |
+const char kSafeBrowsingSawInterstitialSber2[] = |
+ "safebrowsing.saw_interstitial_sber2"; |
} // namespace prefs |
namespace safe_browsing { |
@@ -257,6 +280,11 @@ void InitializeSafeBrowsingPrefs(PrefService* prefs) { |
// avoid the above logic from triggering on next restart. |
prefs->ClearPref(prefs::kSafeBrowsingScoutGroupSelected); |
prefs->ClearPref(prefs::kSafeBrowsingScoutReportingEnabled); |
+ |
+ // Also forget that the user has seen any interstitials since they're |
+ // reverting back to a clean state. |
+ prefs->ClearPref(prefs::kSafeBrowsingSawInterstitialSber1); |
+ prefs->ClearPref(prefs::kSafeBrowsingSawInterstitialSber2); |
} |
} |
@@ -276,26 +304,38 @@ void RecordExtendedReportingMetrics(const PrefService& prefs) { |
UMA_HISTOGRAM_BOOLEAN("SafeBrowsing.Pref.Extended", |
IsExtendedReportingEnabled(prefs)); |
+ // Track whether this user has ever seen a security interstitial. |
+ UMA_HISTOGRAM_BOOLEAN( |
+ "SafeBrowsing.Pref.SawInterstitial.SBER1Pref", |
+ prefs.GetBoolean(prefs::kSafeBrowsingSawInterstitialSber1)); |
+ UMA_HISTOGRAM_BOOLEAN( |
+ "SafeBrowsing.Pref.SawInterstitial.SBER2Pref", |
+ prefs.GetBoolean(prefs::kSafeBrowsingSawInterstitialSber2)); |
+ |
// These metrics track the Scout transition. |
if (prefs.GetBoolean(prefs::kSafeBrowsingScoutGroupSelected)) { |
// Users in the Scout group: currently seeing the Scout opt-in. |
- UMA_HISTOGRAM_BOOLEAN( |
+ UMA_HISTOGRAM_ENUMERATION( |
"SafeBrowsing.Pref.Scout.ScoutGroup.SBER1Pref", |
- prefs.GetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled)); |
- UMA_HISTOGRAM_BOOLEAN( |
+ GetPrefValueOrNull(prefs, prefs::kSafeBrowsingExtendedReportingEnabled), |
+ MAX_NULLABLE_BOOLEAN); |
+ UMA_HISTOGRAM_ENUMERATION( |
"SafeBrowsing.Pref.Scout.ScoutGroup.SBER2Pref", |
- prefs.GetBoolean(prefs::kSafeBrowsingScoutReportingEnabled)); |
+ GetPrefValueOrNull(prefs, prefs::kSafeBrowsingScoutReportingEnabled), |
+ MAX_NULLABLE_BOOLEAN); |
} else { |
// Users not in the Scout group: currently seeing the SBER opt-in. |
- UMA_HISTOGRAM_BOOLEAN( |
+ UMA_HISTOGRAM_ENUMERATION( |
"SafeBrowsing.Pref.Scout.NoScoutGroup.SBER1Pref", |
- prefs.GetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled)); |
+ GetPrefValueOrNull(prefs, prefs::kSafeBrowsingExtendedReportingEnabled), |
+ MAX_NULLABLE_BOOLEAN); |
// The following metric is a corner case. User was previously in the |
// Scout group and was able to opt-in to the Scout pref, but was since |
// removed from the Scout group (eg: by rolling back a Scout experiment). |
- UMA_HISTOGRAM_BOOLEAN( |
+ UMA_HISTOGRAM_ENUMERATION( |
"SafeBrowsing.Pref.Scout.NoScoutGroup.SBER2Pref", |
- prefs.GetBoolean(prefs::kSafeBrowsingScoutReportingEnabled)); |
+ GetPrefValueOrNull(prefs, prefs::kSafeBrowsingScoutReportingEnabled), |
+ MAX_NULLABLE_BOOLEAN); |
} |
} |
@@ -384,6 +424,11 @@ void UpdatePrefsBeforeSecurityInterstitial(PrefService* prefs) { |
CAN_SHOW_SCOUT_OPT_IN_SAW_FIRST_INTERSTITIAL, |
MAX_REASONS); |
} |
+ |
+ // Remember that this user saw an interstitial with the current opt-in text. |
+ prefs->SetBoolean(IsScout(*prefs) ? prefs::kSafeBrowsingSawInterstitialSber2 |
+ : prefs::kSafeBrowsingSawInterstitialSber1, |
+ true); |
} |
} // namespace safe_browsing |