chrome_pref_service_factory.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/search_engines/default_search_manager.h"
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/search_engines/default_search_pref_migration.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/profile_error_dialog.h"
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h"
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_context.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/pref_names.h"
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/browser_resources.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h"
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h"
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/configuration_policy_pref_store.h"
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h"
55c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif
56c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/managed_mode/supervised_user_pref_store.h"
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/win/win_util.h"
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_RLZ)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "rlz/lib/machine_id.h"
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(ENABLE_RLZ)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(OS_WIN)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserContext;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Whether we are in testing mode; can be enabled via
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DisableDelaysAndDomainCheckForTesting(). Forces startup checks to occur
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// with no delay and ignores the presence of a domain when determining the
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// active SettingsEnforcement group.
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool g_disable_delays_and_domain_check_for_testing = false;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These preferences must be kept in sync with the TrackedPreference enum in
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tools/metrics/histograms/histograms.xml. To add a new preference, append it
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to the array and add a corresponding value to the histogram enum. Each
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracked preference must be given a unique reporting ID.
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const PrefHashFilter::TrackedPreferenceMetadata kTrackedPrefs[] = {
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0, prefs::kShowHomeButton,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    1, prefs::kHomePageIsNewTabPage,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    2, prefs::kHomePage,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    3, prefs::kRestoreOnStartup,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    4, prefs::kURLsToRestoreOnStartup,
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    5, extensions::pref_names::kExtensions,
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::NO_ENFORCEMENT,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_SPLIT
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    6, prefs::kGoogleServicesLastUsername,
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    7, prefs::kSearchProviderOverrides,
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    8, prefs::kDefaultSearchProviderSearchURL,
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    9, prefs::kDefaultSearchProviderKeyword,
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    10, prefs::kDefaultSearchProviderName,
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    11, prefs::kPinnedTabs,
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    12, extensions::pref_names::kKnownDisabled,
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::NO_ENFORCEMENT,
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    13, prefs::kProfileResetPromptMemento,
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    14, DefaultSearchManager::kDefaultSearchProviderDataPrefName,
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PrefHashFilter::NO_ENFORCEMENT,
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  },
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  {
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Protecting kPreferenceResetTime does two things:
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //  1) It ensures this isn't accidently set by someone stomping the pref
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //     file.
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //  2) More importantly, it declares kPreferenceResetTime as a protected
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //     pref which is required for it to be visible when queried via the
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //     SegregatedPrefStore. This is because it's written directly in the
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //     protected JsonPrefStore by that store's PrefHashFilter if there was
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //     a reset in FilterOnLoad and SegregatedPrefStore will not look for it
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //     in the protected JsonPrefStore unless it's declared as a protected
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //     preference here.
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    15, prefs::kPreferenceResetTime,
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  },
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The count of tracked preferences IDs across all platforms.
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const size_t kTrackedPrefsReportingIDsCount = 16;
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)COMPILE_ASSERT(kTrackedPrefsReportingIDsCount >= arraysize(kTrackedPrefs),
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               need_to_increment_ids_count);
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Each group enforces a superset of the protection provided by the previous
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// one.
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum SettingsEnforcementGroup {
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GROUP_NO_ENFORCEMENT,
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only enforce settings on profile loads; still allow seeding of unloaded
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // profiles.
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GROUP_ENFORCE_ON_LOAD,
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Also disallow seeding of unloaded profiles.
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GROUP_ENFORCE_ALWAYS,
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Also enforce extension settings.
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS,
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Also enforce extension settings and default search.
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE,
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The default enforcement group contains all protection features.
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GROUP_ENFORCE_DEFAULT
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SettingsEnforcementGroup GetSettingsEnforcementGroup() {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# if defined(OS_WIN)
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!g_disable_delays_and_domain_check_for_testing) {
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    static bool first_call = true;
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    static const bool is_enrolled_to_domain = base::win::IsEnrolledToDomain();
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (first_call) {
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Settings.TrackedPreferencesNoEnforcementOnDomain",
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            is_enrolled_to_domain);
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      first_call = false;
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (is_enrolled_to_domain)
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return GROUP_NO_ENFORCEMENT;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct {
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const char* group_name;
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SettingsEnforcementGroup group;
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } static const kEnforcementLevelMap[] = {
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement,
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GROUP_NO_ENFORCEMENT },
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { chrome_prefs::internals::kSettingsEnforcementGroupEnforceOnload,
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GROUP_ENFORCE_ON_LOAD },
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { chrome_prefs::internals::kSettingsEnforcementGroupEnforceAlways,
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GROUP_ENFORCE_ALWAYS },
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { chrome_prefs::internals::
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          kSettingsEnforcementGroupEnforceAlwaysWithExtensions,
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS },
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { chrome_prefs::internals::
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE,
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE },
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
233e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Use the strongest enforcement setting in the absence of a field trial
2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // config on Windows. Remember to update the OFFICIAL_BUILD sections of
2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // pref_hash_browsertest.cc and extension_startup_browsertest.cc when updating
2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // the default value below.
237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // TODO(gab): Enforce this on all platforms.
238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  SettingsEnforcementGroup enforcement_group =
239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN)
240a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GROUP_ENFORCE_DEFAULT;
241a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#else
242a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GROUP_NO_ENFORCEMENT;
243a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool group_determined_from_trial = false;
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FieldTrial* trial =
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FieldTrialList::Find(
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          chrome_prefs::internals::kSettingsEnforcementTrialName);
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (trial) {
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& group_name = trial->group_name();
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // ARRAYSIZE_UNSAFE must be used since the array is declared locally; it is
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // only unsafe because it could not trigger a compile error on some
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // non-array pointer types; this is fine since kEnforcementLevelMap is
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // clearly an array.
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kEnforcementLevelMap); ++i) {
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (kEnforcementLevelMap[i].group_name == group_name) {
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        enforcement_group = kEnforcementLevelMap[i].group;
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        group_determined_from_trial = true;
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      }
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UMA_HISTOGRAM_BOOLEAN("Settings.EnforcementGroupDeterminedFromTrial",
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        group_determined_from_trial);
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return enforcement_group;
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the effective preference tracking configuration.
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::vector<PrefHashFilter::TrackedPreferenceMetadata>
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GetTrackingConfiguration() {
270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const SettingsEnforcementGroup enforcement_group =
271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetSettingsEnforcementGroup();
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::vector<PrefHashFilter::TrackedPreferenceMetadata> result;
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kTrackedPrefs); ++i) {
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PrefHashFilter::TrackedPreferenceMetadata data = kTrackedPrefs[i];
276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (GROUP_NO_ENFORCEMENT == enforcement_group) {
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // Remove enforcement for all tracked preferences.
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      data.enforcement_level = PrefHashFilter::NO_ENFORCEMENT;
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS &&
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        (data.name == extensions::pref_names::kExtensions ||
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         data.name == extensions::pref_names::kKnownDisabled)) {
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Specifically enable extension settings enforcement and ensure
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // kKnownDisabled follows it in the Protected Preferences.
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // TODO(gab): Get rid of kKnownDisabled altogether.
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD;
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (enforcement_group >= GROUP_ENFORCE_ALWAYS_WITH_EXTENSIONS_AND_DSE &&
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        data.name == DefaultSearchManager::kDefaultSearchProviderDataPrefName) {
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // Specifically enable default search settings enforcement.
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      data.enforcement_level = PrefHashFilter::ENFORCE_ON_LOAD;
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    result.push_back(data);
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return result;
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shows notifications which correspond to PersistentPrefStore's reading errors.
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HandleReadError(PersistentPrefStore::PrefReadError error) {
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Sample the histogram also for the successful case in order to get a
30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // baseline on the success rate in addition to the error distribution.
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error,
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM);
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) {
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_CHROMEOS)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // an example problem that this can cause.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Do some diagnosis and try to avoid losing data.
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int message_id = 0;
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE ||
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        error == PersistentPrefStore::PREF_READ_ERROR_LEVELDB_CORRUPTION) {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      message_id = IDS_PREFERENCES_CORRUPT_ERROR;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      message_id = IDS_PREFERENCES_UNREADABLE_ERROR;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (message_id) {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Bind(&ShowProfileErrorDialog,
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         PROFILE_ERROR_PREFERENCES,
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         message_id));
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // On ChromeOS error screen with message about broken local state
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // will be displayed.
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_ptr<ProfilePrefStoreManager> CreateProfilePrefStoreManager(
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path) {
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string device_id;
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) && defined(ENABLE_RLZ)
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This is used by
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // chrome/browser/extensions/api/music_manager_private/device_id_win.cc
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // but that API is private (http://crbug.com/276485) and other platforms are
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // not available synchronously.
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // As part of improving pref metrics on other platforms we may want to find
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ways to defer preference loading until the device ID can be used.
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  rlz_lib::GetMachineId(&device_id);
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return make_scoped_ptr(new ProfilePrefStoreManager(
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      profile_path,
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GetTrackingConfiguration(),
351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kTrackedPrefsReportingIDsCount,
352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ResourceBundle::GetSharedInstance()
353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          .GetRawDataResource(IDR_PREF_HASH_SEED_BIN)
354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          .as_string(),
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_id,
356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      g_browser_process->local_state()));
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrepareFactory(
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    PrefServiceSyncableFactory* factory,
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy::PolicyService* policy_service,
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ManagedUserSettingsService* managed_user_settings,
363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_refptr<PersistentPrefStore> user_pref_store,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<PrefStore>& extension_prefs,
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool async) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using policy::ConfigurationPolicyPrefStore;
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_managed_prefs(
369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      make_scoped_refptr(new ConfigurationPolicyPrefStore(
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy_service,
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          g_browser_process->browser_policy_connector()->GetHandlerList(),
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy::POLICY_LEVEL_MANDATORY)));
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_recommended_prefs(
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      make_scoped_refptr(new ConfigurationPolicyPrefStore(
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy_service,
376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          g_browser_process->browser_policy_connector()->GetHandlerList(),
377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy::POLICY_LEVEL_RECOMMENDED)));
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // ENABLE_CONFIGURATION_POLICY
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (managed_user_settings) {
382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    factory->set_supervised_user_prefs(
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        make_scoped_refptr(new SupervisedUserPrefStore(managed_user_settings)));
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_async(async);
388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_extension_prefs(extension_prefs);
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_command_line_prefs(
390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      make_scoped_refptr(
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          new CommandLinePrefStore(CommandLine::ForCurrentProcess())));
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_read_error_callback(base::Bind(&HandleReadError));
393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  factory->set_user_prefs(user_pref_store);
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Initialize/update preference hash stores for all profiles but the one whose
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// path matches |ignored_profile_path|.
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UpdateAllPrefHashStoresIfRequired(
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& ignored_profile_path) {
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ProfileInfoCache& profile_info_cache =
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->profile_manager()->GetProfileInfoCache();
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t n_profiles = profile_info_cache.GetNumberOfProfiles();
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < n_profiles; ++i) {
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath profile_path =
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        profile_info_cache.GetPathOfProfileAtIndex(i);
406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (profile_path != ignored_profile_path) {
407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      CreateProfilePrefStoreManager(profile_path)
408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          ->UpdateProfileHashStoreIfRequired(
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              JsonPrefStore::GetTaskRunnerForFile(
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                  profile_path, BrowserThread::GetBlockingPool()));
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome_prefs {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace internals {
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementTrialName[] = "SettingsEnforcement";
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupNoEnforcement[] = "no_enforcement";
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceOnload[] = "enforce_on_load";
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlways[] = "enforce_always";
425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kSettingsEnforcementGroupEnforceAlwaysWithExtensions[] =
426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "enforce_always_with_extensions";
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE[] =
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    "enforce_always_with_extensions_and_dse";
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace internals
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefService> CreateLocalState(
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& pref_filename,
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::SequencedTaskRunner* pref_io_task_runner,
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy::PolicyService* policy_service,
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<PrefRegistry>& pref_registry,
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool async) {
438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PrefServiceSyncableFactory factory;
439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  PrepareFactory(
440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &factory,
441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      policy_service,
442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      NULL,  // managed_user_settings
443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new JsonPrefStore(
444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          pref_filename, pref_io_task_runner, scoped_ptr<PrefFilter>()),
445effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      NULL,  // extension_prefs
446effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      async);
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return factory.Create(pref_registry.get());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefServiceSyncable> CreateProfilePrefs(
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path,
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::SequencedTaskRunner* pref_io_task_runner,
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TrackedPreferenceValidationDelegate* validation_delegate,
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy::PolicyService* policy_service,
45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ManagedUserSettingsService* managed_user_settings,
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<PrefStore>& extension_prefs,
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry,
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool async) {
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs");
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PrefServiceSyncableFactory factory;
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PrepareFactory(
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      &factory,
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      policy_service,
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      managed_user_settings,
465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      scoped_refptr<PersistentPrefStore>(
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          CreateProfilePrefStoreManager(profile_path)->CreateProfilePrefStore(
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              pref_io_task_runner, validation_delegate)),
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extension_prefs,
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      async);
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<PrefServiceSyncable> pref_service =
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      factory.CreateSyncable(pref_registry.get());
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ConfigureDefaultSearchPrefMigrationToDictionaryValue(pref_service.get());
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return pref_service.Pass();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SchedulePrefsFilePathVerification(const base::FilePath& profile_path) {
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only do prefs file verification on Windows.
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int kVerifyPrefsFileDelaySeconds = 60;
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserThread::GetBlockingPool()->PostDelayedTask(
483effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FROM_HERE,
484effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&VerifyPreferencesFile,
485effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 ProfilePrefStoreManager::GetPrefFilePathFromProfilePath(
486effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                     profile_path)),
487effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromSeconds(g_disable_delays_and_domain_check_for_testing
488effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       ? 0
489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       : kVerifyPrefsFileDelaySeconds));
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DisableDelaysAndDomainCheckForTesting() {
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  g_disable_delays_and_domain_check_for_testing = true;
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SchedulePrefHashStoresUpdateCheck(
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& initial_profile_path) {
499effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking) {
500effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ProfilePrefStoreManager::ResetAllPrefHashStores(
50123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        g_browser_process->local_state());
502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
505a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (GetSettingsEnforcementGroup() >= GROUP_ENFORCE_ALWAYS)
506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return;
507a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int kDefaultPrefHashStoresUpdateCheckDelaySeconds = 55;
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserThread::PostDelayedTask(
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserThread::UI,
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FROM_HERE,
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&UpdateAllPrefHashStoresIfRequired,
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   initial_profile_path),
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::TimeDelta::FromSeconds(
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            g_disable_delays_and_domain_check_for_testing ?
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                0 : kDefaultPrefHashStoresUpdateCheckDelaySeconds));
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResetPrefHashStore(const base::FilePath& profile_path) {
520effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CreateProfilePrefStoreManager(profile_path)->ResetPrefHashStore();
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InitializePrefsFromMasterPrefs(
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path,
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue& master_prefs) {
526effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return CreateProfilePrefStoreManager(profile_path)
527effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ->InitializePrefsFromMasterPrefs(master_prefs);
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::Time GetResetTime(Profile* profile) {
531effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return ProfilePrefStoreManager::GetResetTime(profile->GetPrefs());
532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ClearResetTime(Profile* profile) {
535effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ProfilePrefStoreManager::ClearResetTime(profile->GetPrefs());
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ProfilePrefStoreManager::RegisterProfilePrefs(registry);
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RegisterPrefs(PrefRegistrySimple* registry) {
543effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ProfilePrefStoreManager::RegisterPrefs(registry);
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chrome_prefs
547