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