chrome_pref_service_factory.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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_manager.h" 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/search_engines/default_search_pref_migration.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" 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_context.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/pref_names.h" 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/browser_resources.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h" 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/configuration_policy_pref_store.h" 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 54c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif 55c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_pref_store.h" 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/win/win_util.h" 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_RLZ) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "rlz/lib/machine_id.h" 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(ENABLE_RLZ) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_WIN) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserContext; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Whether we are in testing mode; can be enabled via 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DisableDelaysAndDomainCheckForTesting(). Forces startup checks to occur 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// with no delay and ignores the presence of a domain when determining the 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// active SettingsEnforcement group. 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool g_disable_delays_and_domain_check_for_testing = false; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These preferences must be kept in sync with the TrackedPreference enum in 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tools/metrics/histograms/histograms.xml. To add a new preference, append it 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to the array and add a corresponding value to the histogram enum. Each 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracked preference must be given a unique reporting ID. 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const PrefHashFilter::TrackedPreferenceMetadata kTrackedPrefs[] = { 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, prefs::kShowHomeButton, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, prefs::kHomePageIsNewTabPage, 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2, prefs::kHomePage, 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, prefs::kRestoreOnStartup, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4, prefs::kURLsToRestoreOnStartup, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5, extensions::pref_names::kExtensions, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::NO_ENFORCEMENT, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_SPLIT 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6, prefs::kGoogleServicesLastUsername, 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7, prefs::kSearchProviderOverrides, 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8, prefs::kDefaultSearchProviderSearchURL, 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9, prefs::kDefaultSearchProviderKeyword, 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10, prefs::kDefaultSearchProviderName, 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11, prefs::kPinnedTabs, 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12, extensions::pref_names::kKnownDisabled, 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::NO_ENFORCEMENT, 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13, prefs::kProfileResetPromptMemento, 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 14, DefaultSearchManager::kDefaultSearchProviderDataPrefName, 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PrefHashFilter::NO_ENFORCEMENT, 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }, 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Protecting kPreferenceResetTime does two things: 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 1) It ensures this isn't accidently set by someone stomping the pref 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // file. 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 2) More importantly, it declares kPreferenceResetTime as a protected 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // pref which is required for it to be visible when queried via the 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // SegregatedPrefStore. This is because it's written directly in the 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // protected JsonPrefStore by that store's PrefHashFilter if there was 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // a reset in FilterOnLoad and SegregatedPrefStore will not look for it 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // in the protected JsonPrefStore unless it's declared as a protected 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // preference here. 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15, prefs::kPreferenceResetTime, 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter::ENFORCE_ON_LOAD, 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter::TRACKING_STRATEGY_ATOMIC 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The count of tracked preferences IDs across all platforms. 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const size_t kTrackedPrefsReportingIDsCount = 16; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)COMPILE_ASSERT(kTrackedPrefsReportingIDsCount >= arraysize(kTrackedPrefs), 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) need_to_increment_ids_count); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Each group enforces a superset of the protection provided by the previous 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// one. 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum SettingsEnforcementGroup { 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_NO_ENFORCEMENT, 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Enforce protected settings on profile loads. 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GROUP_ENFORCE_ALWAYS, 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Also enforce extension default search. 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_DSE, 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Also enforce extension settings and default search. 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE, 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The default enforcement group contains all protection features. 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GROUP_ENFORCE_DEFAULT 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SettingsEnforcementGroup GetSettingsEnforcementGroup() { 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# if defined(OS_WIN) 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!g_disable_delays_and_domain_check_for_testing) { 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool first_call = true; 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const bool is_enrolled_to_domain = base::win::IsEnrolledToDomain(); 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (first_call) { 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Settings.TrackedPreferencesNoEnforcementOnDomain", 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_enrolled_to_domain); 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) first_call = false; 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_enrolled_to_domain) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GROUP_NO_ENFORCEMENT; 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct { 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* group_name; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SettingsEnforcementGroup group; 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } static const kEnforcementLevelMap[] = { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement, 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_NO_ENFORCEMENT }, 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { chrome_prefs::internals::kSettingsEnforcementGroupEnforceAlways, 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GROUP_ENFORCE_ALWAYS }, 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { chrome_prefs::internals:: 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kSettingsEnforcementGroupEnforceAlwaysWithDSE, 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_DSE }, 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { chrome_prefs::internals:: 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE, 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE }, 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Use the no enforcement setting in the absence of a field trial 228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // config. Remember to update the OFFICIAL_BUILD section of 229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // extension_startup_browsertest.cc when updating the default value below. 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // TODO(gab): Change this to the strongest enforcement on all platforms. 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SettingsEnforcementGroup enforcement_group = GROUP_NO_ENFORCEMENT; 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool group_determined_from_trial = false; 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrial* trial = 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrialList::Find( 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome_prefs::internals::kSettingsEnforcementTrialName); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (trial) { 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& group_name = trial->group_name(); 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ARRAYSIZE_UNSAFE must be used since the array is declared locally; it is 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only unsafe because it could not trigger a compile error on some 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // non-array pointer types; this is fine since kEnforcementLevelMap is 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clearly an array. 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kEnforcementLevelMap); ++i) { 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (kEnforcementLevelMap[i].group_name == group_name) { 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enforcement_group = kEnforcementLevelMap[i].group; 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) group_determined_from_trial = true; 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Settings.EnforcementGroupDeterminedFromTrial", 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) group_determined_from_trial); 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return enforcement_group; 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the effective preference tracking configuration. 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::vector<PrefHashFilter::TrackedPreferenceMetadata> 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GetTrackingConfiguration() { 258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const SettingsEnforcementGroup enforcement_group = 259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetSettingsEnforcementGroup(); 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<PrefHashFilter::TrackedPreferenceMetadata> result; 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t i = 0; i < arraysize(kTrackedPrefs); ++i) { 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrefHashFilter::TrackedPreferenceMetadata data = kTrackedPrefs[i]; 264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (GROUP_NO_ENFORCEMENT == enforcement_group) { 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Remove enforcement for all tracked preferences. 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data.enforcement_level = PrefHashFilter::NO_ENFORCEMENT; 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_DSE && 271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.name == DefaultSearchManager::kDefaultSearchProviderDataPrefName) { 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Specifically enable default search settings enforcement. 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD; 274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE && 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (data.name == extensions::pref_names::kExtensions || 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) data.name == extensions::pref_names::kKnownDisabled)) { 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Specifically enable extension settings enforcement and ensure 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // kKnownDisabled follows it in the Protected Preferences. 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(gab): Get rid of kKnownDisabled altogether. 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD; 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result.push_back(data); 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shows notifications which correspond to PersistentPrefStore's reading errors. 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HandleReadError(PersistentPrefStore::PrefReadError error) { 29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sample the histogram also for the successful case in order to get a 29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // baseline on the success rate in addition to the error distribution. 29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM); 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) { 29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_CHROMEOS) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // an example problem that this can cause. 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do some diagnosis and try to avoid losing data. 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int message_id = 0; 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE || 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) error == PersistentPrefStore::PREF_READ_ERROR_LEVELDB_CORRUPTION) { 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_CORRUPT_ERROR; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_UNREADABLE_ERROR; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (message_id) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&ShowProfileErrorDialog, 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PROFILE_ERROR_PREFERENCES, 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) message_id)); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // On ChromeOS error screen with message about broken local state 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // will be displayed. 32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_ptr<ProfilePrefStoreManager> CreateProfilePrefStoreManager( 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path) { 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string device_id; 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) && defined(ENABLE_RLZ) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is used by 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // chrome/browser/extensions/api/music_manager_private/device_id_win.cc 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // but that API is private (http://crbug.com/276485) and other platforms are 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not available synchronously. 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // As part of improving pref metrics on other platforms we may want to find 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ways to defer preference loading until the device ID can be used. 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rlz_lib::GetMachineId(&device_id); 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return make_scoped_ptr(new ProfilePrefStoreManager( 337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_path, 338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetTrackingConfiguration(), 339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kTrackedPrefsReportingIDsCount, 340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ResourceBundle::GetSharedInstance() 341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .GetRawDataResource(IDR_PREF_HASH_SEED_BIN) 342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .as_string(), 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_id, 344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch g_browser_process->local_state())); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrepareFactory( 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory* factory, 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings, 351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<PersistentPrefStore> user_pref_store, 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) using policy::ConfigurationPolicyPrefStore; 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_managed_prefs( 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr(new ConfigurationPolicyPrefStore( 358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy_service, 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_browser_process->browser_policy_connector()->GetHandlerList(), 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_LEVEL_MANDATORY))); 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_recommended_prefs( 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr(new ConfigurationPolicyPrefStore( 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy_service, 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_browser_process->browser_policy_connector()->GetHandlerList(), 365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_LEVEL_RECOMMENDED))); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // ENABLE_CONFIGURATION_POLICY 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user_settings) { 370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_supervised_user_prefs( 371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) make_scoped_refptr( 372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new SupervisedUserPrefStore(supervised_user_settings))); 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_async(async); 377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_extension_prefs(extension_prefs); 378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_command_line_prefs( 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr( 380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new CommandLinePrefStore(CommandLine::ForCurrentProcess()))); 381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory->set_read_error_callback(base::Bind(&HandleReadError)); 382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch factory->set_user_prefs(user_pref_store); 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome_prefs { 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace internals { 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementTrialName[] = "SettingsEnforcement"; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupNoEnforcement[] = "no_enforcement"; 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlways[] = "enforce_always"; 394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlwaysWithDSE[] = 395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "enforce_always_with_dse"; 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE[] = 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "enforce_always_with_extensions_and_dse"; 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace internals 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefService> CreateLocalState( 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pref_filename, 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefRegistry>& pref_registry, 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory factory; 408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrepareFactory( 409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &factory, 410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch policy_service, 411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL, // supervised_user_settings 412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new JsonPrefStore( 413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_filename, pref_io_task_runner, scoped_ptr<PrefFilter>()), 414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NULL, // extension_prefs 415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch async); 416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return factory.Create(pref_registry.get()); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefServiceSyncable> CreateProfilePrefs( 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path, 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TrackedPreferenceValidationDelegate* validation_delegate, 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings, 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry, 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs"); 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefServiceSyncableFactory factory; 430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrepareFactory( 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &factory, 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) policy_service, 433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_settings, 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<PersistentPrefStore>( 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateProfilePrefStoreManager(profile_path)->CreateProfilePrefStore( 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pref_io_task_runner, validation_delegate)), 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extension_prefs, 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) async); 439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<PrefServiceSyncable> pref_service = 440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) factory.CreateSyncable(pref_registry.get()); 441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConfigureDefaultSearchPrefMigrationToDictionaryValue(pref_service.get()); 443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return pref_service.Pass(); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SchedulePrefsFilePathVerification(const base::FilePath& profile_path) { 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only do prefs file verification on Windows. 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int kVerifyPrefsFileDelaySeconds = 60; 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::GetBlockingPool()->PostDelayedTask( 452effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FROM_HERE, 453effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&VerifyPreferencesFile, 454effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::GetPrefFilePathFromProfilePath( 455effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_path)), 456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeDelta::FromSeconds(g_disable_delays_and_domain_check_for_testing 457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ? 0 458effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : kVerifyPrefsFileDelaySeconds)); 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DisableDelaysAndDomainCheckForTesting() { 463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_disable_delays_and_domain_check_for_testing = true; 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InitializePrefsFromMasterPrefs( 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& profile_path, 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue& master_prefs) { 469effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return CreateProfilePrefStoreManager(profile_path) 470effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ->InitializePrefsFromMasterPrefs(master_prefs); 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::Time GetResetTime(Profile* profile) { 474effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return ProfilePrefStoreManager::GetResetTime(profile->GetPrefs()); 475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ClearResetTime(Profile* profile) { 478effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::ClearResetTime(profile->GetPrefs()); 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { 482effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::RegisterProfilePrefs(registry); 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RegisterPrefs(PrefRegistrySimple* registry) { 486effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfilePrefStoreManager::RegisterPrefs(registry); 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chrome_prefs 490