| 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 |