profile_pref_store_manager.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/file_util.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/json/json_file_value_serializer.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h" 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/metrics/histogram.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/json_pref_store.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/persistent_pref_store.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/pref_registry_simple.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/prefs/pref_hash_store_impl.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/prefs/tracked/pref_service_hash_store_contents.h" 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/prefs/tracked/segregated_pref_store.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/chrome_constants.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/pref_names.h" 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/user_prefs/pref_registry_syncable.h" 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace { 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// An adaptor that allows a PrefHashStoreImpl to access a preference store 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// directly as a dictionary. Uses an equivalent layout to 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// PrefStoreHashStoreContents. 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DictionaryHashStoreContents : public HashStoreContents { 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Instantiates a HashStoreContents that is a copy of |to_copy|. The copy is 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // mutable but does not affect the original, nor is it persisted to disk in 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // any other way. 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch explicit DictionaryHashStoreContents(const HashStoreContents& to_copy) 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : hash_store_id_(to_copy.hash_store_id()), 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch super_mac_(to_copy.GetSuperMac()) { 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (to_copy.IsInitialized()) 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dictionary_.reset(to_copy.GetContents()->DeepCopy()); 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int version = 0; 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (to_copy.GetVersion(&version)) 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch version_.reset(new int(version)); 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // HashStoreContents implementation 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual std::string hash_store_id() const OVERRIDE { return hash_store_id_; } 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void Reset() OVERRIDE { 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dictionary_.reset(); 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch super_mac_.clear(); 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch version_.reset(); 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool IsInitialized() const OVERRIDE { 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return dictionary_; 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual const base::DictionaryValue* GetContents() const OVERRIDE{ 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return dictionary_.get(); 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual scoped_ptr<MutableDictionary> GetMutableContents() OVERRIDE { 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return scoped_ptr<MutableDictionary>( 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new SimpleMutableDictionary(this)); 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual std::string GetSuperMac() const OVERRIDE { return super_mac_; } 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetSuperMac(const std::string& super_mac) OVERRIDE { 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch super_mac_ = super_mac; 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool GetVersion(int* version) const OVERRIDE { 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!version_) 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *version = *version_; 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetVersion(int version) OVERRIDE { 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch version_.reset(new int(version)); 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void CommitPendingWrite() OVERRIDE {} 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch class SimpleMutableDictionary 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : public HashStoreContents::MutableDictionary { 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch explicit SimpleMutableDictionary(DictionaryHashStoreContents* outer) 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : outer_(outer) {} 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~SimpleMutableDictionary() {} 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // MutableDictionary implementation 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual base::DictionaryValue* operator->() OVERRIDE { 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!outer_->dictionary_) 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch outer_->dictionary_.reset(new base::DictionaryValue); 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return outer_->dictionary_.get(); 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DictionaryHashStoreContents* outer_; 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(SimpleMutableDictionary); 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string hash_store_id_; 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string super_mac_; 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<int> version_; 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<base::DictionaryValue> dictionary_; 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(DictionaryHashStoreContents); 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// An in-memory PrefStore backed by an immutable DictionaryValue. 113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass DictionaryPrefStore : public PrefStore { 114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch explicit DictionaryPrefStore(const base::DictionaryValue* dictionary) 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : dictionary_(dictionary) {} 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool GetValue(const std::string& key, 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::Value** result) const OVERRIDE { 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::Value* tmp = NULL; 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!dictionary_->Get(key, &tmp)) 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (result) 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *result = tmp; 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~DictionaryPrefStore() {} 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::DictionaryValue* dictionary_; 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(DictionaryPrefStore); 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// TODO(erikwright): Enable this on Chrome OS and Android once MACs are moved 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// out of Local State. This will resolve a race condition on Android and a 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// privacy issue on ChromeOS. http://crbug.com/349158 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst bool ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking = 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_ANDROID) || defined(OS_CHROMEOS) 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch false; 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch true; 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Waits for a PrefStore to be initialized and then initializes the 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// corresponding PrefHashStore. 151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// The observer deletes itself when its work is completed. 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ProfilePrefStoreManager::InitializeHashStoreObserver 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : public PrefStore::Observer { 154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Creates an observer that will initialize |pref_hash_store| with the 156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // contents of |pref_store| when the latter is fully loaded. 157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InitializeHashStoreObserver( 158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::vector<PrefHashFilter::TrackedPreferenceMetadata>& 159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration, 160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t reporting_ids_count, 161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const scoped_refptr<PrefStore>& pref_store, 162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<PrefHashStoreImpl> pref_hash_store_impl) 163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : tracking_configuration_(tracking_configuration), 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch reporting_ids_count_(reporting_ids_count), 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_store_(pref_store), 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_hash_store_impl_(pref_hash_store_impl.Pass()) {} 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~InitializeHashStoreObserver(); 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // PrefStore::Observer implementation. 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void OnPrefValueChanged(const std::string& key) OVERRIDE; 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void OnInitializationCompleted(bool succeeded) OVERRIDE; 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::vector<PrefHashFilter::TrackedPreferenceMetadata> 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration_; 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const size_t reporting_ids_count_; 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<PrefStore> pref_store_; 179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<PrefHashStoreImpl> pref_hash_store_impl_; 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(InitializeHashStoreObserver); 182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 184effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochProfilePrefStoreManager::InitializeHashStoreObserver:: 185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ~InitializeHashStoreObserver() {} 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::InitializeHashStoreObserver::OnPrefValueChanged( 188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& key) {} 189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid 191effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochProfilePrefStoreManager::InitializeHashStoreObserver::OnInitializationCompleted( 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool succeeded) { 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // If we successfully loaded the preferences _and_ the PrefHashStoreImpl 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // hasn't been initialized by someone else in the meantime, initialize it now. 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const PrefHashStoreImpl::StoreVersion pre_update_version = 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_hash_store_impl_->GetCurrentVersion(); 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (succeeded && pre_update_version < PrefHashStoreImpl::VERSION_LATEST) { 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashFilter(pref_hash_store_impl_.PassAs<PrefHashStore>(), 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration_, 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch reporting_ids_count_).Initialize(*pref_store_); 201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_ENUMERATION( 202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "Settings.TrackedPreferencesAlternateStoreVersionUpdatedFrom", 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pre_update_version, 204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashStoreImpl::VERSION_LATEST + 1); 205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_store_->RemoveObserver(this); 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch delete this; 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 210effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochProfilePrefStoreManager::ProfilePrefStoreManager( 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& profile_path, 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::vector<PrefHashFilter::TrackedPreferenceMetadata>& 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration, 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t reporting_ids_count, 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& seed, 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& device_id, 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefService* local_state) 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : profile_path_(profile_path), 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration_(tracking_configuration), 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch reporting_ids_count_(reporting_ids_count), 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch seed_(seed), 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device_id_(device_id), 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch local_state_(local_state) {} 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 225effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochProfilePrefStoreManager::~ProfilePrefStoreManager() {} 226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::RegisterPrefs(PrefRegistrySimple* registry) { 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefServiceHashStoreContents::RegisterPrefs(registry); 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::RegisterProfilePrefs( 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch user_prefs::PrefRegistrySyncable* registry) { 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashFilter::RegisterProfilePrefs(registry); 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::FilePath ProfilePrefStoreManager::GetPrefFilePathFromProfilePath( 240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& profile_path) { 241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return profile_path.Append(chrome::kPreferencesFilename); 242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::ResetAllPrefHashStores(PrefService* local_state) { 246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefServiceHashStoreContents::ResetAllPrefHashStores(local_state); 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::Time ProfilePrefStoreManager::GetResetTime(PrefService* pref_service) { 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // It's a bit of a coincidence that this (and ClearResetTime) work(s). The 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // PrefHashFilter attached to the protected pref store will store the reset 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // time directly in the protected pref store without going through the 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // SegregatedPrefStore. 255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // PrefHashFilter::GetResetTime will read the value through the pref service, 257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // and thus through the SegregatedPrefStore. Even though it's not listed as 258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // "protected" it will be read from the protected store prefentially to the 259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // (NULL) value in the unprotected pref store. 260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return PrefHashFilter::GetResetTime(pref_service); 261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static 264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::ClearResetTime(PrefService* pref_service) { 265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // PrefHashFilter::ClearResetTime will clear the value through the pref 266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // service, and thus through the SegregatedPrefStore. Since it's not listed as 267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // "protected" it will be migrated from the protected store to the unprotected 268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // pref store before being deleted from the latter. 269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashFilter::ClearResetTime(pref_service); 270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::ResetPrefHashStore() { 273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (kPlatformSupportsPreferenceTracking) 274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetPrefHashStoreImpl()->Reset(); 275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 277effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPersistentPrefStore* ProfilePrefStoreManager::CreateProfilePrefStore( 278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) { 279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<PrefFilter> pref_filter; 280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!kPlatformSupportsPreferenceTracking) { 281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return new JsonPrefStore(GetPrefFilePathFromProfilePath(profile_path_), 282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch io_task_runner, 283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<PrefFilter>()); 284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<PrefHashFilter::TrackedPreferenceMetadata> 287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_configuration; 288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<PrefHashFilter::TrackedPreferenceMetadata> 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_configuration; 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::set<std::string> protected_pref_names; 291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (std::vector<PrefHashFilter::TrackedPreferenceMetadata>::const_iterator 292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it = tracking_configuration_.begin(); 293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it != tracking_configuration_.end(); 294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++it) { 295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (it->enforcement_level > PrefHashFilter::NO_ENFORCEMENT) { 296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_configuration.push_back(*it); 297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_pref_names.insert(it->name); 298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_configuration.push_back(*it); 300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<PrefFilter> unprotected_pref_hash_filter( 304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new PrefHashFilter(GetPrefHashStoreImpl().PassAs<PrefHashStore>(), 305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_configuration, 306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reporting_ids_count_)); 307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<PrefFilter> protected_pref_hash_filter( 308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new PrefHashFilter(GetPrefHashStoreImpl().PassAs<PrefHashStore>(), 309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_configuration, 310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reporting_ids_count_)); 311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<PersistentPrefStore> unprotected_pref_store( 313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new JsonPrefStore(GetPrefFilePathFromProfilePath(profile_path_), 314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch io_task_runner, 315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_pref_hash_filter.Pass())); 316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<PersistentPrefStore> protected_pref_store(new JsonPrefStore( 317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_path_.Append(chrome::kProtectedPreferencesFilename), 318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch io_task_runner, 319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_pref_hash_filter.Pass())); 320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The on_initialized callback is used to migrate newly protected values from 322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // the main Preferences store to the Protected Preferences store. It is also 323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // responsible for the initial migration to a two-store model. 324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return new SegregatedPrefStore( 325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_pref_store, 326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_pref_store, 327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_pref_names, 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&PrefHashFilter::MigrateValues, 329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Owned(new PrefHashFilter( 330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CopyPrefHashStore(), 331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_configuration, 332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reporting_ids_count_)), 333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unprotected_pref_store, 334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected_pref_store)); 335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ProfilePrefStoreManager::UpdateProfileHashStoreIfRequired( 338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) { 339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!kPlatformSupportsPreferenceTracking) 340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<PrefHashStoreImpl> pref_hash_store_impl(GetPrefHashStoreImpl()); 342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const PrefHashStoreImpl::StoreVersion current_version = 343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_hash_store_impl->GetCurrentVersion(); 344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferencesAlternateStoreVersion", 345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch current_version, 346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashStoreImpl::VERSION_LATEST + 1); 347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Update the pref hash store if it's not at the latest version. 349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (current_version != PrefHashStoreImpl::VERSION_LATEST) { 350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<JsonPrefStore> pref_store = 351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new JsonPrefStore(GetPrefFilePathFromProfilePath(profile_path_), 352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch io_task_runner, 353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<PrefFilter>()); 354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_store->AddObserver( 355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new InitializeHashStoreObserver(tracking_configuration_, 356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch reporting_ids_count_, 357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_store, 358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_hash_store_impl.Pass())); 359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref_store->ReadPrefsAsync(NULL); 360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool ProfilePrefStoreManager::InitializePrefsFromMasterPrefs( 364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::DictionaryValue& master_prefs) { 365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Create the profile directory if it doesn't exist yet (very possible on 366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // first run). 367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!base::CreateDirectory(profile_path_)) 368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This will write out to a single combined file which will be immediately 371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // migrated to two files on load. 372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JSONFileValueSerializer serializer( 373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetPrefFilePathFromProfilePath(profile_path_)); 374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Call Serialize (which does IO) on the main thread, which would _normally_ 376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // be verboten. In this case however, we require this IO to synchronously 377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // complete before Chrome can start (as master preferences seed the Local 378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // State and Preferences files). This won't trip ThreadIORestrictions as they 379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // won't have kicked in yet on the main thread. 380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool success = serializer.Serialize(master_prefs); 381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (success && kPlatformSupportsPreferenceTracking) { 383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<const PrefStore> pref_store( 384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new DictionaryPrefStore(&master_prefs)); 385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrefHashFilter(GetPrefHashStoreImpl().PassAs<PrefHashStore>(), 386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch tracking_configuration_, 387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch reporting_ids_count_).Initialize(*pref_store); 388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.InitializedFromMasterPrefs", success); 391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return success; 392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPersistentPrefStore* 395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochProfilePrefStoreManager::CreateDeprecatedCombinedProfilePrefStore( 396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) { 397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<PrefFilter> pref_filter; 398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (kPlatformSupportsPreferenceTracking) { 399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pref_filter.reset( 400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new PrefHashFilter(GetPrefHashStoreImpl().PassAs<PrefHashStore>(), 401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch tracking_configuration_, 402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reporting_ids_count_)); 403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return new JsonPrefStore(GetPrefFilePathFromProfilePath(profile_path_), 405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch io_task_runner, 406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pref_filter.Pass()); 407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_ptr<PrefHashStoreImpl> ProfilePrefStoreManager::GetPrefHashStoreImpl() { 410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(kPlatformSupportsPreferenceTracking); 411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return make_scoped_ptr(new PrefHashStoreImpl( 413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch seed_, 414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch device_id_, 415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<HashStoreContents>(new PrefServiceHashStoreContents( 416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_path_.AsUTF8Unsafe(), local_state_)))); 417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochscoped_ptr<PrefHashStore> ProfilePrefStoreManager::CopyPrefHashStore() { 420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(kPlatformSupportsPreferenceTracking); 421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PrefServiceHashStoreContents real_contents(profile_path_.AsUTF8Unsafe(), 423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch local_state_); 424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return scoped_ptr<PrefHashStore>(new PrefHashStoreImpl( 425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch seed_, 426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch device_id_, 427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<HashStoreContents>( 428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new DictionaryHashStoreContents(real_contents)))); 429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 430