OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "chrome/browser/prefs/chrome_pref_service_factory.h" | 5 #include "chrome/browser/prefs/chrome_pref_service_factory.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 | 64 |
65 namespace { | 65 namespace { |
66 | 66 |
67 // These preferences must be kept in sync with the TrackedPreference enum in | 67 // These preferences must be kept in sync with the TrackedPreference enum in |
68 // tools/metrics/histograms/histograms.xml. To add a new preference, append it | 68 // tools/metrics/histograms/histograms.xml. To add a new preference, append it |
69 // to the array and add a corresponding value to the histogram enum. Each | 69 // to the array and add a corresponding value to the histogram enum. Each |
70 // tracked preference must be given a unique reporting ID. | 70 // tracked preference must be given a unique reporting ID. |
71 const PrefHashFilter::TrackedPreferenceMetadata kTrackedPrefs[] = { | 71 const PrefHashFilter::TrackedPreferenceMetadata kTrackedPrefs[] = { |
72 { | 72 { |
73 0, prefs::kShowHomeButton, | 73 0, prefs::kShowHomeButton, |
74 PrefHashFilter::ENFORCE_ALL, | 74 PrefHashFilter::ENFORCE_ON_LOAD, |
75 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 75 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
76 }, | 76 }, |
77 { | 77 { |
78 1, prefs::kHomePageIsNewTabPage, | 78 1, prefs::kHomePageIsNewTabPage, |
79 PrefHashFilter::ENFORCE_ALL, | 79 PrefHashFilter::ENFORCE_ON_LOAD, |
80 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 80 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
81 }, | 81 }, |
82 { | 82 { |
83 2, prefs::kHomePage, | 83 2, prefs::kHomePage, |
84 PrefHashFilter::ENFORCE_ALL, | 84 PrefHashFilter::ENFORCE_ON_LOAD, |
85 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 85 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
86 }, | 86 }, |
87 { | 87 { |
88 3, prefs::kRestoreOnStartup, | 88 3, prefs::kRestoreOnStartup, |
89 PrefHashFilter::ENFORCE_ALL, | 89 PrefHashFilter::ENFORCE_ON_LOAD, |
90 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 90 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
91 }, | 91 }, |
92 { | 92 { |
93 4, prefs::kURLsToRestoreOnStartup, | 93 4, prefs::kURLsToRestoreOnStartup, |
94 PrefHashFilter::ENFORCE_ALL, | 94 PrefHashFilter::ENFORCE_ON_LOAD, |
95 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 95 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
96 }, | 96 }, |
97 { | 97 { |
98 5, extensions::pref_names::kExtensions, | 98 5, extensions::pref_names::kExtensions, |
99 PrefHashFilter::NO_ENFORCEMENT, | 99 PrefHashFilter::NO_ENFORCEMENT, |
100 PrefHashFilter::TRACKING_STRATEGY_SPLIT | 100 PrefHashFilter::TRACKING_STRATEGY_SPLIT |
101 }, | 101 }, |
102 { | 102 { |
103 6, prefs::kGoogleServicesLastUsername, | 103 6, prefs::kGoogleServicesLastUsername, |
104 PrefHashFilter::ENFORCE_ALL, | 104 PrefHashFilter::ENFORCE_ON_LOAD, |
105 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 105 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
106 }, | 106 }, |
107 { | 107 { |
108 7, prefs::kSearchProviderOverrides, | 108 7, prefs::kSearchProviderOverrides, |
109 PrefHashFilter::ENFORCE_ALL, | 109 PrefHashFilter::ENFORCE_ON_LOAD, |
110 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 110 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
111 }, | 111 }, |
112 { | 112 { |
113 8, prefs::kDefaultSearchProviderSearchURL, | 113 8, prefs::kDefaultSearchProviderSearchURL, |
114 PrefHashFilter::ENFORCE_ALL, | 114 PrefHashFilter::ENFORCE_ON_LOAD, |
115 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 115 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
116 }, | 116 }, |
117 { | 117 { |
118 9, prefs::kDefaultSearchProviderKeyword, | 118 9, prefs::kDefaultSearchProviderKeyword, |
119 PrefHashFilter::ENFORCE_ALL, | 119 PrefHashFilter::ENFORCE_ON_LOAD, |
120 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 120 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
121 }, | 121 }, |
122 { | 122 { |
123 10, prefs::kDefaultSearchProviderName, | 123 10, prefs::kDefaultSearchProviderName, |
124 PrefHashFilter::ENFORCE_ALL, | 124 PrefHashFilter::ENFORCE_ON_LOAD, |
125 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 125 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
126 }, | 126 }, |
127 #if !defined(OS_ANDROID) | 127 #if !defined(OS_ANDROID) |
128 { | 128 { |
129 11, prefs::kPinnedTabs, | 129 11, prefs::kPinnedTabs, |
130 PrefHashFilter::ENFORCE_ALL, | 130 PrefHashFilter::ENFORCE_ON_LOAD, |
131 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 131 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
132 }, | 132 }, |
133 #endif | 133 #endif |
134 { | 134 { |
135 12, extensions::pref_names::kKnownDisabled, | 135 12, extensions::pref_names::kKnownDisabled, |
136 PrefHashFilter::NO_ENFORCEMENT, | 136 PrefHashFilter::NO_ENFORCEMENT, |
137 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 137 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
138 }, | 138 }, |
139 { | 139 { |
140 13, prefs::kProfileResetPromptMemento, | 140 13, prefs::kProfileResetPromptMemento, |
141 PrefHashFilter::ENFORCE_ALL, | 141 PrefHashFilter::ENFORCE_ON_LOAD, |
142 PrefHashFilter::TRACKING_STRATEGY_ATOMIC | 142 PrefHashFilter::TRACKING_STRATEGY_ATOMIC |
143 }, | 143 }, |
144 }; | 144 }; |
145 | 145 |
146 // The count of tracked preferences IDs across all platforms. | 146 // The count of tracked preferences IDs across all platforms. |
147 const size_t kTrackedPrefsReportingIDsCount = 14; | 147 const size_t kTrackedPrefsReportingIDsCount = 14; |
148 COMPILE_ASSERT(kTrackedPrefsReportingIDsCount >= arraysize(kTrackedPrefs), | 148 COMPILE_ASSERT(kTrackedPrefsReportingIDsCount >= arraysize(kTrackedPrefs), |
149 need_to_increment_ids_count); | 149 need_to_increment_ids_count); |
150 | 150 |
151 PrefHashFilter::EnforcementLevel GetSettingsEnforcementLevel() { | 151 enum SettingsEnforcementGroup { |
152 static const char kSettingsEnforcementExperiment[] = "SettingsEnforcement"; | 152 GROUP_NO_ENFORCEMENT, |
| 153 // Only enforce settings on profile loads; still allow seeding of unloaded |
| 154 // profiles. |
| 155 GROUP_ENFORCE_ON_LOAD, |
| 156 // TOOD(gab): Block unloaded profile seeding in this mode. |
| 157 GROUP_ENFORCE_ALWAYS |
| 158 }; |
| 159 |
| 160 SettingsEnforcementGroup GetSettingsEnforcementGroup() { |
153 struct { | 161 struct { |
154 const char* level_name; | 162 const char* group_name; |
155 PrefHashFilter::EnforcementLevel level; | 163 SettingsEnforcementGroup group; |
156 } static const kEnforcementLevelMap[] = { | 164 } static const kEnforcementLevelMap[] = { |
157 { | 165 { chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement, |
158 "no_enforcement", | 166 GROUP_NO_ENFORCEMENT }, |
159 PrefHashFilter::NO_ENFORCEMENT | 167 { chrome_prefs::internals::kSettingsEnforcementGroupEnforceOnload, |
160 }, | 168 GROUP_ENFORCE_ON_LOAD }, |
161 { | 169 { chrome_prefs::internals::kSettingsEnforcementGroupEnforceAlways, |
162 "enforce", | 170 GROUP_ENFORCE_ALWAYS }, |
163 PrefHashFilter::ENFORCE | |
164 }, | |
165 { | |
166 "enforce_no_seeding", | |
167 PrefHashFilter::ENFORCE_NO_SEEDING | |
168 }, | |
169 { | |
170 "enforce_no_seeding_no_migration", | |
171 PrefHashFilter::ENFORCE_NO_SEEDING_NO_MIGRATION | |
172 }, | |
173 }; | 171 }; |
174 COMPILE_ASSERT(ARRAYSIZE_UNSAFE(kEnforcementLevelMap) == | |
175 (PrefHashFilter::ENFORCE_ALL - | |
176 PrefHashFilter::NO_ENFORCEMENT), | |
177 missing_enforcement_level); | |
178 | 172 |
179 base::FieldTrial* trial = | 173 base::FieldTrial* trial = |
180 base::FieldTrialList::Find(kSettingsEnforcementExperiment); | 174 base::FieldTrialList::Find( |
| 175 chrome_prefs::internals::kSettingsEnforcementTrialName); |
181 if (trial) { | 176 if (trial) { |
182 const std::string& group_name = trial->group_name(); | 177 const std::string& group_name = trial->group_name(); |
183 // ARRAYSIZE_UNSAFE must be used since the array is declared locally; it is | 178 // ARRAYSIZE_UNSAFE must be used since the array is declared locally; it is |
184 // only unsafe because it could not trigger a compile error on some | 179 // only unsafe because it could not trigger a compile error on some |
185 // non-array pointer types; this is fine since kEnforcementLevelMap is | 180 // non-array pointer types; this is fine since kEnforcementLevelMap is |
186 // clearly an array. | 181 // clearly an array. |
187 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kEnforcementLevelMap); ++i) { | 182 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kEnforcementLevelMap); ++i) { |
188 if (kEnforcementLevelMap[i].level_name == group_name) | 183 if (kEnforcementLevelMap[i].group_name == group_name) |
189 return kEnforcementLevelMap[i].level; | 184 return kEnforcementLevelMap[i].group; |
190 } | 185 } |
191 } | 186 } |
192 #if defined(OS_WIN) | 187 #if defined(OS_WIN) |
193 // Default to ENFORCE_ALL in the absence of a valid value for the | 188 // Default to GROUP_ENFORCE_ALWAYS in the absence of a valid value for the |
194 // SettingsEnforcement field trial. | 189 // SettingsEnforcement field trial. |
195 // TODO(gab): Switch other platforms over to this mode. | 190 // TODO(gab): Switch other platforms over to this mode. |
196 return PrefHashFilter::ENFORCE_ALL; | 191 return GROUP_ENFORCE_ALWAYS; |
197 #else | 192 #else |
198 return PrefHashFilter::NO_ENFORCEMENT; | 193 return GROUP_NO_ENFORCEMENT; |
199 #endif | 194 #endif |
200 } | 195 } |
201 | 196 |
202 // Shows notifications which correspond to PersistentPrefStore's reading errors. | 197 // Shows notifications which correspond to PersistentPrefStore's reading errors. |
203 void HandleReadError(PersistentPrefStore::PrefReadError error) { | 198 void HandleReadError(PersistentPrefStore::PrefReadError error) { |
204 // Sample the histogram also for the successful case in order to get a | 199 // Sample the histogram also for the successful case in order to get a |
205 // baseline on the success rate in addition to the error distribution. | 200 // baseline on the success rate in addition to the error distribution. |
206 UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, | 201 UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, |
207 PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM); | 202 PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM); |
208 | 203 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 } | 262 } |
268 | 263 |
269 void HandleResetEvent() { | 264 void HandleResetEvent() { |
270 g_browser_process->local_state()->SetInt64( | 265 g_browser_process->local_state()->SetInt64( |
271 prefs::kProfilePreferenceResetTime, | 266 prefs::kProfilePreferenceResetTime, |
272 base::Time::Now().ToInternalValue()); | 267 base::Time::Now().ToInternalValue()); |
273 } | 268 } |
274 | 269 |
275 scoped_ptr<PrefHashFilter> CreatePrefHashFilter( | 270 scoped_ptr<PrefHashFilter> CreatePrefHashFilter( |
276 scoped_ptr<PrefHashStore> pref_hash_store) { | 271 scoped_ptr<PrefHashStore> pref_hash_store) { |
| 272 const PrefHashFilter::EnforcementLevel enforcement_level = |
| 273 GetSettingsEnforcementGroup() == GROUP_NO_ENFORCEMENT ? |
| 274 PrefHashFilter::NO_ENFORCEMENT : PrefHashFilter::ENFORCE_ON_LOAD; |
277 return make_scoped_ptr(new PrefHashFilter(pref_hash_store.Pass(), | 275 return make_scoped_ptr(new PrefHashFilter(pref_hash_store.Pass(), |
278 kTrackedPrefs, | 276 kTrackedPrefs, |
279 arraysize(kTrackedPrefs), | 277 arraysize(kTrackedPrefs), |
280 kTrackedPrefsReportingIDsCount, | 278 kTrackedPrefsReportingIDsCount, |
281 GetSettingsEnforcementLevel(), | 279 enforcement_level, |
282 base::Bind(&HandleResetEvent))); | 280 base::Bind(&HandleResetEvent))); |
283 } | 281 } |
284 | 282 |
285 void PrepareBuilder( | 283 void PrepareBuilder( |
286 PrefServiceSyncableFactory* factory, | 284 PrefServiceSyncableFactory* factory, |
287 const base::FilePath& pref_filename, | 285 const base::FilePath& pref_filename, |
288 base::SequencedTaskRunner* pref_io_task_runner, | 286 base::SequencedTaskRunner* pref_io_task_runner, |
289 policy::PolicyService* policy_service, | 287 policy::PolicyService* policy_service, |
290 ManagedUserSettingsService* managed_user_settings, | 288 ManagedUserSettingsService* managed_user_settings, |
291 scoped_ptr<PrefHashStore> pref_hash_store, | 289 scoped_ptr<PrefHashStore> pref_hash_store, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 "Settings.TrackedPreferencesInitializedForUnloadedProfile", true); | 389 "Settings.TrackedPreferencesInitializedForUnloadedProfile", true); |
392 } | 390 } |
393 pref_store_->RemoveObserver(this); | 391 pref_store_->RemoveObserver(this); |
394 delete this; | 392 delete this; |
395 } | 393 } |
396 | 394 |
397 } // namespace | 395 } // namespace |
398 | 396 |
399 namespace chrome_prefs { | 397 namespace chrome_prefs { |
400 | 398 |
| 399 namespace internals { |
| 400 |
| 401 const char kSettingsEnforcementTrialName[] = "SettingsEnforcement"; |
| 402 const char kSettingsEnforcementGroupNoEnforcement[] = "no_enforcement"; |
| 403 const char kSettingsEnforcementGroupEnforceOnload[] = "enforce_on_load"; |
| 404 const char kSettingsEnforcementGroupEnforceAlways[] = "enforce_always"; |
| 405 |
| 406 } // namespace internals |
| 407 |
401 scoped_ptr<PrefService> CreateLocalState( | 408 scoped_ptr<PrefService> CreateLocalState( |
402 const base::FilePath& pref_filename, | 409 const base::FilePath& pref_filename, |
403 base::SequencedTaskRunner* pref_io_task_runner, | 410 base::SequencedTaskRunner* pref_io_task_runner, |
404 policy::PolicyService* policy_service, | 411 policy::PolicyService* policy_service, |
405 const scoped_refptr<PrefRegistry>& pref_registry, | 412 const scoped_refptr<PrefRegistry>& pref_registry, |
406 bool async) { | 413 bool async) { |
407 PrefServiceSyncableFactory factory; | 414 PrefServiceSyncableFactory factory; |
408 PrepareBuilder(&factory, | 415 PrepareBuilder(&factory, |
409 pref_filename, | 416 pref_filename, |
410 pref_io_task_runner, | 417 pref_io_task_runner, |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 UMA_HISTOGRAM_BOOLEAN("Settings.InitializedFromMasterPrefs", success); | 508 UMA_HISTOGRAM_BOOLEAN("Settings.InitializedFromMasterPrefs", success); |
502 return success; | 509 return success; |
503 } | 510 } |
504 | 511 |
505 void RegisterPrefs(PrefRegistrySimple* registry) { | 512 void RegisterPrefs(PrefRegistrySimple* registry) { |
506 registry->RegisterInt64Pref(prefs::kProfilePreferenceResetTime, 0L); | 513 registry->RegisterInt64Pref(prefs::kProfilePreferenceResetTime, 0L); |
507 PrefHashStoreImpl::RegisterPrefs(registry); | 514 PrefHashStoreImpl::RegisterPrefs(registry); |
508 } | 515 } |
509 | 516 |
510 } // namespace chrome_prefs | 517 } // namespace chrome_prefs |
OLD | NEW |