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