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 |
deleted file mode 100644 |
index 3895131cbbe07afa8ee28698690351b26e128c3b..0000000000000000000000000000000000000000 |
--- a/components/safe_browsing_db/safe_browsing_prefs.cc |
+++ /dev/null |
@@ -1,440 +0,0 @@ |
-// Copyright (c) 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/command_line.h" |
-#include "base/logging.h" |
-#include "base/metrics/histogram_macros.h" |
-#include "components/prefs/pref_service.h" |
-#include "components/safe_browsing_db/safe_browsing_prefs.h" |
- |
-namespace { |
- |
-// Switch value which force the ScoutGroupSelected pref to true. |
-const char kForceScoutGroupValueTrue[] = "true"; |
-// Switch value which force the ScoutGroupSelected pref to false. |
-const char kForceScoutGroupValueFalse[] = "false"; |
- |
-// Name of the Scout Transition UMA metric. |
-const char kScoutTransitionMetricName[] = "SafeBrowsing.Pref.Scout.Transition"; |
- |
-// Reasons that a state transition for Scout was performed. |
-// These values are written to logs. New enum values can be added, but |
-// existing enums must never be renumbered or deleted and reused. |
-enum ScoutTransitionReason { |
- // Flag forced Scout Group to true |
- FORCE_SCOUT_FLAG_TRUE = 0, |
- // Flag forced Scout Group to false |
- FORCE_SCOUT_FLAG_FALSE = 1, |
- // User in OnlyShowScout group, enters Scout Group |
- ONLY_SHOW_SCOUT_OPT_IN = 2, |
- // User in CanShowScout group, enters Scout Group immediately |
- CAN_SHOW_SCOUT_OPT_IN_SCOUT_GROUP_ON = 3, |
- // User in CanShowScout group, waiting for interstitial to enter Scout Group |
- CAN_SHOW_SCOUT_OPT_IN_WAIT_FOR_INTERSTITIAL = 4, |
- // User in CanShowScout group saw the first interstitial and entered the Scout |
- // Group |
- CAN_SHOW_SCOUT_OPT_IN_SAW_FIRST_INTERSTITIAL = 5, |
- // User in Control group |
- CONTROL = 6, |
- // Rollback: SBER2 on on implies SBER1 can turn on |
- ROLLBACK_SBER2_IMPLIES_SBER1 = 7, |
- // Rollback: SBER2 off so SBER1 must be turned off |
- ROLLBACK_NO_SBER2_SET_SBER1_FALSE = 8, |
- // Rollback: SBER2 absent so SBER1 must be cleared |
- ROLLBACK_NO_SBER2_CLEAR_SBER1 = 9, |
- // New reasons must be added BEFORE MAX_REASONS |
- MAX_REASONS |
-}; |
- |
-// The Extended Reporting pref that is currently active, used for UMA metrics. |
-// These values are written to logs. New enum values can be added, but |
-// existing enums must never be renumbered or deleted and reused. |
-enum ActiveExtendedReportingPref { |
- SBER1_PREF = 0, |
- SBER2_PREF = 1, |
- // New prefs must be added before MAX_SBER_PREF |
- 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( |
- const PrefService& prefs, |
- safe_browsing::ExtendedReportingOptInLocation location) { |
- bool pref_value = safe_browsing::IsExtendedReportingEnabled(prefs); |
- |
- if (safe_browsing::IsScout(prefs)) { |
- switch (location) { |
- case safe_browsing::SBER_OPTIN_SITE_CHROME_SETTINGS: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER2Pref.ChromeSettings", |
- pref_value); |
- break; |
- case safe_browsing::SBER_OPTIN_SITE_ANDROID_SETTINGS: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER2Pref.AndroidSettings", |
- pref_value); |
- break; |
- case safe_browsing::SBER_OPTIN_SITE_DOWNLOAD_FEEDBACK_POPUP: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER2Pref.DownloadPopup", |
- pref_value); |
- break; |
- case safe_browsing::SBER_OPTIN_SITE_SECURITY_INTERSTITIAL: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER2Pref.SecurityInterstitial", |
- pref_value); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- } else { |
- switch (location) { |
- case safe_browsing::SBER_OPTIN_SITE_CHROME_SETTINGS: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER1Pref.ChromeSettings", |
- pref_value); |
- break; |
- case safe_browsing::SBER_OPTIN_SITE_ANDROID_SETTINGS: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER1Pref.AndroidSettings", |
- pref_value); |
- break; |
- case safe_browsing::SBER_OPTIN_SITE_DOWNLOAD_FEEDBACK_POPUP: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER1Pref.DownloadPopup", |
- pref_value); |
- break; |
- case safe_browsing::SBER_OPTIN_SITE_SECURITY_INTERSTITIAL: |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.Scout.SetPref.SBER1Pref.SecurityInterstitial", |
- pref_value); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- } |
-} |
-} // namespace |
- |
-namespace prefs { |
-const char kSafeBrowsingExtendedReportingEnabled[] = |
- "safebrowsing.extended_reporting_enabled"; |
-const char kSafeBrowsingScoutReportingEnabled[] = |
- "safebrowsing.scout_reporting_enabled"; |
-const char kSafeBrowsingScoutGroupSelected[] = |
- "safebrowsing.scout_group_selected"; |
-const char kSafeBrowsingSawInterstitialExtendedReporting[] = |
- "safebrowsing.saw_interstitial_sber1"; |
-const char kSafeBrowsingSawInterstitialScoutReporting[] = |
- "safebrowsing.saw_interstitial_sber2"; |
-} // namespace prefs |
- |
-namespace safe_browsing { |
- |
-const char kSwitchForceScoutGroup[] = "force-scout-group"; |
- |
-const base::Feature kCanShowScoutOptIn{"CanShowScoutOptIn", |
- base::FEATURE_DISABLED_BY_DEFAULT}; |
- |
-const base::Feature kOnlyShowScoutOptIn{"OnlyShowScoutOptIn", |
- base::FEATURE_DISABLED_BY_DEFAULT}; |
- |
-std::string ChooseOptInTextPreference( |
- const PrefService& prefs, |
- const std::string& extended_reporting_pref, |
- const std::string& scout_pref) { |
- return IsScout(prefs) ? scout_pref : extended_reporting_pref; |
-} |
- |
-int ChooseOptInTextResource(const PrefService& prefs, |
- int extended_reporting_resource, |
- int scout_resource) { |
- return IsScout(prefs) ? scout_resource : extended_reporting_resource; |
-} |
- |
-bool ExtendedReportingPrefExists(const PrefService& prefs) { |
- return prefs.HasPrefPath(GetExtendedReportingPrefName(prefs)); |
-} |
- |
-ExtendedReportingLevel GetExtendedReportingLevel(const PrefService& prefs) { |
- if (!IsExtendedReportingEnabled(prefs)) { |
- return SBER_LEVEL_OFF; |
- } else { |
- return IsScout(prefs) ? SBER_LEVEL_SCOUT : SBER_LEVEL_LEGACY; |
- } |
-} |
- |
-const char* GetExtendedReportingPrefName(const PrefService& prefs) { |
- // The Scout pref is active if either of the experiment features are on, and |
- // ScoutGroupSelected is on as well. |
- if ((base::FeatureList::IsEnabled(kCanShowScoutOptIn) || |
- base::FeatureList::IsEnabled(kOnlyShowScoutOptIn)) && |
- prefs.GetBoolean(prefs::kSafeBrowsingScoutGroupSelected)) { |
- return prefs::kSafeBrowsingScoutReportingEnabled; |
- } |
- |
- // ..otherwise, either no experiment is on (ie: the Control group) or |
- // ScoutGroupSelected is off. So we use the SBER pref instead. |
- return prefs::kSafeBrowsingExtendedReportingEnabled; |
-} |
- |
-void InitializeSafeBrowsingPrefs(PrefService* prefs) { |
- // First handle forcing kSafeBrowsingScoutGroupSelected pref via cmd-line. |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- kSwitchForceScoutGroup)) { |
- std::string switch_value = |
- base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
- kSwitchForceScoutGroup); |
- if (switch_value == kForceScoutGroupValueTrue) { |
- prefs->SetBoolean(prefs::kSafeBrowsingScoutGroupSelected, true); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- FORCE_SCOUT_FLAG_TRUE, MAX_REASONS); |
- } else if (switch_value == kForceScoutGroupValueFalse) { |
- prefs->SetBoolean(prefs::kSafeBrowsingScoutGroupSelected, false); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- FORCE_SCOUT_FLAG_FALSE, MAX_REASONS); |
- } |
- |
- // If the switch is used, don't process the experiment state. |
- return; |
- } |
- |
- // Handle the three possible experiment states. |
- if (base::FeatureList::IsEnabled(kOnlyShowScoutOptIn)) { |
- // OnlyShowScoutOptIn immediately turns on ScoutGroupSelected pref. |
- prefs->SetBoolean(prefs::kSafeBrowsingScoutGroupSelected, true); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- ONLY_SHOW_SCOUT_OPT_IN, MAX_REASONS); |
- } else if (base::FeatureList::IsEnabled(kCanShowScoutOptIn)) { |
- // CanShowScoutOptIn will only turn on ScoutGroupSelected pref if the legacy |
- // SBER pref is false. Otherwise the legacy SBER pref will stay on and |
- // continue to be used until the next security incident, at which point |
- // the Scout pref will become the active one. |
- if (!prefs->GetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled)) { |
- prefs->SetBoolean(prefs::kSafeBrowsingScoutGroupSelected, true); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- CAN_SHOW_SCOUT_OPT_IN_SCOUT_GROUP_ON, |
- MAX_REASONS); |
- } else { |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- CAN_SHOW_SCOUT_OPT_IN_WAIT_FOR_INTERSTITIAL, |
- MAX_REASONS); |
- } |
- } else { |
- // Both experiment features are off, so this is the Control group. We must |
- // handle the possibility that the user was previously in an experiment |
- // group (above) that was reverted. We want to restore the user to a |
- // reasonable state based on the ScoutGroup and ScoutReporting preferences. |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, CONTROL, MAX_REASONS); |
- bool transitioned = false; |
- if (prefs->GetBoolean(prefs::kSafeBrowsingScoutReportingEnabled)) { |
- // User opted-in to Scout which is broader than legacy Extended Reporting. |
- // Opt them in to Extended Reporting. |
- prefs->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, true); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- ROLLBACK_SBER2_IMPLIES_SBER1, MAX_REASONS); |
- transitioned = true; |
- } else if (prefs->GetBoolean(prefs::kSafeBrowsingScoutGroupSelected)) { |
- // User was in the Scout Group (ie: seeing the Scout opt-in text) but did |
- // NOT opt-in to Scout. Assume this was a conscious choice and remove |
- // their legacy Extended Reporting opt-in as well. The user will have a |
- // chance to evaluate their choice next time they see the opt-in text. |
- |
- // We make the Extended Reporting pref mimic the state of the Scout |
- // Reporting pref. So we either Clear it or set it to False. |
- if (prefs->HasPrefPath(prefs::kSafeBrowsingScoutReportingEnabled)) { |
- // Scout Reporting pref was explicitly set to false, so set the SBER |
- // pref to false. |
- prefs->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, false); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- ROLLBACK_NO_SBER2_SET_SBER1_FALSE, |
- MAX_REASONS); |
- } else { |
- // Scout Reporting pref is unset, so clear the SBER pref. |
- prefs->ClearPref(prefs::kSafeBrowsingExtendedReportingEnabled); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- ROLLBACK_NO_SBER2_CLEAR_SBER1, MAX_REASONS); |
- } |
- transitioned = true; |
- } |
- |
- // Also clear both the Scout settings to start over from a clean state and |
- // 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 if they're |
- // reverting back to a clean state. |
- if (transitioned) { |
- prefs->ClearPref(prefs::kSafeBrowsingSawInterstitialExtendedReporting); |
- prefs->ClearPref(prefs::kSafeBrowsingSawInterstitialScoutReporting); |
- } |
- } |
-} |
- |
-bool IsExtendedReportingEnabled(const PrefService& prefs) { |
- return prefs.GetBoolean(GetExtendedReportingPrefName(prefs)); |
-} |
- |
-bool IsScout(const PrefService& prefs) { |
- return GetExtendedReportingPrefName(prefs) == |
- prefs::kSafeBrowsingScoutReportingEnabled; |
-} |
- |
-void RecordExtendedReportingMetrics(const PrefService& prefs) { |
- // This metric tracks the extended browsing opt-in based on whichever setting |
- // the user is currently seeing. It tells us whether extended reporting is |
- // happening for this user. |
- 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::kSafeBrowsingSawInterstitialExtendedReporting)); |
- UMA_HISTOGRAM_BOOLEAN( |
- "SafeBrowsing.Pref.SawInterstitial.SBER2Pref", |
- prefs.GetBoolean(prefs::kSafeBrowsingSawInterstitialScoutReporting)); |
- |
- // These metrics track the Scout transition. |
- if (prefs.GetBoolean(prefs::kSafeBrowsingScoutGroupSelected)) { |
- // Users in the Scout group: currently seeing the Scout opt-in. |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.ScoutGroup.SBER1Pref", |
- GetPrefValueOrNull(prefs, prefs::kSafeBrowsingExtendedReportingEnabled), |
- MAX_NULLABLE_BOOLEAN); |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.ScoutGroup.SBER2Pref", |
- GetPrefValueOrNull(prefs, prefs::kSafeBrowsingScoutReportingEnabled), |
- MAX_NULLABLE_BOOLEAN); |
- } else { |
- // Users not in the Scout group: currently seeing the SBER opt-in. |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.NoScoutGroup.SBER1Pref", |
- 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_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.NoScoutGroup.SBER2Pref", |
- GetPrefValueOrNull(prefs, prefs::kSafeBrowsingScoutReportingEnabled), |
- MAX_NULLABLE_BOOLEAN); |
- } |
-} |
- |
-void SetExtendedReportingPrefAndMetric( |
- PrefService* prefs, |
- bool value, |
- ExtendedReportingOptInLocation location) { |
- prefs->SetBoolean(GetExtendedReportingPrefName(*prefs), value); |
- RecordExtendedReportingPrefChanged(*prefs, location); |
-} |
- |
-void SetExtendedReportingPref(PrefService* prefs, bool value) { |
- prefs->SetBoolean(GetExtendedReportingPrefName(*prefs), value); |
-} |
- |
-void UpdateMetricsAfterSecurityInterstitial(const PrefService& prefs, |
- bool on_show_pref_existed, |
- bool on_show_pref_value) { |
- const ActiveExtendedReportingPref active_pref = |
- IsScout(prefs) ? SBER2_PREF : SBER1_PREF; |
- const bool cur_pref_value = IsExtendedReportingEnabled(prefs); |
- |
- if (!on_show_pref_existed) { |
- if (!ExtendedReportingPrefExists(prefs)) { |
- // User seeing pref for the first time, didn't touch the checkbox (left it |
- // unchecked). |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.Decision.First_LeftUnchecked", active_pref, |
- MAX_SBER_PREF); |
- return; |
- } |
- |
- // Pref currently exists so user did something to the checkbox |
- if (cur_pref_value) { |
- // User turned the pref on. |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.Decision.First_Enabled", active_pref, |
- MAX_SBER_PREF); |
- return; |
- } |
- |
- // Otherwise, user turned the pref off, but because it didn't exist when |
- // the interstitial was first shown, they must have turned it on and then |
- // off before the interstitial was closed. |
- UMA_HISTOGRAM_ENUMERATION("SafeBrowsing.Pref.Scout.Decision.First_Disabled", |
- active_pref, MAX_SBER_PREF); |
- return; |
- } |
- |
- // At this point, the pref existed when the interstitial was shown so this is |
- // a repeat appearance of the opt-in. Existence can't be removed during an |
- // interstitial so no need to check whether the pref currently exists. |
- if (on_show_pref_value && cur_pref_value) { |
- // User left the pref on. |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.Decision.Repeat_LeftEnabled", active_pref, |
- MAX_SBER_PREF); |
- return; |
- } else if (on_show_pref_value && !cur_pref_value) { |
- // User turned the pref off. |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.Decision.Repeat_Disabled", active_pref, |
- MAX_SBER_PREF); |
- return; |
- } else if (!on_show_pref_value && cur_pref_value) { |
- // User turned the pref on. |
- UMA_HISTOGRAM_ENUMERATION("SafeBrowsing.Pref.Scout.Decision.Repeat_Enabled", |
- active_pref, MAX_SBER_PREF); |
- return; |
- } else { |
- // Both on_show and cur values are false - user left the pref off. |
- UMA_HISTOGRAM_ENUMERATION( |
- "SafeBrowsing.Pref.Scout.Decision.Repeat_LeftDisabled", active_pref, |
- MAX_SBER_PREF); |
- return; |
- } |
-} |
- |
-void UpdatePrefsBeforeSecurityInterstitial(PrefService* prefs) { |
- // Move the user into the Scout Group if the CanShowScoutOptIn experiment is |
- // enabled and they're not in the group already. |
- if (base::FeatureList::IsEnabled(kCanShowScoutOptIn) && |
- !prefs->GetBoolean(prefs::kSafeBrowsingScoutGroupSelected)) { |
- prefs->SetBoolean(prefs::kSafeBrowsingScoutGroupSelected, true); |
- UMA_HISTOGRAM_ENUMERATION(kScoutTransitionMetricName, |
- 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::kSafeBrowsingSawInterstitialScoutReporting |
- : prefs::kSafeBrowsingSawInterstitialExtendedReporting, |
- true); |
-} |
- |
-} // namespace safe_browsing |