Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: components/metrics/metrics_state_manager.h

Issue 1958003003: Splitting the concept of UMA consent, and should UMA report. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #ifndef COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_ 5 #ifndef COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_
6 #define COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_ 6 #define COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_
7 7
8 #include <memory> 8 #include <memory>
9 #include <string> 9 #include <string>
10 10
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/gtest_prod_util.h" 12 #include "base/gtest_prod_util.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/metrics/field_trial.h" 14 #include "base/metrics/field_trial.h"
15 #include "components/metrics/client_info.h" 15 #include "components/metrics/client_info.h"
16 16
17 class PrefService; 17 class PrefService;
18 class PrefRegistrySimple; 18 class PrefRegistrySimple;
19 19
20 namespace metrics { 20 namespace metrics {
21 21
22 class ClonedInstallDetector; 22 class ClonedInstallDetector;
23 class EnabledStateProvider;
23 24
24 // Responsible for managing MetricsService state prefs, specifically the UMA 25 // Responsible for managing MetricsService state prefs, specifically the UMA
25 // client id and low entropy source. Code outside the metrics directory should 26 // client id and low entropy source. Code outside the metrics directory should
26 // not be instantiating or using this class directly. 27 // not be instantiating or using this class directly.
27 class MetricsStateManager { 28 class MetricsStateManager {
28 public: 29 public:
29 // A callback that can be invoked to store client info to persistent storage. 30 // A callback that can be invoked to store client info to persistent storage.
30 // Storing an empty client_id will resulted in the backup being voided. 31 // Storing an empty client_id will resulted in the backup being voided.
31 typedef base::Callback<void(const ClientInfo& client_info)> 32 typedef base::Callback<void(const ClientInfo& client_info)>
32 StoreClientInfoCallback; 33 StoreClientInfoCallback;
33 34
34 // A callback that can be invoked to load client info stored through the 35 // A callback that can be invoked to load client info stored through the
35 // StoreClientInfoCallback. 36 // StoreClientInfoCallback.
36 typedef base::Callback<std::unique_ptr<ClientInfo>(void)> 37 typedef base::Callback<std::unique_ptr<ClientInfo>(void)>
37 LoadClientInfoCallback; 38 LoadClientInfoCallback;
38 39
39 virtual ~MetricsStateManager(); 40 virtual ~MetricsStateManager();
40 41
41 // Returns true if the user opted in to sending metric reports. 42 // Returns true if the user has consented to sending metric reports, and there
43 // is no other reason to disable reporting. One such reason is client
44 // sampling, and this client isn't in the sample.
42 bool IsMetricsReportingEnabled(); 45 bool IsMetricsReportingEnabled();
43 46
44 // Returns the client ID for this client, or the empty string if the user is 47 // Returns the client ID for this client, or the empty string if the user is
45 // not opted in to metrics reporting. 48 // not opted in to metrics reporting.
46 const std::string& client_id() const { return client_id_; } 49 const std::string& client_id() const { return client_id_; }
47 50
48 // Forces the client ID to be generated. This is useful in case it's needed 51 // Forces the client ID to be generated. This is useful in case it's needed
49 // before recording. 52 // before recording.
50 void ForceClientIdCreation(); 53 void ForceClientIdCreation();
51 54
(...skipping 10 matching lines...) Expand all
62 // that has a high source of entropy, partially based on the client ID. 65 // that has a high source of entropy, partially based on the client ID.
63 // Otherwise, it returns an entropy provider that is based on a low entropy 66 // Otherwise, it returns an entropy provider that is based on a low entropy
64 // source. 67 // source.
65 std::unique_ptr<const base::FieldTrial::EntropyProvider> 68 std::unique_ptr<const base::FieldTrial::EntropyProvider>
66 CreateEntropyProvider(); 69 CreateEntropyProvider();
67 70
68 // Creates the MetricsStateManager, enforcing that only a single instance 71 // Creates the MetricsStateManager, enforcing that only a single instance
69 // of the class exists at a time. Returns NULL if an instance exists already. 72 // of the class exists at a time. Returns NULL if an instance exists already.
70 static std::unique_ptr<MetricsStateManager> Create( 73 static std::unique_ptr<MetricsStateManager> Create(
71 PrefService* local_state, 74 PrefService* local_state,
72 const base::Callback<bool(void)>& is_reporting_enabled_callback, 75 EnabledStateProvider* enabled_state_provider,
73 const StoreClientInfoCallback& store_client_info, 76 const StoreClientInfoCallback& store_client_info,
74 const LoadClientInfoCallback& load_client_info); 77 const LoadClientInfoCallback& load_client_info);
75 78
76 // Registers local state prefs used by this class. 79 // Registers local state prefs used by this class.
77 static void RegisterPrefs(PrefRegistrySimple* registry); 80 static void RegisterPrefs(PrefRegistrySimple* registry);
78 81
79 private: 82 private:
80 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, EntropySourceUsed_Low); 83 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, EntropySourceUsed_Low);
81 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, EntropySourceUsed_High); 84 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, EntropySourceUsed_High);
82 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, LowEntropySource0NotReset); 85 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, LowEntropySource0NotReset);
83 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, 86 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest,
84 PermutedEntropyCacheClearedWhenLowEntropyReset); 87 PermutedEntropyCacheClearedWhenLowEntropyReset);
85 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, ResetMetricsIDs); 88 FRIEND_TEST_ALL_PREFIXES(MetricsStateManagerTest, ResetMetricsIDs);
86 89
87 // Designates which entropy source was returned from this class. 90 // Designates which entropy source was returned from this class.
88 // This is used for testing to validate that we return the correct source 91 // This is used for testing to validate that we return the correct source
89 // depending on the state of the service. 92 // depending on the state of the service.
90 enum EntropySourceType { 93 enum EntropySourceType {
91 ENTROPY_SOURCE_NONE, 94 ENTROPY_SOURCE_NONE,
92 ENTROPY_SOURCE_LOW, 95 ENTROPY_SOURCE_LOW,
93 ENTROPY_SOURCE_HIGH, 96 ENTROPY_SOURCE_HIGH,
94 ENTROPY_SOURCE_ENUM_SIZE, 97 ENTROPY_SOURCE_ENUM_SIZE,
95 }; 98 };
96 99
97 // Creates the MetricsStateManager with the given |local_state|. Calls 100 // Creates the MetricsStateManager with the given |local_state|. Uses
98 // |is_reporting_enabled_callback| to query whether metrics reporting is 101 // |enabled_state_provider| to query whether there is consent for metrics
99 // enabled. Clients should instead use Create(), which enforces that a single 102 // reporting, and if it is enabled. Clients should instead use Create(), which
100 // instance of this class be alive at any given time. 103 // enforces that a single instance of this class be alive at any given time.
101 // |store_client_info| should back up client info to persistent storage such 104 // |store_client_info| should back up client info to persistent storage such
102 // that it is later retrievable by |load_client_info|. 105 // that it is later retrievable by |load_client_info|.
103 MetricsStateManager( 106 MetricsStateManager(PrefService* local_state,
104 PrefService* local_state, 107 EnabledStateProvider* enabled_state_provider,
105 const base::Callback<bool(void)>& is_reporting_enabled_callback, 108 const StoreClientInfoCallback& store_client_info,
106 const StoreClientInfoCallback& store_client_info, 109 const LoadClientInfoCallback& load_client_info);
107 const LoadClientInfoCallback& load_client_info);
108 110
109 // Backs up the current client info via |store_client_info_|. 111 // Backs up the current client info via |store_client_info_|.
110 void BackUpCurrentClientInfo(); 112 void BackUpCurrentClientInfo();
111 113
112 // Loads the client info via |load_client_info_| and potentially migrates it 114 // Loads the client info via |load_client_info_| and potentially migrates it
113 // before returning it if it comes back in its old form. 115 // before returning it if it comes back in its old form.
114 std::unique_ptr<ClientInfo> LoadClientInfoAndMaybeMigrate(); 116 std::unique_ptr<ClientInfo> LoadClientInfoAndMaybeMigrate();
115 117
116 // Returns the low entropy source for this client. This is a random value 118 // Returns the low entropy source for this client. This is a random value
117 // that is non-identifying amongst browser clients. This method will 119 // that is non-identifying amongst browser clients. This method will
(...skipping 19 matching lines...) Expand all
137 // pref is true. 139 // pref is true.
138 void ResetMetricsIDsIfNecessary(); 140 void ResetMetricsIDsIfNecessary();
139 141
140 // Whether an instance of this class exists. Used to enforce that there aren't 142 // Whether an instance of this class exists. Used to enforce that there aren't
141 // multiple instances of this class at a given time. 143 // multiple instances of this class at a given time.
142 static bool instance_exists_; 144 static bool instance_exists_;
143 145
144 // Weak pointer to the local state prefs store. 146 // Weak pointer to the local state prefs store.
145 PrefService* const local_state_; 147 PrefService* const local_state_;
146 148
147 // A callback run by this MetricsStateManager to know whether reporting is 149 // Weak pointer to an enabled state provider. Used to know whether the user
148 // enabled. 150 // has consented to reporting, and if reporting should be done.
149 const base::Callback<bool(void)> is_reporting_enabled_callback_; 151 EnabledStateProvider* enabled_state_provider_;
150 152
151 // A callback run during client id creation so this MetricsStateManager can 153 // A callback run during client id creation so this MetricsStateManager can
152 // store a backup of the newly generated ID. 154 // store a backup of the newly generated ID.
153 const StoreClientInfoCallback store_client_info_; 155 const StoreClientInfoCallback store_client_info_;
154 156
155 // A callback run if this MetricsStateManager can't get the client id from 157 // A callback run if this MetricsStateManager can't get the client id from
156 // its typical location and wants to attempt loading it from this backup. 158 // its typical location and wants to attempt loading it from this backup.
157 const LoadClientInfoCallback load_client_info_; 159 const LoadClientInfoCallback load_client_info_;
158 160
159 // The identifier that's sent to the server with the log reports. 161 // The identifier that's sent to the server with the log reports.
160 std::string client_id_; 162 std::string client_id_;
161 163
162 // The non-identifying low entropy source value. 164 // The non-identifying low entropy source value.
163 int low_entropy_source_; 165 int low_entropy_source_;
164 166
165 // The last entropy source returned by this service, used for testing. 167 // The last entropy source returned by this service, used for testing.
166 EntropySourceType entropy_source_returned_; 168 EntropySourceType entropy_source_returned_;
167 169
168 std::unique_ptr<ClonedInstallDetector> cloned_install_detector_; 170 std::unique_ptr<ClonedInstallDetector> cloned_install_detector_;
169 171
170 DISALLOW_COPY_AND_ASSIGN(MetricsStateManager); 172 DISALLOW_COPY_AND_ASSIGN(MetricsStateManager);
171 }; 173 };
172 174
173 } // namespace metrics 175 } // namespace metrics
174 176
175 #endif // COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_ 177 #endif // COMPONENTS_METRICS_METRICS_STATE_MANAGER_H_
OLDNEW
« no previous file with comments | « components/metrics/metrics_service_unittest.cc ('k') | components/metrics/metrics_state_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698