1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/callback_list.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial.h" 17*6777b538SAndroid Build Coastguard Worker #include "build/chromeos_buildflags.h" 18*6777b538SAndroid Build Coastguard Worker #include "components/metrics/clean_exit_beacon.h" 19*6777b538SAndroid Build Coastguard Worker #include "components/metrics/client_info.h" 20*6777b538SAndroid Build Coastguard Worker #include "components/metrics/cloned_install_detector.h" 21*6777b538SAndroid Build Coastguard Worker #include "components/metrics/entropy_state.h" 22*6777b538SAndroid Build Coastguard Worker #include "components/variations/entropy_provider.h" 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker class PrefService; 25*6777b538SAndroid Build Coastguard Worker class PrefRegistrySimple; 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker namespace metrics { 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker class EnabledStateProvider; 30*6777b538SAndroid Build Coastguard Worker class MetricsProvider; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // Denotes whether this session is a background or foreground session at 33*6777b538SAndroid Build Coastguard Worker // startup. May be unknown. A background session refers to the situation in 34*6777b538SAndroid Build Coastguard Worker // which the browser process starts; does some work, e.g. servicing a sync; and 35*6777b538SAndroid Build Coastguard Worker // ends without ever becoming visible. Note that the point in startup at which 36*6777b538SAndroid Build Coastguard Worker // this value is determined is likely before the UI is visible. 37*6777b538SAndroid Build Coastguard Worker // 38*6777b538SAndroid Build Coastguard Worker // These values are persisted to logs. Entries should not be renumbered and 39*6777b538SAndroid Build Coastguard Worker // numeric values should never be reused. 40*6777b538SAndroid Build Coastguard Worker enum class StartupVisibility { 41*6777b538SAndroid Build Coastguard Worker kUnknown = 0, 42*6777b538SAndroid Build Coastguard Worker kBackground = 1, 43*6777b538SAndroid Build Coastguard Worker kForeground = 2, 44*6777b538SAndroid Build Coastguard Worker kMaxValue = kForeground, 45*6777b538SAndroid Build Coastguard Worker }; 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker // Denotes the type of EntropyProvider to use for default one-time 48*6777b538SAndroid Build Coastguard Worker // randomization. 49*6777b538SAndroid Build Coastguard Worker enum class EntropyProviderType { 50*6777b538SAndroid Build Coastguard Worker kDefault = 0, // Enable high entropy randomization if possible. 51*6777b538SAndroid Build Coastguard Worker kLow = 1, // Always use low entropy randomization. 52*6777b538SAndroid Build Coastguard Worker }; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // Options to apply to trial randomization. 55*6777b538SAndroid Build Coastguard Worker struct EntropyParams { 56*6777b538SAndroid Build Coastguard Worker // The type of entropy to use for default one-time randomization. 57*6777b538SAndroid Build Coastguard Worker EntropyProviderType default_entropy_provider_type = 58*6777b538SAndroid Build Coastguard Worker EntropyProviderType::kDefault; 59*6777b538SAndroid Build Coastguard Worker // Force trial randomization into benchmarking mode, which disables 60*6777b538SAndroid Build Coastguard Worker // randomization. Users may also be put in this mode if the 61*6777b538SAndroid Build Coastguard Worker // --enable_benchmarking command line flag is passed. 62*6777b538SAndroid Build Coastguard Worker bool force_benchmarking_mode = false; 63*6777b538SAndroid Build Coastguard Worker }; 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker // Responsible for managing MetricsService state prefs, specifically the UMA 66*6777b538SAndroid Build Coastguard Worker // client id and low entropy source. Code outside the metrics directory should 67*6777b538SAndroid Build Coastguard Worker // not be instantiating or using this class directly. 68*6777b538SAndroid Build Coastguard Worker class MetricsStateManager final { 69*6777b538SAndroid Build Coastguard Worker public: 70*6777b538SAndroid Build Coastguard Worker // A callback that can be invoked to store client info to persistent storage. 71*6777b538SAndroid Build Coastguard Worker // Storing an empty client_id will resulted in the backup being voided. 72*6777b538SAndroid Build Coastguard Worker typedef base::RepeatingCallback<void(const ClientInfo& client_info)> 73*6777b538SAndroid Build Coastguard Worker StoreClientInfoCallback; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker // A callback that can be invoked to load client info stored through the 76*6777b538SAndroid Build Coastguard Worker // StoreClientInfoCallback. 77*6777b538SAndroid Build Coastguard Worker typedef base::RepeatingCallback<std::unique_ptr<ClientInfo>(void)> 78*6777b538SAndroid Build Coastguard Worker LoadClientInfoCallback; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker MetricsStateManager(const MetricsStateManager&) = delete; 81*6777b538SAndroid Build Coastguard Worker MetricsStateManager& operator=(const MetricsStateManager&) = delete; 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker ~MetricsStateManager(); 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsProvider> GetProvider(); 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker // Returns true if the user has consented to sending metric reports, and there 88*6777b538SAndroid Build Coastguard Worker // is no other reason to disable reporting. One such reason is client 89*6777b538SAndroid Build Coastguard Worker // sampling, and this client isn't in the sample. 90*6777b538SAndroid Build Coastguard Worker bool IsMetricsReportingEnabled(); 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker // Returns true if Extended Variations Safe Mode is supported on this 93*6777b538SAndroid Build Coastguard Worker // platform. Variations Safe Mode is a mechanism that allows Chrome to fall 94*6777b538SAndroid Build Coastguard Worker // back to a "safe" seed so that clients can recover from a problematic 95*6777b538SAndroid Build Coastguard Worker // experiment, for example, one that causes browser crashes. See the design 96*6777b538SAndroid Build Coastguard Worker // doc for more details: 97*6777b538SAndroid Build Coastguard Worker // https://docs.google.com/document/d/17UN2pLSa5JZqk8f3LeYZIftXewxqcITotgalTrJvGSY. 98*6777b538SAndroid Build Coastguard Worker // 99*6777b538SAndroid Build Coastguard Worker // Extended Variations Safe Mode builds on this by allowing clients to recover 100*6777b538SAndroid Build Coastguard Worker // from problematic experiments that cause browser crashes earlier on in 101*6777b538SAndroid Build Coastguard Worker // startup. 102*6777b538SAndroid Build Coastguard Worker bool IsExtendedSafeModeSupported() const; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker // Returns the client ID for this client, or the empty string if the user is 105*6777b538SAndroid Build Coastguard Worker // not opted in to metrics reporting. client_id()106*6777b538SAndroid Build Coastguard Worker const std::string& client_id() const { return client_id_; } 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker // Returns the low entropy sources for this client. 109*6777b538SAndroid Build Coastguard Worker int GetLowEntropySource(); 110*6777b538SAndroid Build Coastguard Worker int GetOldLowEntropySource(); 111*6777b538SAndroid Build Coastguard Worker int GetPseudoLowEntropySource(); 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker // Gets the limited entropy randomization source. For clients that only use 114*6777b538SAndroid Build Coastguard Worker // the low entropy source (e.g. Android Webview), this will return the empty 115*6777b538SAndroid Build Coastguard Worker // string. 116*6777b538SAndroid Build Coastguard Worker std::string_view GetLimitedEntropyRandomizationSource(); 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // The CleanExitBeacon, used to determine whether the previous Chrome browser 119*6777b538SAndroid Build Coastguard Worker // session terminated gracefully. clean_exit_beacon()120*6777b538SAndroid Build Coastguard Worker CleanExitBeacon* clean_exit_beacon() { return &clean_exit_beacon_; } clean_exit_beacon()121*6777b538SAndroid Build Coastguard Worker const CleanExitBeacon* clean_exit_beacon() const { 122*6777b538SAndroid Build Coastguard Worker return &clean_exit_beacon_; 123*6777b538SAndroid Build Coastguard Worker } 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker // Returns true if the session was deemed a background session during startup. 126*6777b538SAndroid Build Coastguard Worker // Note that this is not equivalent to !is_foreground_session() because the 127*6777b538SAndroid Build Coastguard Worker // type of session may be unknown. is_background_session()128*6777b538SAndroid Build Coastguard Worker bool is_background_session() const { 129*6777b538SAndroid Build Coastguard Worker return startup_visibility_ == StartupVisibility::kBackground; 130*6777b538SAndroid Build Coastguard Worker } 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker // Returns true if the session was deemed a foreground session during startup. 133*6777b538SAndroid Build Coastguard Worker // Note that this is not equivalent to !is_background_session() because the 134*6777b538SAndroid Build Coastguard Worker // type of session may be unknown. is_foreground_session()135*6777b538SAndroid Build Coastguard Worker bool is_foreground_session() const { 136*6777b538SAndroid Build Coastguard Worker return startup_visibility_ == StartupVisibility::kForeground; 137*6777b538SAndroid Build Coastguard Worker } 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker // Instantiates the FieldTrialList. 140*6777b538SAndroid Build Coastguard Worker // 141*6777b538SAndroid Build Coastguard Worker // Side effect: Initializes |clean_exit_beacon_|. 142*6777b538SAndroid Build Coastguard Worker void InstantiateFieldTrialList(); 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker // Signals whether the session has shutdown cleanly. Passing `false` for 145*6777b538SAndroid Build Coastguard Worker // |has_session_shutdown_cleanly| means that Chrome has launched and has not 146*6777b538SAndroid Build Coastguard Worker // yet shut down safely. Passing `true` signals that Chrome has shut down 147*6777b538SAndroid Build Coastguard Worker // safely. 148*6777b538SAndroid Build Coastguard Worker // 149*6777b538SAndroid Build Coastguard Worker // Seeing a call with `false` without a matching call with `true` suggests 150*6777b538SAndroid Build Coastguard Worker // that Chrome crashed or otherwise did not shut down cleanly, e.g. maybe the 151*6777b538SAndroid Build Coastguard Worker // OS crashed. 152*6777b538SAndroid Build Coastguard Worker // 153*6777b538SAndroid Build Coastguard Worker // If |is_extended_safe_mode| is true, then |has_session_shutdown_cleanly| is 154*6777b538SAndroid Build Coastguard Worker // written to disk synchronously. If false, a write is scheduled, and for 155*6777b538SAndroid Build Coastguard Worker // clients in the Extended Variations Safe Mode experiment, a synchronous 156*6777b538SAndroid Build Coastguard Worker // write is done, too. 157*6777b538SAndroid Build Coastguard Worker // 158*6777b538SAndroid Build Coastguard Worker // Note: |is_extended_safe_mode| should be true only for the Extended 159*6777b538SAndroid Build Coastguard Worker // Variations Safe Mode experiment. 160*6777b538SAndroid Build Coastguard Worker void LogHasSessionShutdownCleanly(bool has_session_shutdown_cleanly, 161*6777b538SAndroid Build Coastguard Worker bool is_extended_safe_mode = false); 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker // Forces the client ID to be generated. This is useful in case it's needed 164*6777b538SAndroid Build Coastguard Worker // before recording. 165*6777b538SAndroid Build Coastguard Worker void ForceClientIdCreation(); 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker // Sets the external client id. Useful for callers that want explicit control 168*6777b538SAndroid Build Coastguard Worker // of the next metrics client id. 169*6777b538SAndroid Build Coastguard Worker void SetExternalClientId(const std::string& id); 170*6777b538SAndroid Build Coastguard Worker 171*6777b538SAndroid Build Coastguard Worker // Checks if this install was cloned or imaged from another machine. If a 172*6777b538SAndroid Build Coastguard Worker // clone is detected, resets the client id and low entropy source. This 173*6777b538SAndroid Build Coastguard Worker // should not be called more than once. 174*6777b538SAndroid Build Coastguard Worker void CheckForClonedInstall(); 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker // Checks if the cloned install detector says that client ids should be reset. 177*6777b538SAndroid Build Coastguard Worker bool ShouldResetClientIdsOnClonedInstall(); 178*6777b538SAndroid Build Coastguard Worker 179*6777b538SAndroid Build Coastguard Worker // Wrapper around ClonedInstallDetector::AddOnClonedInstallDetectedCallback(). 180*6777b538SAndroid Build Coastguard Worker base::CallbackListSubscription AddOnClonedInstallDetectedCallback( 181*6777b538SAndroid Build Coastguard Worker base::OnceClosure callback); 182*6777b538SAndroid Build Coastguard Worker 183*6777b538SAndroid Build Coastguard Worker // Creates entropy providers for trial randomization. 184*6777b538SAndroid Build Coastguard Worker // 185*6777b538SAndroid Build Coastguard Worker // If this StateManager supports high entropy randomization, and there is 186*6777b538SAndroid Build Coastguard Worker // either consent to report metrics or this is the first run of Chrome, 187*6777b538SAndroid Build Coastguard Worker // this method returns an entropy provider that has a high source of entropy, 188*6777b538SAndroid Build Coastguard Worker // partially based on the client ID or provisional client ID. Otherwise, it 189*6777b538SAndroid Build Coastguard Worker // only returns an entropy provider that is based on a low entropy source. 190*6777b538SAndroid Build Coastguard Worker // 191*6777b538SAndroid Build Coastguard Worker // When |enable_limited_entropy_mode| is true, a limited entropy 192*6777b538SAndroid Build Coastguard Worker // randomization source value will be generated for this client. This 193*6777b538SAndroid Build Coastguard Worker // parameter can only be false before the limited entropy synthetic trial 194*6777b538SAndroid Build Coastguard Worker // completes (See limited_entropy_synthetic_trial.h), after which it should be 195*6777b538SAndroid Build Coastguard Worker // removed (TODO(crbug.com/1508150)). 196*6777b538SAndroid Build Coastguard Worker std::unique_ptr<const variations::EntropyProviders> CreateEntropyProviders( 197*6777b538SAndroid Build Coastguard Worker bool enable_limited_entropy_mode); 198*6777b538SAndroid Build Coastguard Worker cloned_install_detector_for_testing()199*6777b538SAndroid Build Coastguard Worker ClonedInstallDetector* cloned_install_detector_for_testing() { 200*6777b538SAndroid Build Coastguard Worker return &cloned_install_detector_; 201*6777b538SAndroid Build Coastguard Worker } 202*6777b538SAndroid Build Coastguard Worker 203*6777b538SAndroid Build Coastguard Worker // Creates the MetricsStateManager, enforcing that only a single instance 204*6777b538SAndroid Build Coastguard Worker // of the class exists at a time. Returns nullptr if an instance exists 205*6777b538SAndroid Build Coastguard Worker // already. 206*6777b538SAndroid Build Coastguard Worker // 207*6777b538SAndroid Build Coastguard Worker // On Windows, |backup_registry_key| is used to store a backup of the clean 208*6777b538SAndroid Build Coastguard Worker // exit beacon. It is ignored on other platforms. 209*6777b538SAndroid Build Coastguard Worker // 210*6777b538SAndroid Build Coastguard Worker // |user_data_dir| is the path to the client's user data directory. If empty, 211*6777b538SAndroid Build Coastguard Worker // a separate file will not be used for Variations Safe Mode prefs. 212*6777b538SAndroid Build Coastguard Worker // 213*6777b538SAndroid Build Coastguard Worker // |startup_visibility| denotes whether this session is expected to come to 214*6777b538SAndroid Build Coastguard Worker // the foreground. 215*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<MetricsStateManager> Create( 216*6777b538SAndroid Build Coastguard Worker PrefService* local_state, 217*6777b538SAndroid Build Coastguard Worker EnabledStateProvider* enabled_state_provider, 218*6777b538SAndroid Build Coastguard Worker const std::wstring& backup_registry_key, 219*6777b538SAndroid Build Coastguard Worker const base::FilePath& user_data_dir, 220*6777b538SAndroid Build Coastguard Worker StartupVisibility startup_visibility = StartupVisibility::kUnknown, 221*6777b538SAndroid Build Coastguard Worker EntropyParams entropy_params = {}, 222*6777b538SAndroid Build Coastguard Worker StoreClientInfoCallback store_client_info = StoreClientInfoCallback(), 223*6777b538SAndroid Build Coastguard Worker LoadClientInfoCallback load_client_info = LoadClientInfoCallback(), 224*6777b538SAndroid Build Coastguard Worker base::StringPiece external_client_id = base::StringPiece()); 225*6777b538SAndroid Build Coastguard Worker 226*6777b538SAndroid Build Coastguard Worker // Registers local state prefs used by this class. 227*6777b538SAndroid Build Coastguard Worker static void RegisterPrefs(PrefRegistrySimple* registry); 228*6777b538SAndroid Build Coastguard Worker 229*6777b538SAndroid Build Coastguard Worker private: 230*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, CheckProviderResetIds); 231*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, CheckProviderLogNormal); 232*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, 233*6777b538SAndroid Build Coastguard Worker CheckProviderLogNormalWithParams); 234*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES( 235*6777b538SAndroid Build Coastguard Worker MetricsStateManagerTest, 236*6777b538SAndroid Build Coastguard Worker CheckProviderResetIds_PreviousIdOnlyReportInResetSession); 237*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, EntropySourceUsed_Low); 238*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, EntropySourceUsed_High); 239*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, 240*6777b538SAndroid Build Coastguard Worker EntropySourceUsed_High_ExternalClientId); 241*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES( 242*6777b538SAndroid Build Coastguard Worker MetricsStateManagerTest, 243*6777b538SAndroid Build Coastguard Worker EntropySourceUsed_High_ExternalClientId_MetricsReportingDisabled); 244*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, 245*6777b538SAndroid Build Coastguard Worker ProvisionalClientId_PromotedToClientId); 246*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, 247*6777b538SAndroid Build Coastguard Worker ProvisionalClientId_PersistedAcrossFirstRuns); 248*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, ResetBackup); 249*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, ResetMetricsIDs); 250*6777b538SAndroid Build Coastguard Worker 251*6777b538SAndroid Build Coastguard Worker // Designates which entropy source was returned from this class. 252*6777b538SAndroid Build Coastguard Worker // This is used for testing to validate that we return the correct source 253*6777b538SAndroid Build Coastguard Worker // depending on the state of the service. 254*6777b538SAndroid Build Coastguard Worker enum EntropySourceType { 255*6777b538SAndroid Build Coastguard Worker ENTROPY_SOURCE_NONE, 256*6777b538SAndroid Build Coastguard Worker ENTROPY_SOURCE_LOW, 257*6777b538SAndroid Build Coastguard Worker ENTROPY_SOURCE_HIGH, 258*6777b538SAndroid Build Coastguard Worker ENTROPY_SOURCE_ENUM_SIZE, 259*6777b538SAndroid Build Coastguard Worker }; 260*6777b538SAndroid Build Coastguard Worker 261*6777b538SAndroid Build Coastguard Worker // These values are persisted to logs. Entries should not be renumbered and 262*6777b538SAndroid Build Coastguard Worker // numerical values should never be reused. 263*6777b538SAndroid Build Coastguard Worker enum class ClientIdSource { 264*6777b538SAndroid Build Coastguard Worker // Recorded when the client ID in Local State matches the cached copy. 265*6777b538SAndroid Build Coastguard Worker kClientIdMatches = 0, 266*6777b538SAndroid Build Coastguard Worker // Recorded when we are somehow missing the cached client ID and we are 267*6777b538SAndroid Build Coastguard Worker // able to recover it from the Local State. 268*6777b538SAndroid Build Coastguard Worker kClientIdFromLocalState = 1, 269*6777b538SAndroid Build Coastguard Worker // Recorded when we are somehow missing the client ID stored in Local State 270*6777b538SAndroid Build Coastguard Worker // yet are able to recover it from a backup location. 271*6777b538SAndroid Build Coastguard Worker kClientIdBackupRecovered = 2, 272*6777b538SAndroid Build Coastguard Worker // Recorded when we are somehow missing the client ID in Local State, cache 273*6777b538SAndroid Build Coastguard Worker // and backup and there is no provisional client ID, so a new client ID is 274*6777b538SAndroid Build Coastguard Worker // generated. 275*6777b538SAndroid Build Coastguard Worker kClientIdNew = 3, 276*6777b538SAndroid Build Coastguard Worker // Recorded when we are somehow missing the client ID in Local State, cache 277*6777b538SAndroid Build Coastguard Worker // and backup, so we promote the provisional client ID. 278*6777b538SAndroid Build Coastguard Worker kClientIdFromProvisionalId = 4, 279*6777b538SAndroid Build Coastguard Worker // Recorded when the client ID is passed in from external source. 280*6777b538SAndroid Build Coastguard Worker // This is needed for Lacros since the client id is passed in from 281*6777b538SAndroid Build Coastguard Worker // ash chrome. 282*6777b538SAndroid Build Coastguard Worker kClientIdFromExternal = 5, 283*6777b538SAndroid Build Coastguard Worker kMaxValue = kClientIdFromExternal, 284*6777b538SAndroid Build Coastguard Worker }; 285*6777b538SAndroid Build Coastguard Worker 286*6777b538SAndroid Build Coastguard Worker // Creates the MetricsStateManager with the given |local_state|. Uses 287*6777b538SAndroid Build Coastguard Worker // |enabled_state_provider| to query whether there is consent for metrics 288*6777b538SAndroid Build Coastguard Worker // reporting, and if it is enabled. Clients should instead use Create(), which 289*6777b538SAndroid Build Coastguard Worker // enforces that a single instance of this class be alive at any given time. 290*6777b538SAndroid Build Coastguard Worker // |store_client_info| should back up client info to persistent storage such 291*6777b538SAndroid Build Coastguard Worker // that it is later retrievable by |load_client_info|. 292*6777b538SAndroid Build Coastguard Worker MetricsStateManager(PrefService* local_state, 293*6777b538SAndroid Build Coastguard Worker EnabledStateProvider* enabled_state_provider, 294*6777b538SAndroid Build Coastguard Worker const std::wstring& backup_registry_key, 295*6777b538SAndroid Build Coastguard Worker const base::FilePath& user_data_dir, 296*6777b538SAndroid Build Coastguard Worker EntropyParams entropy_params, 297*6777b538SAndroid Build Coastguard Worker StartupVisibility startup_visibility, 298*6777b538SAndroid Build Coastguard Worker StoreClientInfoCallback store_client_info, 299*6777b538SAndroid Build Coastguard Worker LoadClientInfoCallback load_client_info, 300*6777b538SAndroid Build Coastguard Worker base::StringPiece external_client_id); 301*6777b538SAndroid Build Coastguard Worker 302*6777b538SAndroid Build Coastguard Worker // Returns a MetricsStateManagerProvider instance and sets its 303*6777b538SAndroid Build Coastguard Worker // |log_normal_metric_state_.gen| with the provided random seed. 304*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MetricsProvider> GetProviderAndSetRandomSeedForTesting( 305*6777b538SAndroid Build Coastguard Worker int64_t seed); 306*6777b538SAndroid Build Coastguard Worker 307*6777b538SAndroid Build Coastguard Worker // Backs up the current client info via |store_client_info_|. 308*6777b538SAndroid Build Coastguard Worker void BackUpCurrentClientInfo(); 309*6777b538SAndroid Build Coastguard Worker 310*6777b538SAndroid Build Coastguard Worker // Loads the client info via |load_client_info_|. 311*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ClientInfo> LoadClientInfo(); 312*6777b538SAndroid Build Coastguard Worker 313*6777b538SAndroid Build Coastguard Worker // Returns the high entropy source for this client, which is composed of a 314*6777b538SAndroid Build Coastguard Worker // client ID and the low entropy source. This is intended to be unique for 315*6777b538SAndroid Build Coastguard Worker // each install. UMA must be enabled (and |client_id_| must be set) or 316*6777b538SAndroid Build Coastguard Worker // |kMetricsProvisionalClientID| must be set before calling this. 317*6777b538SAndroid Build Coastguard Worker std::string GetHighEntropySource(); 318*6777b538SAndroid Build Coastguard Worker 319*6777b538SAndroid Build Coastguard Worker // Updates |entropy_source_returned_| with |type| iff the current value is 320*6777b538SAndroid Build Coastguard Worker // ENTROPY_SOURCE_NONE and logs the new value in a histogram. 321*6777b538SAndroid Build Coastguard Worker void UpdateEntropySourceReturnedValue(EntropySourceType type); 322*6777b538SAndroid Build Coastguard Worker 323*6777b538SAndroid Build Coastguard Worker // Returns the first entropy source that was returned by this service since 324*6777b538SAndroid Build Coastguard Worker // start up, or NONE if neither was returned yet. This is exposed for testing 325*6777b538SAndroid Build Coastguard Worker // only. entropy_source_returned()326*6777b538SAndroid Build Coastguard Worker EntropySourceType entropy_source_returned() const { 327*6777b538SAndroid Build Coastguard Worker return entropy_source_returned_; 328*6777b538SAndroid Build Coastguard Worker } 329*6777b538SAndroid Build Coastguard Worker initial_client_id_for_testing()330*6777b538SAndroid Build Coastguard Worker std::string initial_client_id_for_testing() const { 331*6777b538SAndroid Build Coastguard Worker return initial_client_id_; 332*6777b538SAndroid Build Coastguard Worker } 333*6777b538SAndroid Build Coastguard Worker 334*6777b538SAndroid Build Coastguard Worker // Reset the client id and low entropy source if the kMetricsResetMetricIDs 335*6777b538SAndroid Build Coastguard Worker // pref is true. 336*6777b538SAndroid Build Coastguard Worker void ResetMetricsIDsIfNecessary(); 337*6777b538SAndroid Build Coastguard Worker 338*6777b538SAndroid Build Coastguard Worker bool ShouldGenerateProvisionalClientId(bool is_first_run); 339*6777b538SAndroid Build Coastguard Worker 340*6777b538SAndroid Build Coastguard Worker // Whether an instance of this class exists. Used to enforce that there aren't 341*6777b538SAndroid Build Coastguard Worker // multiple instances of this class at a given time. 342*6777b538SAndroid Build Coastguard Worker static bool instance_exists_; 343*6777b538SAndroid Build Coastguard Worker 344*6777b538SAndroid Build Coastguard Worker // Weak pointer to the local state prefs store. 345*6777b538SAndroid Build Coastguard Worker const raw_ptr<PrefService> local_state_; 346*6777b538SAndroid Build Coastguard Worker 347*6777b538SAndroid Build Coastguard Worker // Weak pointer to an enabled state provider. Used to know whether the user 348*6777b538SAndroid Build Coastguard Worker // has consented to reporting, and if reporting should be done. 349*6777b538SAndroid Build Coastguard Worker raw_ptr<EnabledStateProvider> enabled_state_provider_; 350*6777b538SAndroid Build Coastguard Worker 351*6777b538SAndroid Build Coastguard Worker // Specified options for controlling trial randomization. 352*6777b538SAndroid Build Coastguard Worker const EntropyParams entropy_params_; 353*6777b538SAndroid Build Coastguard Worker 354*6777b538SAndroid Build Coastguard Worker // A callback run during client id creation so this MetricsStateManager can 355*6777b538SAndroid Build Coastguard Worker // store a backup of the newly generated ID. 356*6777b538SAndroid Build Coastguard Worker const StoreClientInfoCallback store_client_info_; 357*6777b538SAndroid Build Coastguard Worker 358*6777b538SAndroid Build Coastguard Worker // A callback run if this MetricsStateManager can't get the client id from 359*6777b538SAndroid Build Coastguard Worker // its typical location and wants to attempt loading it from this backup. 360*6777b538SAndroid Build Coastguard Worker const LoadClientInfoCallback load_client_info_; 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Worker // A beacon used to determine whether the previous Chrome browser session 363*6777b538SAndroid Build Coastguard Worker // terminated gracefully. 364*6777b538SAndroid Build Coastguard Worker CleanExitBeacon clean_exit_beacon_; 365*6777b538SAndroid Build Coastguard Worker 366*6777b538SAndroid Build Coastguard Worker // The identifier that's sent to the server with the log reports. 367*6777b538SAndroid Build Coastguard Worker std::string client_id_; 368*6777b538SAndroid Build Coastguard Worker 369*6777b538SAndroid Build Coastguard Worker // The client id that was used do field trial randomization. This field should 370*6777b538SAndroid Build Coastguard Worker // only be changed when we need to do group assignment. |initial_client_id| 371*6777b538SAndroid Build Coastguard Worker // should left blank iff a client id was not used to do field trial 372*6777b538SAndroid Build Coastguard Worker // randomization. 373*6777b538SAndroid Build Coastguard Worker std::string initial_client_id_; 374*6777b538SAndroid Build Coastguard Worker 375*6777b538SAndroid Build Coastguard Worker // If not empty, use an external client id passed in from another browser as 376*6777b538SAndroid Build Coastguard Worker // |client_id_|. This is needed for the Lacros browser where client id needs 377*6777b538SAndroid Build Coastguard Worker // be passed in from ash chrome. 378*6777b538SAndroid Build Coastguard Worker std::string external_client_id_; 379*6777b538SAndroid Build Coastguard Worker 380*6777b538SAndroid Build Coastguard Worker // An instance of EntropyState for getting the entropy source values. 381*6777b538SAndroid Build Coastguard Worker EntropyState entropy_state_; 382*6777b538SAndroid Build Coastguard Worker 383*6777b538SAndroid Build Coastguard Worker // The last entropy source returned by this service, used for testing. 384*6777b538SAndroid Build Coastguard Worker EntropySourceType entropy_source_returned_; 385*6777b538SAndroid Build Coastguard Worker 386*6777b538SAndroid Build Coastguard Worker // The value of prefs::kMetricsResetIds seen upon startup, i.e., the value 387*6777b538SAndroid Build Coastguard Worker // that was appropriate in the previous session. Used when reporting previous 388*6777b538SAndroid Build Coastguard Worker // session (stability) data. 389*6777b538SAndroid Build Coastguard Worker bool metrics_ids_were_reset_; 390*6777b538SAndroid Build Coastguard Worker 391*6777b538SAndroid Build Coastguard Worker // The value of the metrics id before reseting. Only possibly valid if the 392*6777b538SAndroid Build Coastguard Worker // metrics id was reset. May be blank if the metrics id was reset but Chrome 393*6777b538SAndroid Build Coastguard Worker // has no record of what the previous metrics id was. 394*6777b538SAndroid Build Coastguard Worker std::string previous_client_id_; 395*6777b538SAndroid Build Coastguard Worker 396*6777b538SAndroid Build Coastguard Worker // The detector for understanding the cloned nature of the install so that we 397*6777b538SAndroid Build Coastguard Worker // can reset client ids. 398*6777b538SAndroid Build Coastguard Worker ClonedInstallDetector cloned_install_detector_; 399*6777b538SAndroid Build Coastguard Worker 400*6777b538SAndroid Build Coastguard Worker // The type of session, e.g. a foreground session, at startup. This value is 401*6777b538SAndroid Build Coastguard Worker // used only during startup. On Android WebLayer, Android WebView, and iOS, 402*6777b538SAndroid Build Coastguard Worker // the visibility is unknown at this point in startup. 403*6777b538SAndroid Build Coastguard Worker const StartupVisibility startup_visibility_; 404*6777b538SAndroid Build Coastguard Worker 405*6777b538SAndroid Build Coastguard Worker // Force enables the creation of a provisional client ID on first run even if 406*6777b538SAndroid Build Coastguard Worker // this is not a Chrome-branded build. Used for testing. 407*6777b538SAndroid Build Coastguard Worker static bool enable_provisional_client_id_for_testing_; 408*6777b538SAndroid Build Coastguard Worker }; 409*6777b538SAndroid Build Coastguard Worker 410*6777b538SAndroid Build Coastguard Worker } // namespace metrics 411*6777b538SAndroid Build Coastguard Worker 412*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_ 413