chrome_pref_service_factory.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/compiler_specific.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/debug/trace_event.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/json/json_file_value_serializer.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/field_trial.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/default_pref_store.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/json_pref_store.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_filter.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_notifier_impl.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_store.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_value_store.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/time.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.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"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prefs/pref_hash_store.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prefs/pref_hash_store_impl.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_model_associator.h"
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h"
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable_factory.h"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/file_path_verifier_win.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.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"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/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)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/managed_mode/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)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The delay in seconds before actual work kicks in after calling
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// SchedulePrefHashStoresUpdateCheck can be set to 0 for tests.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int g_pref_hash_store_update_check_delay_seconds = 55;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These preferences must be kept in sync with the TrackedPreference enum in
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tools/metrics/histograms/histograms.xml. To add a new preference, append it
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to the array and add a corresponding value to the histogram enum. Each
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracked preference must be given a unique reporting ID.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const PrefHashFilter::TrackedPreferenceMetadata kTrackedPrefs[] = {
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0, prefs::kShowHomeButton,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    1, prefs::kHomePageIsNewTabPage,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    2, prefs::kHomePage,
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    3, prefs::kRestoreOnStartup,
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    4, prefs::kURLsToRestoreOnStartup,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    5, extensions::pref_names::kExtensions,
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::NO_ENFORCEMENT,
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_SPLIT
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    6, prefs::kGoogleServicesLastUsername,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    7, prefs::kSearchProviderOverrides,
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    8, prefs::kDefaultSearchProviderSearchURL,
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    9, prefs::kDefaultSearchProviderKeyword,
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    10, prefs::kDefaultSearchProviderName,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    11, prefs::kPinnedTabs,
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    12, extensions::pref_names::kKnownDisabled,
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::NO_ENFORCEMENT,
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    13, prefs::kProfileResetPromptMemento,
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::ENFORCE_ON_LOAD,
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefHashFilter::TRACKING_STRATEGY_ATOMIC
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The count of tracked preferences IDs across all platforms.
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const size_t kTrackedPrefsReportingIDsCount = 14;
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)COMPILE_ASSERT(kTrackedPrefsReportingIDsCount >= arraysize(kTrackedPrefs),
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               need_to_increment_ids_count);
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum SettingsEnforcementGroup {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GROUP_NO_ENFORCEMENT,
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only enforce settings on profile loads; still allow seeding of unloaded
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // profiles.
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GROUP_ENFORCE_ON_LOAD,
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GROUP_ENFORCE_ALWAYS
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SettingsEnforcementGroup GetSettingsEnforcementGroup() {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# if defined(OS_WIN)
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool first_call = true;
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const bool is_enrolled_to_domain = base::win::IsEnrolledToDomain();
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (first_call) {
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UMA_HISTOGRAM_BOOLEAN("Settings.TrackedPreferencesNoEnforcementOnDomain",
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          is_enrolled_to_domain);
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    first_call = false;
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (is_enrolled_to_domain)
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return GROUP_NO_ENFORCEMENT;
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct {
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const char* group_name;
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SettingsEnforcementGroup group;
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } static const kEnforcementLevelMap[] = {
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { chrome_prefs::internals::kSettingsEnforcementGroupNoEnforcement,
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GROUP_NO_ENFORCEMENT },
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { chrome_prefs::internals::kSettingsEnforcementGroupEnforceOnload,
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GROUP_ENFORCE_ON_LOAD },
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { chrome_prefs::internals::kSettingsEnforcementGroupEnforceAlways,
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GROUP_ENFORCE_ALWAYS },
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FieldTrial* trial =
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FieldTrialList::Find(
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          chrome_prefs::internals::kSettingsEnforcementTrialName);
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (trial) {
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& group_name = trial->group_name();
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // ARRAYSIZE_UNSAFE must be used since the array is declared locally; it is
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // only unsafe because it could not trigger a compile error on some
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // non-array pointer types; this is fine since kEnforcementLevelMap is
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // clearly an array.
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kEnforcementLevelMap); ++i) {
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (kEnforcementLevelMap[i].group_name == group_name)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return kEnforcementLevelMap[i].group;
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Default to GROUP_ENFORCE_ALWAYS in the absence of a valid value for the
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SettingsEnforcement field trial.
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(gab): Switch other platforms over to this mode.
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GROUP_ENFORCE_ALWAYS;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GROUP_NO_ENFORCEMENT;
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shows notifications which correspond to PersistentPrefStore's reading errors.
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HandleReadError(PersistentPrefStore::PrefReadError error) {
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Sample the histogram also for the successful case in order to get a
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // baseline on the success rate in addition to the error distribution.
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error,
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM);
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) {
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_CHROMEOS)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // an example problem that this can cause.
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Do some diagnosis and try to avoid losing data.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int message_id = 0;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE) {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      message_id = IDS_PREFERENCES_CORRUPT_ERROR;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      message_id = IDS_PREFERENCES_UNREADABLE_ERROR;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (message_id) {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Bind(&ShowProfileErrorDialog,
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         PROFILE_ERROR_PREFERENCES,
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         message_id));
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // On ChromeOS error screen with message about broken local state
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // will be displayed.
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath GetPrefFilePathFromProfilePath(
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path) {
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return profile_path.Append(chrome::kPreferencesFilename);
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns the PrefHashStoreImpl for the profile at |profile_path|; may be NULL
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// on some platforms.
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<PrefHashStoreImpl> GetPrefHashStoreImpl(
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path) {
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(erikwright): Enable this on Android when race condition is sorted out.
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<PrefHashStoreImpl>();
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string seed = ResourceBundle::GetSharedInstance().GetRawDataResource(
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IDR_PREF_HASH_SEED_BIN).as_string();
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string device_id;
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) && defined(ENABLE_RLZ)
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This is used by
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // chrome/browser/extensions/api/music_manager_private/device_id_win.cc
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // but that API is private (http://crbug.com/276485) and other platforms are
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // not available synchronously.
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // As part of improving pref metrics on other platforms we may want to find
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ways to defer preference loading until the device ID can be used.
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  rlz_lib::GetMachineId(&device_id);
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return make_scoped_ptr(new PrefHashStoreImpl(
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile_path.AsUTF8Unsafe(),
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      seed,
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_id,
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->local_state()));
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void HandleResetEvent() {
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_browser_process->local_state()->SetInt64(
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs::kProfilePreferenceResetTime,
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Time::Now().ToInternalValue());
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<PrefHashFilter> CreatePrefHashFilter(
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<PrefHashStore> pref_hash_store) {
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const PrefHashFilter::EnforcementLevel enforcement_level =
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetSettingsEnforcementGroup() == GROUP_NO_ENFORCEMENT ?
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          PrefHashFilter::NO_ENFORCEMENT : PrefHashFilter::ENFORCE_ON_LOAD;
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return make_scoped_ptr(new PrefHashFilter(pref_hash_store.Pass(),
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            kTrackedPrefs,
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            arraysize(kTrackedPrefs),
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            kTrackedPrefsReportingIDsCount,
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            enforcement_level,
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            base::Bind(&HandleResetEvent)));
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrepareBuilder(
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    PrefServiceSyncableFactory* factory,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& pref_filename,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::SequencedTaskRunner* pref_io_task_runner,
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy::PolicyService* policy_service,
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ManagedUserSettingsService* managed_user_settings,
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<PrefHashStore> pref_hash_store,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<PrefStore>& extension_prefs,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool async) {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using policy::ConfigurationPolicyPrefStore;
314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_managed_prefs(
315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      make_scoped_refptr(new ConfigurationPolicyPrefStore(
316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy_service,
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          g_browser_process->browser_policy_connector()->GetHandlerList(),
318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy::POLICY_LEVEL_MANDATORY)));
319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_recommended_prefs(
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      make_scoped_refptr(new ConfigurationPolicyPrefStore(
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy_service,
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          g_browser_process->browser_policy_connector()->GetHandlerList(),
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          policy::POLICY_LEVEL_RECOMMENDED)));
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // ENABLE_CONFIGURATION_POLICY
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (managed_user_settings) {
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    factory->set_supervised_user_prefs(
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        make_scoped_refptr(new SupervisedUserPrefStore(managed_user_settings)));
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_async(async);
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_extension_prefs(extension_prefs);
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_command_line_prefs(
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      make_scoped_refptr(
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          new CommandLinePrefStore(CommandLine::ForCurrentProcess())));
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_read_error_callback(base::Bind(&HandleReadError));
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<PrefFilter> pref_filter;
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (pref_hash_store)
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_filter = CreatePrefHashFilter(pref_hash_store.Pass());
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory->set_user_prefs(
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new JsonPrefStore(
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          pref_filename,
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          pref_io_task_runner,
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          pref_filter.Pass()));
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// An in-memory PrefStore backed by an immutable DictionaryValue.
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DictionaryPrefStore : public PrefStore {
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit DictionaryPrefStore(const base::DictionaryValue* dictionary)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : dictionary_(dictionary) {}
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool GetValue(const std::string& key,
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        const base::Value** result) const OVERRIDE {
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value* tmp = NULL;
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!dictionary_->Get(key, &tmp))
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (result)
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *result = tmp;
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~DictionaryPrefStore() {}
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::DictionaryValue* dictionary_;
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DictionaryPrefStore);
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Waits for a PrefStore to be initialized and then initializes the
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// corresponding PrefHashStore.
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The observer deletes itself when its work is completed.
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class InitializeHashStoreObserver : public PrefStore::Observer {
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Creates an observer that will initialize |pref_hash_store| with the
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // contents of |pref_store| when the latter is fully loaded.
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeHashStoreObserver(
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<PrefStore>& pref_store,
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<PrefHashStoreImpl> pref_hash_store_impl)
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : pref_store_(pref_store),
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pref_hash_store_impl_(pref_hash_store_impl.Pass()) {}
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~InitializeHashStoreObserver();
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // PrefStore::Observer implementation.
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnPrefValueChanged(const std::string& key) OVERRIDE;
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnInitializationCompleted(bool succeeded) OVERRIDE;
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<PrefStore> pref_store_;
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<PrefHashStoreImpl> pref_hash_store_impl_;
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InitializeHashStoreObserver);
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InitializeHashStoreObserver::~InitializeHashStoreObserver() {}
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InitializeHashStoreObserver::OnPrefValueChanged(const std::string& key) {}
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InitializeHashStoreObserver::OnInitializationCompleted(bool succeeded) {
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If we successfully loaded the preferences _and_ the PrefHashStoreImpl
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // hasn't been initialized by someone else in the meantime, initialize it now.
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const PrefHashStoreImpl::StoreVersion pre_update_version =
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_hash_store_impl_->GetCurrentVersion();
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (succeeded && pre_update_version < PrefHashStoreImpl::VERSION_LATEST) {
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CreatePrefHashFilter(pref_hash_store_impl_.PassAs<PrefHashStore>())->
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Initialize(*pref_store_);
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION(
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "Settings.TrackedPreferencesAlternateStoreVersionUpdatedFrom",
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pre_update_version,
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        PrefHashStoreImpl::VERSION_LATEST + 1);
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_store_->RemoveObserver(this);
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete this;
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Initializes/updates the PrefHashStore for the profile preferences file under
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |profile_path| without actually loading that profile. Also reports the
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// version of that PrefHashStore via UMA, whether it proceeds with initializing
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// it or not.
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UpdatePrefHashStoreIfRequired(
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path) {
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<PrefHashStoreImpl> pref_hash_store_impl(
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetPrefHashStoreImpl(profile_path));
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const PrefHashStoreImpl::StoreVersion current_version =
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_hash_store_impl->GetCurrentVersion();
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferencesAlternateStoreVersion",
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            current_version,
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            PrefHashStoreImpl::VERSION_LATEST + 1);
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Update the pref hash store if it's not at the latest version and the
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SettingsEnforcement group allows seeding of unloaded profiles.
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (current_version != PrefHashStoreImpl::VERSION_LATEST &&
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetSettingsEnforcementGroup() < GROUP_ENFORCE_ALWAYS) {
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath pref_file(
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetPrefFilePathFromProfilePath(profile_path));
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<JsonPrefStore> pref_store(
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new JsonPrefStore(pref_file,
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          JsonPrefStore::GetTaskRunnerForFile(
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              pref_file, BrowserThread::GetBlockingPool()),
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          scoped_ptr<PrefFilter>()));
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_store->AddObserver(
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new InitializeHashStoreObserver(pref_store,
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        pref_hash_store_impl.Pass()));
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pref_store->ReadPrefsAsync(NULL);
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Initialize/update preference hash stores for all profiles but the one whose
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// path matches |ignored_profile_path|.
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UpdateAllPrefHashStoresIfRequired(
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& ignored_profile_path) {
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ProfileInfoCache& profile_info_cache =
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->profile_manager()->GetProfileInfoCache();
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t n_profiles = profile_info_cache.GetNumberOfProfiles();
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < n_profiles; ++i) {
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath profile_path =
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        profile_info_cache.GetPathOfProfileAtIndex(i);
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (profile_path != ignored_profile_path)
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      UpdatePrefHashStoreIfRequired(profile_path);
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome_prefs {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace internals {
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementTrialName[] = "SettingsEnforcement";
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupNoEnforcement[] = "no_enforcement";
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceOnload[] = "enforce_on_load";
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSettingsEnforcementGroupEnforceAlways[] = "enforce_always";
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace internals
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefService> CreateLocalState(
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& pref_filename,
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::SequencedTaskRunner* pref_io_task_runner,
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy::PolicyService* policy_service,
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<PrefRegistry>& pref_registry,
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool async) {
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PrefServiceSyncableFactory factory;
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PrepareBuilder(&factory,
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 pref_filename,
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 pref_io_task_runner,
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 policy_service,
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 NULL,
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 scoped_ptr<PrefHashStore>(),
49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 NULL,
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 async);
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return factory.Create(pref_registry.get());
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<PrefServiceSyncable> CreateProfilePrefs(
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path,
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::SequencedTaskRunner* pref_io_task_runner,
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy::PolicyService* policy_service,
50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ManagedUserSettingsService* managed_user_settings,
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<PrefStore>& extension_prefs,
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry,
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool async) {
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs");
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PrefServiceSyncableFactory factory;
510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PrepareBuilder(&factory,
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 GetPrefFilePathFromProfilePath(profile_path),
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 pref_io_task_runner,
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 policy_service,
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 managed_user_settings,
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 GetPrefHashStoreImpl(profile_path).PassAs<PrefHashStore>(),
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 extension_prefs,
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 async);
518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return factory.CreateSyncable(pref_registry.get());
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SchedulePrefsFilePathVerification(const base::FilePath& profile_path) {
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only do prefs file verification on Windows.
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int kVerifyPrefsFileDelaySeconds = 60;
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserThread::GetBlockingPool()->PostDelayedTask(
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FROM_HERE,
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&VerifyPreferencesFile,
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   GetPrefFilePathFromProfilePath(profile_path)),
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::TimeDelta::FromSeconds(kVerifyPrefsFileDelaySeconds));
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EnableZeroDelayPrefHashStoreUpdateForTesting() {
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_pref_hash_store_update_check_delay_seconds = 0;
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SchedulePrefHashStoresUpdateCheck(
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& initial_profile_path) {
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserThread::PostDelayedTask(
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserThread::UI,
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FROM_HERE,
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&UpdateAllPrefHashStoresIfRequired,
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   initial_profile_path),
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::TimeDelta::FromSeconds(
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            g_pref_hash_store_update_check_delay_seconds));
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResetPrefHashStore(const base::FilePath& profile_path) {
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetPrefHashStoreImpl(profile_path)->Reset();
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InitializePrefsFromMasterPrefs(
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_path,
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue& master_prefs) {
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create the profile directory if it doesn't exist yet (very possible on
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // first run).
5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!base::CreateDirectory(profile_path))
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JSONFileValueSerializer serializer(
5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetPrefFilePathFromProfilePath(profile_path));
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Call Serialize (which does IO) on the main thread, which would _normally_
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // be verboten. In this case however, we require this IO to synchronously
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // complete before Chrome can start (as master preferences seed the Local
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // State and Preferences files). This won't trip ThreadIORestrictions as they
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // won't have kicked in yet on the main thread.
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool success = serializer.Serialize(master_prefs);
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (success) {
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<const PrefStore> pref_store(
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new DictionaryPrefStore(&master_prefs));
5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CreatePrefHashFilter(
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetPrefHashStoreImpl(profile_path).PassAs<PrefHashStore>())->
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            Initialize(*pref_store);
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UMA_HISTOGRAM_BOOLEAN("Settings.InitializedFromMasterPrefs", success);
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return success;
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RegisterPrefs(PrefRegistrySimple* registry) {
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry->RegisterInt64Pref(prefs::kProfilePreferenceResetTime, 0L);
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrefHashStoreImpl::RegisterPrefs(registry);
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chrome_prefs
588