1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/prefs/profile_pref_store_manager.h" 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/callback.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/json/json_file_value_serializer.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/metrics/histogram.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/json_pref_store.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/persistent_pref_store.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/pref_registry_simple.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/prefs/pref_hash_store_impl.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/prefs/tracked/pref_service_hash_store_contents.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/prefs/tracked/segregated_pref_store.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/prefs/tracked/tracked_preferences_migration.h" 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/chrome_constants.h" 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/pref_names.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// TODO(erikwright): Enable this on Chrome OS and Android once MACs are moved 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// out of Local State. This will resolve a race condition on Android and a 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// privacy issue on ChromeOS. http://crbug.com/349158 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst bool ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking = 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_ANDROID) || defined(OS_CHROMEOS) 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch false; 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#else 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch true; 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 34effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochProfilePrefStoreManager::ProfilePrefStoreManager( 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& profile_path, 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::vector<PrefHashFilter::TrackedPreferenceMetadata>& 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration, 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t reporting_ids_count, 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& seed, 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& device_id, 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefService* local_state) 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : profile_path_(profile_path), 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration_(tracking_configuration), 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch reporting_ids_count_(reporting_ids_count), 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch seed_(seed), 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device_id_(device_id), 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch local_state_(local_state) {} 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 49effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochProfilePrefStoreManager::~ProfilePrefStoreManager() {} 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::RegisterPrefs(PrefRegistrySimple* registry) { 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefServiceHashStoreContents::RegisterPrefs(registry); 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::RegisterProfilePrefs( 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch user_prefs::PrefRegistrySyncable* registry) { 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashFilter::RegisterProfilePrefs(registry); 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::FilePath ProfilePrefStoreManager::GetPrefFilePathFromProfilePath( 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& profile_path) { 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return profile_path.Append(chrome::kPreferencesFilename); 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::ResetAllPrefHashStores(PrefService* local_state) { 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefServiceHashStoreContents::ResetAllPrefHashStores(local_state); 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::Time ProfilePrefStoreManager::GetResetTime(PrefService* pref_service) { 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return PrefHashFilter::GetResetTime(pref_service); 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::ClearResetTime(PrefService* pref_service) { 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashFilter::ClearResetTime(pref_service); 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 83effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPersistentPrefStore* ProfilePrefStoreManager::CreateProfilePrefStore( 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& on_reset_on_load, 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TrackedPreferenceValidationDelegate* validation_delegate) { 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<PrefFilter> pref_filter; 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!kPlatformSupportsPreferenceTracking) { 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return new JsonPrefStore(GetPrefFilePathFromProfilePath(profile_path_), 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_task_runner.get(), 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<PrefFilter>()); 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<PrefHashFilter::TrackedPreferenceMetadata> 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_configuration; 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<PrefHashFilter::TrackedPreferenceMetadata> 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_configuration; 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::set<std::string> protected_pref_names; 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::set<std::string> unprotected_pref_names; 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (std::vector<PrefHashFilter::TrackedPreferenceMetadata>::const_iterator 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it = tracking_configuration_.begin(); 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it != tracking_configuration_.end(); 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++it) { 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (it->enforcement_level > PrefHashFilter::NO_ENFORCEMENT) { 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_configuration.push_back(*it); 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_pref_names.insert(it->name); 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_configuration.push_back(*it); 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unprotected_pref_names.insert(it->name); 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<PrefHashFilter> unprotected_pref_hash_filter( 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new PrefHashFilter(GetPrefHashStore(false), 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_configuration, 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Closure(), 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) validation_delegate, 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reporting_ids_count_, 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<PrefHashFilter> protected_pref_hash_filter( 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new PrefHashFilter(GetPrefHashStore(true), 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_configuration, 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) on_reset_on_load, 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) validation_delegate, 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reporting_ids_count_, 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) true)); 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter* raw_unprotected_pref_hash_filter = 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unprotected_pref_hash_filter.get(); 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrefHashFilter* raw_protected_pref_hash_filter = 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected_pref_hash_filter.get(); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<JsonPrefStore> unprotected_pref_store( 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new JsonPrefStore(GetPrefFilePathFromProfilePath(profile_path_), 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_task_runner.get(), 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unprotected_pref_hash_filter.PassAs<PrefFilter>())); 1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // TODO(gab): Remove kDeprecatedProtectedPreferencesFilename as an alternate 1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // file in M40+. 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<JsonPrefStore> protected_pref_store(new JsonPrefStore( 1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_path_.Append(chrome::kSecurePreferencesFilename), 1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile_path_.Append(chrome::kProtectedPreferencesFilenameDeprecated), 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_task_runner.get(), 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected_pref_hash_filter.PassAs<PrefFilter>())); 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetupTrackedPreferencesMigration( 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unprotected_pref_names, 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_pref_names, 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&JsonPrefStore::RemoveValueSilently, 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unprotected_pref_store->AsWeakPtr()), 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&JsonPrefStore::RemoveValueSilently, 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected_pref_store->AsWeakPtr()), 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&JsonPrefStore::RegisterOnNextSuccessfulWriteCallback, 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unprotected_pref_store->AsWeakPtr()), 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&JsonPrefStore::RegisterOnNextSuccessfulWriteCallback, 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected_pref_store->AsWeakPtr()), 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetPrefHashStore(false), 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetPrefHashStore(true), 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<HashStoreContents>(new PrefServiceHashStoreContents( 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile_path_.AsUTF8Unsafe(), local_state_)), 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) raw_unprotected_pref_hash_filter, 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) raw_protected_pref_hash_filter); 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return new SegregatedPrefStore(unprotected_pref_store, protected_pref_store, 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected_pref_names); 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool ProfilePrefStoreManager::InitializePrefsFromMasterPrefs( 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::DictionaryValue& master_prefs) { 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Create the profile directory if it doesn't exist yet (very possible on 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // first run). 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!base::CreateDirectory(profile_path_)) 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::DictionaryValue* to_serialize = &master_prefs; 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<base::DictionaryValue> copy; 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (kPlatformSupportsPreferenceTracking) { 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) copy.reset(master_prefs.DeepCopy()); 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) to_serialize = copy.get(); 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrefHashFilter(GetPrefHashStore(false), 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) tracking_configuration_, 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Closure(), 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL, 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reporting_ids_count_, 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false).Initialize(copy.get()); 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This will write out to a single combined file which will be immediately 189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // migrated to two files on load. 190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JSONFileValueSerializer serializer( 191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetPrefFilePathFromProfilePath(profile_path_)); 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Call Serialize (which does IO) on the main thread, which would _normally_ 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // be verboten. In this case however, we require this IO to synchronously 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // complete before Chrome can start (as master preferences seed the Local 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // State and Preferences files). This won't trip ThreadIORestrictions as they 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // won't have kicked in yet on the main thread. 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool success = serializer.Serialize(*to_serialize); 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.InitializedFromMasterPrefs", success); 201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return success; 202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPersistentPrefStore* 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochProfilePrefStoreManager::CreateDeprecatedCombinedProfilePrefStore( 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) { 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<PrefFilter> pref_filter; 208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (kPlatformSupportsPreferenceTracking) { 209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<PrefHashStoreImpl> pref_hash_store_impl( 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new PrefHashStoreImpl(seed_, device_id_, true)); 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pref_hash_store_impl->set_legacy_hash_store_contents( 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<HashStoreContents>(new PrefServiceHashStoreContents( 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile_path_.AsUTF8Unsafe(), local_state_))); 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pref_filter.reset( 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new PrefHashFilter(pref_hash_store_impl.PassAs<PrefHashStore>(), 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch tracking_configuration_, 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Closure(), 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reporting_ids_count_, 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return new JsonPrefStore(GetPrefFilePathFromProfilePath(profile_path_), 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_task_runner.get(), 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pref_filter.Pass()); 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_ptr<PrefHashStore> ProfilePrefStoreManager::GetPrefHashStore( 228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool use_super_mac) { 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(kPlatformSupportsPreferenceTracking); 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return scoped_ptr<PrefHashStore>(new PrefHashStoreImpl( 232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch seed_, 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device_id_, 234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) use_super_mac)); 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 236