chrome_pref_service_factory.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/command_line_pref_store.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prefs/pref_hash_filter.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_model_associator.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable_factory.h" 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/prefs/profile_pref_store_manager.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/file_path_verifier_win.h" 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/search_engines/default_search_pref_migration.h" 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_start_util.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/profile_error_dialog.h" 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h" 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h" 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/default_search_manager.h" 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_engines_pref_names.h" 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/sync_driver/pref_names.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_context.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/browser_resources.h" 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 53c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h" 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/configuration_policy_pref_store.h" 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 57c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif 58c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS) 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/pref_names.h" 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_pref_store.h" 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/win/win_util.h" 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_RLZ) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "rlz/lib/machine_id.h" 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(ENABLE_RLZ) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_WIN) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserContext; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Whether we are in testing mode; can be enabled via 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DisableDelaysAndDomainCheckForTesting(). Forces startup checks to occur 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// with no delay and ignores the presence of a domain when determining the 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// active SettingsEnforcement group. 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool g_disable_delays_and_domain_check_for_testing = false; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These preferences must be kept in sync with the TrackedPreference enum in 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tools/metrics/histograms/histograms.xml. To add a new preference, append it 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to the array and add a corresponding value to the histogram enum. Each 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracked preference must be given a unique reporting ID. 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// See CleanupDeprecatedTrackedPreferences() in pref_hash_filter.cc to remove a 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// deprecated tracked preference. 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const PrefHashFilter::TrackedPreferenceMetadata kTrackedPrefs[] = { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, prefs::kShowHomeButton, 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, prefs::kHomePageIsNewTabPage, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2, prefs::kHomePage, 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, prefs::kRestoreOnStartup, 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4, prefs::kURLsToRestoreOnStartup, 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5, extensions::pref_names::kExtensions, 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::NO_ENFORCEMENT, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_SPLIT 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6, prefs::kGoogleServicesLastUsername, 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7, prefs::kSearchProviderOverrides, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8, prefs::kDefaultSearchProviderSearchURL, 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9, prefs::kDefaultSearchProviderKeyword, 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10, prefs::kDefaultSearchProviderName, 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11, prefs::kPinnedTabs, 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 14, DefaultSearchManager::kDefaultSearchProviderDataPrefName, 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PrefHashFilter::NO_ENFORCEMENT, 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }, 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Protecting kPreferenceResetTime does two things: 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 1) It ensures this isn't accidently set by someone stomping the pref 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // file. 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 2) More importantly, it declares kPreferenceResetTime as a protected 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // pref which is required for it to be visible when queried via the 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // SegregatedPrefStore. This is because it's written directly in the 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // protected JsonPrefStore by that store's PrefHashFilter if there was 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // a reset in FilterOnLoad and SegregatedPrefStore will not look for it 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // in the protected JsonPrefStore unless it's declared as a protected 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // preference here. 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15, prefs::kPreferenceResetTime, 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) { 1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 16, prefs::kSafeBrowsingIncidentReportSent, 1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) }, 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17, sync_driver::prefs::kSyncRemainingRollbackTries, 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PrefHashFilter::ENFORCE_ON_LOAD, 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PrefHashFilter::TRACKING_STRATEGY_ATOMIC 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }, 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18, prefs::kSafeBrowsingIncidentsSent, 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }, 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// One more than the last tracked preferences ID above. 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const size_t kTrackedPrefsReportingIDsCount = 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTrackedPrefs[arraysize(kTrackedPrefs) - 1].reporting_id + 1; 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Each group enforces a superset of the protection provided by the previous 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// one. 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum SettingsEnforcementGroup { 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_NO_ENFORCEMENT, 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Enforce protected settings on profile loads. 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GROUP_ENFORCE_ALWAYS, 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Also enforce extension default search. 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_DSE, 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Also enforce extension settings and default search. 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE, 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The default enforcement group contains all protection features. 208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GROUP_ENFORCE_DEFAULT 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SettingsEnforcementGroup GetSettingsEnforcementGroup() { 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# if defined(OS_WIN) 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!g_disable_delays_and_domain_check_for_testing) { 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool first_call = true; 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const bool is_enrolled_to_domain = base::win::IsEnrolledToDomain(); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (first_call) { 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Settings.TrackedPreferencesNoEnforcementOnDomain", 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_enrolled_to_domain); 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) first_call = false; 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_enrolled_to_domain) 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GROUP_NO_ENFORCEMENT; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct { 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* group_name; 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SettingsEnforcementGroup group; 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } static const kEnforcementLevelMap[] = { 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement, 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_NO_ENFORCEMENT }, 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { chrome_prefs::internals::kSettingsEnforcementGroupEnforceAlways, 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_ENFORCE_ALWAYS }, 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { chrome_prefs::internals:: 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kSettingsEnforcementGroupEnforceAlwaysWithDSE, 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_DSE }, 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { chrome_prefs::internals:: 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE, 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE }, 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Use the strongest enforcement setting in the absence of a field trial 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // config on Windows. Remember to update the OFFICIAL_BUILD section of 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // extension_startup_browsertest.cc and pref_hash_browsertest.cc when updating 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the default value below. 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(gab): Enforce this on all platforms. 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SettingsEnforcementGroup enforcement_group = 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GROUP_ENFORCE_DEFAULT; 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GROUP_NO_ENFORCEMENT; 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool group_determined_from_trial = false; 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrial* trial = 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrialList::Find( 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome_prefs::internals::kSettingsEnforcementTrialName); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (trial) { 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& group_name = trial->group_name(); 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ARRAYSIZE_UNSAFE must be used since the array is declared locally; it is 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only unsafe because it could not trigger a compile error on some 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // non-array pointer types; this is fine since kEnforcementLevelMap is 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clearly an array. 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kEnforcementLevelMap); ++i) { 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (kEnforcementLevelMap[i].group_name == group_name) { 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enforcement_group = kEnforcementLevelMap[i].group; 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) group_determined_from_trial = true; 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Settings.EnforcementGroupDeterminedFromTrial", 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) group_determined_from_trial); 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return enforcement_group; 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the effective preference tracking configuration. 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::vector<PrefHashFilter::TrackedPreferenceMetadata> 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GetTrackingConfiguration() { 279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const SettingsEnforcementGroup enforcement_group = 280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetSettingsEnforcementGroup(); 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<PrefHashFilter::TrackedPreferenceMetadata> result; 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t i = 0; i < arraysize(kTrackedPrefs); ++i) { 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrefHashFilter::TrackedPreferenceMetadata data = kTrackedPrefs[i]; 285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (GROUP_NO_ENFORCEMENT == enforcement_group) { 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Remove enforcement for all tracked preferences. 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data.enforcement_level = PrefHashFilter::NO_ENFORCEMENT; 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_DSE && 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.name == DefaultSearchManager::kDefaultSearchProviderDataPrefName) { 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Specifically enable default search settings enforcement. 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD; 295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS) 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE && 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data.name == extensions::pref_names::kExtensions) { 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Specifically enable extension settings enforcement. 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD; 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.push_back(data); 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shows notifications which correspond to PersistentPrefStore's reading errors. 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HandleReadError(PersistentPrefStore::PrefReadError error) { 31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sample the histogram also for the successful case in order to get a 31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // baseline on the success rate in addition to the error distribution. 31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM); 31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) { 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_CHROMEOS) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // an example problem that this can cause. 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do some diagnosis and try to avoid losing data. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int message_id = 0; 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE || 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error == PersistentPrefStore::PREF_READ_ERROR_LEVELDB_CORRUPTION) { 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_CORRUPT_ERROR; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_UNREADABLE_ERROR; 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (message_id) { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&ShowProfileErrorDialog, 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PROFILE_ERROR_PREFERENCES, 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) message_id)); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // On ChromeOS error screen with message about broken local state 33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // will be displayed. 34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_ptr<ProfilePrefStoreManager> CreateProfilePrefStoreManager( 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path) { 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string device_id; 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) && defined(ENABLE_RLZ) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is used by 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // chrome/browser/extensions/api/music_manager_private/device_id_win.cc 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // but that API is private (http://crbug.com/276485) and other platforms are 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not available synchronously. 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // As part of improving pref metrics on other platforms we may want to find 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ways to defer preference loading until the device ID can be used. 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rlz_lib::GetMachineId(&device_id); 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string seed; 3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) seed = ResourceBundle::GetSharedInstance().GetRawDataResource( 3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) IDR_PREF_HASH_SEED_BIN).as_string(); 3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return make_scoped_ptr(new ProfilePrefStoreManager( 362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_path, 363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetTrackingConfiguration(), 364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kTrackedPrefsReportingIDsCount, 3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) seed, 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_id, 367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch g_browser_process->local_state())); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrepareFactory( 371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory* factory, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings, 374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<PersistentPrefStore> user_pref_store, 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) using policy::ConfigurationPolicyPrefStore; 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_managed_prefs( 380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr(new ConfigurationPolicyPrefStore( 381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy_service, 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_browser_process->browser_policy_connector()->GetHandlerList(), 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_LEVEL_MANDATORY))); 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_recommended_prefs( 385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr(new ConfigurationPolicyPrefStore( 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy_service, 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_browser_process->browser_policy_connector()->GetHandlerList(), 388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_LEVEL_RECOMMENDED))); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // ENABLE_CONFIGURATION_POLICY 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user_settings) { 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_supervised_user_prefs( 394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) make_scoped_refptr( 395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new SupervisedUserPrefStore(supervised_user_settings))); 39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_async(async); 400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_extension_prefs(extension_prefs); 401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_command_line_prefs( 402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr( 403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new CommandLinePrefStore(CommandLine::ForCurrentProcess()))); 404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_read_error_callback(base::Bind(&HandleReadError)); 405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch factory->set_user_prefs(user_pref_store); 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome_prefs { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace internals { 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Group modifications should be reflected in first_run_browsertest.cc and 4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// pref_hash_browsertest.cc. 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementTrialName[] = "SettingsEnforcement"; 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupNoEnforcement[] = "no_enforcement"; 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlways[] = "enforce_always"; 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlwaysWithDSE[] = 420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "enforce_always_with_dse"; 421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE[] = 422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "enforce_always_with_extensions_and_dse"; 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace internals 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefService> CreateLocalState( 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pref_filename, 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefRegistry>& pref_registry, 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory factory; 433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrepareFactory( 434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &factory, 435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch policy_service, 436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL, // supervised_user_settings 437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new JsonPrefStore( 438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_filename, pref_io_task_runner, scoped_ptr<PrefFilter>()), 439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NULL, // extension_prefs 440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch async); 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return factory.Create(pref_registry.get()); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefServiceSyncable> CreateProfilePrefs( 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path, 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TrackedPreferenceValidationDelegate* validation_delegate, 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings, 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry, 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs"); 4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // A StartSyncFlare used to kick sync early in case of a reset event. This is 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // done since sync may bring back the user's server value post-reset which 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // could potentially cause a "settings flash" between the factory default and 4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the re-instantiated server value. Starting sync ASAP minimizes the window 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // before the server value is re-instantiated (this window can otherwise be 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // as long as 10 seconds by default). 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure start_sync_flare_for_prefs = 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(sync_start_util::GetFlareForSyncableService(profile_path), 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::PREFERENCES); 4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory factory; 4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PrepareFactory(&factory, 4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) policy_service, 4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) supervised_user_settings, 4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<PersistentPrefStore>( 4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateProfilePrefStoreManager(profile_path) 4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ->CreateProfilePrefStore(pref_io_task_runner, 4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) start_sync_flare_for_prefs, 4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) validation_delegate)), 4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension_prefs, 4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) async); 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<PrefServiceSyncable> pref_service = 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) factory.CreateSyncable(pref_registry.get()); 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConfigureDefaultSearchPrefMigrationToDictionaryValue(pref_service.get()); 480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return pref_service.Pass(); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SchedulePrefsFilePathVerification(const base::FilePath& profile_path) { 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only do prefs file verification on Windows. 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int kVerifyPrefsFileDelaySeconds = 60; 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::GetBlockingPool()->PostDelayedTask( 489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FROM_HERE, 490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&VerifyPreferencesFile, 491effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::GetPrefFilePathFromProfilePath( 492effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_path)), 493effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeDelta::FromSeconds(g_disable_delays_and_domain_check_for_testing 494effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ? 0 495effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : kVerifyPrefsFileDelaySeconds)); 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DisableDelaysAndDomainCheckForTesting() { 500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_disable_delays_and_domain_check_for_testing = true; 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InitializePrefsFromMasterPrefs( 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path, 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue& master_prefs) { 506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return CreateProfilePrefStoreManager(profile_path) 507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ->InitializePrefsFromMasterPrefs(master_prefs); 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::Time GetResetTime(Profile* profile) { 511effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return ProfilePrefStoreManager::GetResetTime(profile->GetPrefs()); 512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ClearResetTime(Profile* profile) { 515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::ClearResetTime(profile->GetPrefs()); 516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { 519effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::RegisterProfilePrefs(registry); 520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RegisterPrefs(PrefRegistrySimple* registry) { 523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::RegisterPrefs(registry); 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chrome_prefs 527