chrome_pref_service_factory.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/chrome_pref_service_factory.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/compiler_specific.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/debug/trace_event.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/field_trial.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/default_pref_store.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/json_pref_store.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_filter.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_notifier_impl.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_store.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_value_store.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/time.h" 27c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/browser_process.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/prefs/browser_ui_prefs_migrator.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/command_line_pref_store.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prefs/pref_hash_filter.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_model_associator.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable_factory.h" 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/prefs/profile_pref_store_manager.h" 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/file_path_verifier_win.h" 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/search_engines/default_search_pref_migration.h" 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_start_util.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/profile_error_dialog.h" 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h" 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h" 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/component_updater/pref_names.h" 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/default_search_manager.h" 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_engines_pref_names.h" 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/sync_driver/pref_names.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_context.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/browser_resources.h" 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h" 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/configuration_policy_pref_store.h" 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 59c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif 60c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS) 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/pref_names.h" 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_pref_store.h" 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/win/win_util.h" 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_RLZ) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "rlz/lib/machine_id.h" 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(ENABLE_RLZ) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_WIN) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserContext; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Whether we are in testing mode; can be enabled via 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DisableDelaysAndDomainCheckForTesting(). Forces startup checks to occur 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// with no delay and ignores the presence of a domain when determining the 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// active SettingsEnforcement group. 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool g_disable_delays_and_domain_check_for_testing = false; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These preferences must be kept in sync with the TrackedPreference enum in 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tools/metrics/histograms/histograms.xml. To add a new preference, append it 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to the array and add a corresponding value to the histogram enum. Each 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracked preference must be given a unique reporting ID. 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// See CleanupDeprecatedTrackedPreferences() in pref_hash_filter.cc to remove a 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// deprecated tracked preference. 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const PrefHashFilter::TrackedPreferenceMetadata kTrackedPrefs[] = { 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, prefs::kShowHomeButton, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, prefs::kHomePageIsNewTabPage, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2, prefs::kHomePage, 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, prefs::kRestoreOnStartup, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4, prefs::kURLsToRestoreOnStartup, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5, extensions::pref_names::kExtensions, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::NO_ENFORCEMENT, 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_SPLIT 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6, prefs::kGoogleServicesLastUsername, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7, prefs::kSearchProviderOverrides, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8, prefs::kDefaultSearchProviderSearchURL, 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9, prefs::kDefaultSearchProviderKeyword, 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10, prefs::kDefaultSearchProviderName, 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11, prefs::kPinnedTabs, 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13, prefs::kProfileResetPromptMementoInProfilePrefs, 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefHashFilter::ENFORCE_ON_LOAD, 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 14, DefaultSearchManager::kDefaultSearchProviderDataPrefName, 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PrefHashFilter::NO_ENFORCEMENT, 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }, 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Protecting kPreferenceResetTime does two things: 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 1) It ensures this isn't accidently set by someone stomping the pref 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // file. 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 2) More importantly, it declares kPreferenceResetTime as a protected 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // pref which is required for it to be visible when queried via the 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // SegregatedPrefStore. This is because it's written directly in the 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // protected JsonPrefStore by that store's PrefHashFilter if there was 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // a reset in FilterOnLoad and SegregatedPrefStore will not look for it 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // in the protected JsonPrefStore unless it's declared as a protected 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // preference here. 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15, prefs::kPreferenceResetTime, 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) { 1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 16, prefs::kSafeBrowsingIncidentReportSent, 1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) }, 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17, sync_driver::prefs::kSyncRemainingRollbackTries, 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PrefHashFilter::ENFORCE_ON_LOAD, 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PrefHashFilter::TRACKING_STRATEGY_ATOMIC 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }, 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18, prefs::kSafeBrowsingIncidentsSent, 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }, 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 19, prefs::kSwReporterPromptVersion, 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefHashFilter::ENFORCE_ON_LOAD, 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefHashFilter::TRACKING_STRATEGY_ATOMIC 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 20, prefs::kSwReporterPromptReason, 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefHashFilter::ENFORCE_ON_LOAD, 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefHashFilter::TRACKING_STRATEGY_ATOMIC 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// One more than the last tracked preferences ID above. 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const size_t kTrackedPrefsReportingIDsCount = 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTrackedPrefs[arraysize(kTrackedPrefs) - 1].reporting_id + 1; 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Each group enforces a superset of the protection provided by the previous 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// one. 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum SettingsEnforcementGroup { 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_NO_ENFORCEMENT, 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Enforce protected settings on profile loads. 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GROUP_ENFORCE_ALWAYS, 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Also enforce extension default search. 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_DSE, 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Also enforce extension settings and default search. 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE, 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The default enforcement group contains all protection features. 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GROUP_ENFORCE_DEFAULT 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SettingsEnforcementGroup GetSettingsEnforcementGroup() { 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# if defined(OS_WIN) 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!g_disable_delays_and_domain_check_for_testing) { 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool first_call = true; 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const bool is_enrolled_to_domain = base::win::IsEnrolledToDomain(); 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (first_call) { 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Settings.TrackedPreferencesNoEnforcementOnDomain", 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_enrolled_to_domain); 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) first_call = false; 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_enrolled_to_domain) 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GROUP_NO_ENFORCEMENT; 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct { 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* group_name; 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SettingsEnforcementGroup group; 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } static const kEnforcementLevelMap[] = { 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement, 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_NO_ENFORCEMENT }, 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { chrome_prefs::internals::kSettingsEnforcementGroupEnforceAlways, 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_ENFORCE_ALWAYS }, 253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { chrome_prefs::internals:: 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kSettingsEnforcementGroupEnforceAlwaysWithDSE, 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_DSE }, 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { chrome_prefs::internals:: 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE, 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE }, 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Use the strongest enforcement setting in the absence of a field trial 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // config on Windows. Remember to update the OFFICIAL_BUILD section of 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // extension_startup_browsertest.cc and pref_hash_browsertest.cc when updating 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the default value below. 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(gab): Enforce this on all platforms. 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SettingsEnforcementGroup enforcement_group = 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GROUP_ENFORCE_DEFAULT; 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GROUP_NO_ENFORCEMENT; 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool group_determined_from_trial = false; 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrial* trial = 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrialList::Find( 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome_prefs::internals::kSettingsEnforcementTrialName); 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (trial) { 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& group_name = trial->group_name(); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ARRAYSIZE_UNSAFE must be used since the array is declared locally; it is 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only unsafe because it could not trigger a compile error on some 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // non-array pointer types; this is fine since kEnforcementLevelMap is 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clearly an array. 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kEnforcementLevelMap); ++i) { 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (kEnforcementLevelMap[i].group_name == group_name) { 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enforcement_group = kEnforcementLevelMap[i].group; 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) group_determined_from_trial = true; 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Settings.EnforcementGroupDeterminedFromTrial", 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) group_determined_from_trial); 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return enforcement_group; 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the effective preference tracking configuration. 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::vector<PrefHashFilter::TrackedPreferenceMetadata> 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GetTrackingConfiguration() { 298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const SettingsEnforcementGroup enforcement_group = 299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetSettingsEnforcementGroup(); 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<PrefHashFilter::TrackedPreferenceMetadata> result; 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t i = 0; i < arraysize(kTrackedPrefs); ++i) { 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrefHashFilter::TrackedPreferenceMetadata data = kTrackedPrefs[i]; 304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (GROUP_NO_ENFORCEMENT == enforcement_group) { 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Remove enforcement for all tracked preferences. 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data.enforcement_level = PrefHashFilter::NO_ENFORCEMENT; 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_DSE && 311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.name == DefaultSearchManager::kDefaultSearchProviderDataPrefName) { 312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Specifically enable default search settings enforcement. 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD; 314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS) 317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE && 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data.name == extensions::pref_names::kExtensions) { 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Specifically enable extension settings enforcement. 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD; 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.push_back(data); 325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shows notifications which correspond to PersistentPrefStore's reading errors. 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HandleReadError(PersistentPrefStore::PrefReadError error) { 33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sample the histogram also for the successful case in order to get a 33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // baseline on the success rate in addition to the error distribution. 33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM); 33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) { 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_CHROMEOS) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // an example problem that this can cause. 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do some diagnosis and try to avoid losing data. 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int message_id = 0; 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE || 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error == PersistentPrefStore::PREF_READ_ERROR_LEVELDB_CORRUPTION) { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_CORRUPT_ERROR; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_UNREADABLE_ERROR; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (message_id) { 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&ShowProfileErrorDialog, 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PROFILE_ERROR_PREFERENCES, 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) message_id)); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // On ChromeOS error screen with message about broken local state 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // will be displayed. 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A supplementary error message about broken local state - is included 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // in logs and user feedbacks. 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (error != PersistentPrefStore::PREF_READ_ERROR_NONE && 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) { 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LOG(ERROR) << "An error happened during prefs loading: " << error; 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_ptr<ProfilePrefStoreManager> CreateProfilePrefStoreManager( 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path) { 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string device_id; 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) && defined(ENABLE_RLZ) 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is used by 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // chrome/browser/extensions/api/music_manager_private/device_id_win.cc 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // but that API is private (http://crbug.com/276485) and other platforms are 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not available synchronously. 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // As part of improving pref metrics on other platforms we may want to find 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ways to defer preference loading until the device ID can be used. 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rlz_lib::GetMachineId(&device_id); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string seed; 3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) seed = ResourceBundle::GetSharedInstance().GetRawDataResource( 3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) IDR_PREF_HASH_SEED_BIN).as_string(); 3856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return make_scoped_ptr(new ProfilePrefStoreManager( 387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_path, 388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetTrackingConfiguration(), 389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kTrackedPrefsReportingIDsCount, 3906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) seed, 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_id, 392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch g_browser_process->local_state())); 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrepareFactory( 396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory* factory, 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings, 399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<PersistentPrefStore> user_pref_store, 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) using policy::ConfigurationPolicyPrefStore; 404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_managed_prefs( 405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr(new ConfigurationPolicyPrefStore( 406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy_service, 407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_browser_process->browser_policy_connector()->GetHandlerList(), 408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_LEVEL_MANDATORY))); 409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_recommended_prefs( 410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr(new ConfigurationPolicyPrefStore( 411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy_service, 412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_browser_process->browser_policy_connector()->GetHandlerList(), 413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_LEVEL_RECOMMENDED))); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // ENABLE_CONFIGURATION_POLICY 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user_settings) { 418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_supervised_user_prefs( 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) make_scoped_refptr( 420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new SupervisedUserPrefStore(supervised_user_settings))); 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_async(async); 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_extension_prefs(extension_prefs); 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_command_line_prefs( 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr( 428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new CommandLinePrefStore(CommandLine::ForCurrentProcess()))); 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_read_error_callback(base::Bind(&HandleReadError)); 430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch factory->set_user_prefs(user_pref_store); 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome_prefs { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace internals { 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Group modifications should be reflected in first_run_browsertest.cc and 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// pref_hash_browsertest.cc. 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementTrialName[] = "SettingsEnforcement"; 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupNoEnforcement[] = "no_enforcement"; 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlways[] = "enforce_always"; 444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlwaysWithDSE[] = 445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "enforce_always_with_dse"; 446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE[] = 447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "enforce_always_with_extensions_and_dse"; 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace internals 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefService> CreateLocalState( 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pref_filename, 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefRegistry>& pref_registry, 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory factory; 458effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrepareFactory( 459effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &factory, 460effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch policy_service, 461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL, // supervised_user_settings 462effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new JsonPrefStore( 463effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_filename, pref_io_task_runner, scoped_ptr<PrefFilter>()), 464effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NULL, // extension_prefs 465effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch async); 466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return factory.Create(pref_registry.get()); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefServiceSyncable> CreateProfilePrefs( 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path, 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TrackedPreferenceValidationDelegate* validation_delegate, 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry, 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs"); 4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // A StartSyncFlare used to kick sync early in case of a reset event. This is 4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // done since sync may bring back the user's server value post-reset which 4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // could potentially cause a "settings flash" between the factory default and 4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the re-instantiated server value. Starting sync ASAP minimizes the window 4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // before the server value is re-instantiated (this window can otherwise be 4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // as long as 10 seconds by default). 4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure start_sync_flare_for_prefs = 4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(sync_start_util::GetFlareForSyncableService(profile_path), 4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::PREFERENCES); 4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory factory; 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<PersistentPrefStore> user_pref_store( 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateProfilePrefStoreManager(profile_path) 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->CreateProfilePrefStore(pref_io_task_runner, 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci start_sync_flare_for_prefs, 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci validation_delegate)); 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // BrowserUIPrefsMigrator unregisters and deletes itself after it is done. 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_pref_store->AddObserver( 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new BrowserUIPrefsMigrator(user_pref_store.get())); 4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PrepareFactory(&factory, 5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) policy_service, 5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) supervised_user_settings, 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_pref_store, 5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension_prefs, 5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) async); 505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<PrefServiceSyncable> pref_service = 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) factory.CreateSyncable(pref_registry.get()); 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConfigureDefaultSearchPrefMigrationToDictionaryValue(pref_service.get()); 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return pref_service.Pass(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SchedulePrefsFilePathVerification(const base::FilePath& profile_path) { 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only do prefs file verification on Windows. 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int kVerifyPrefsFileDelaySeconds = 60; 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::GetBlockingPool()->PostDelayedTask( 518effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FROM_HERE, 519effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&VerifyPreferencesFile, 520effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::GetPrefFilePathFromProfilePath( 521effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_path)), 522effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeDelta::FromSeconds(g_disable_delays_and_domain_check_for_testing 523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ? 0 524effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : kVerifyPrefsFileDelaySeconds)); 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DisableDelaysAndDomainCheckForTesting() { 529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_disable_delays_and_domain_check_for_testing = true; 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InitializePrefsFromMasterPrefs( 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path, 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue& master_prefs) { 535effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return CreateProfilePrefStoreManager(profile_path) 536effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ->InitializePrefsFromMasterPrefs(master_prefs); 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::Time GetResetTime(Profile* profile) { 540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return ProfilePrefStoreManager::GetResetTime(profile->GetPrefs()); 541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ClearResetTime(Profile* profile) { 544effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::ClearResetTime(profile->GetPrefs()); 545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { 548effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::RegisterProfilePrefs(registry); 549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RegisterPrefs(PrefRegistrySimple* registry) { 552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::RegisterPrefs(registry); 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chrome_prefs 556