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