pref_service_hash_store_contents.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// Copyright 2014 The Chromium Authors. All rights reserved.
2d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// Use of this source code is governed by a BSD-style license that can be
3d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// found in the LICENSE file.
4d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
5d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang#include "chrome/browser/prefs/tracked/pref_service_hash_store_contents.h"
6d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
7d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang#include "base/prefs/pref_registry_simple.h"
8d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang#include "base/prefs/pref_service.h"
9d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang#include "base/prefs/scoped_user_pref_update.h"
10d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang#include "base/values.h"
11d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
12d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangnamespace {
13d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
14d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// Implements get-or-create of a dictionary value and holds a
15d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// DictionaryPrefUpdate.
16d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangclass PrefServiceMutableDictionary
17d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    : public HashStoreContents::MutableDictionary {
18d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang public:
19d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  // Creates an instance that provides mutable access to a dictionary value
20d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  // named |key| that is a child of |kProfilePreferenceHashes| in
215510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  // |prefs|.
22d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  PrefServiceMutableDictionary(const std::string& key,
23d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang                               PrefService* pref_service);
24d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
25d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  // HashStoreContents::MutableDictionary implementation
26d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  virtual base::DictionaryValue* operator->() OVERRIDE;
27d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
28d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang private:
29d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  const std::string key_;
30d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  DictionaryPrefUpdate update_;
31d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang};
32d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
33d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid FangPrefServiceMutableDictionary::PrefServiceMutableDictionary(
34d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    const std::string& key,
35d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    PrefService* pref_service)
36d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    : key_(key),
37d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang      update_(pref_service,
38d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang              PrefServiceHashStoreContents::kProfilePreferenceHashes) {
39d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  DCHECK(!key_.empty());
40d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
41d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
42d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangbase::DictionaryValue* PrefServiceMutableDictionary::operator->() {
43d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  base::DictionaryValue* dictionary = NULL;
44d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  if (!update_->GetDictionaryWithoutPathExpansion(key_, &dictionary)) {
45d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    dictionary = new base::DictionaryValue;
46d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    update_->SetWithoutPathExpansion(key_, dictionary);
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
48d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  return dictionary;
49d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
50d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
51d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}  // namespace
52d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
53d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// static
54d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangconst char PrefServiceHashStoreContents::kProfilePreferenceHashes[] =
55d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    "profile.preference_hashes";
56d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
57d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// static
58d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangconst char PrefServiceHashStoreContents::kHashOfHashesDict[] = "hash_of_hashes";
59d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
60d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// static
61d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangconst char PrefServiceHashStoreContents::kStoreVersionsDict[] =
62d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    "store_versions";
63d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
64d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid FangPrefServiceHashStoreContents::PrefServiceHashStoreContents(
65d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    const std::string& hash_store_id,
66d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    PrefService* pref_service)
67d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    : hash_store_id_(hash_store_id), pref_service_(pref_service) {
68d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  // TODO(erikwright): Remove in M40+.
69d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  DictionaryPrefUpdate update(pref_service_, kProfilePreferenceHashes);
70d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  update->RemovePath(kStoreVersionsDict, NULL);
71d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
72d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
73d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// static
74d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangvoid PrefServiceHashStoreContents::RegisterPrefs(PrefRegistrySimple* registry) {
75d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  // Register the top level dictionary to map profile names to dictionaries of
76d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  // tracked preferences.
77d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  registry->RegisterDictionaryPref(kProfilePreferenceHashes);
78d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
79d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
80d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang// static
81d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangvoid PrefServiceHashStoreContents::ResetAllPrefHashStores(
82d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    PrefService* pref_service) {
83d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  pref_service->ClearPref(kProfilePreferenceHashes);
84d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
85d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
86d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangstd::string PrefServiceHashStoreContents::hash_store_id() const {
87d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  return hash_store_id_;
88d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
89d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
90d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangvoid PrefServiceHashStoreContents::Reset() {
91d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  DictionaryPrefUpdate update(pref_service_, kProfilePreferenceHashes);
925510728d28bb1ee04abc32da3d21b7df12948053Charles Davis
93d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  update->RemoveWithoutPathExpansion(hash_store_id_, NULL);
94d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
95d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  // Remove this store's entry in the kHashOfHashesDict.
96d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  base::DictionaryValue* hash_of_hashes_dict;
97d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  if (update->GetDictionaryWithoutPathExpansion(kHashOfHashesDict,
985510728d28bb1ee04abc32da3d21b7df12948053Charles Davis                                                &hash_of_hashes_dict)) {
99d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    hash_of_hashes_dict->RemoveWithoutPathExpansion(hash_store_id_, NULL);
100d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    if (hash_of_hashes_dict->empty())
1015510728d28bb1ee04abc32da3d21b7df12948053Charles Davis      update->RemovePath(kHashOfHashesDict, NULL);
102d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  }
103d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
104d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  if (update->empty())
105d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    pref_service_->ClearPref(kProfilePreferenceHashes);
106d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
107d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
1085510728d28bb1ee04abc32da3d21b7df12948053Charles Davisbool PrefServiceHashStoreContents::IsInitialized() const {
109d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  const base::DictionaryValue* pref_hash_dicts =
110d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang      pref_service_->GetDictionary(kProfilePreferenceHashes);
1115510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  return pref_hash_dicts->GetDictionaryWithoutPathExpansion(hash_store_id_,
112d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang                                                            NULL);
113d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
1145510728d28bb1ee04abc32da3d21b7df12948053Charles Davis
115d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangconst base::DictionaryValue* PrefServiceHashStoreContents::GetContents() const {
116d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  const base::DictionaryValue* pref_hash_dicts =
117d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang      pref_service_->GetDictionary(kProfilePreferenceHashes);
118d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  const base::DictionaryValue* hashes_dict = NULL;
119d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  pref_hash_dicts->GetDictionaryWithoutPathExpansion(hash_store_id_,
120d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang                                                     &hashes_dict);
121d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  return hashes_dict;
122d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
123d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
124d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangscoped_ptr<HashStoreContents::MutableDictionary>
125d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid FangPrefServiceHashStoreContents::GetMutableContents() {
126d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  return scoped_ptr<HashStoreContents::MutableDictionary>(
127d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang      new PrefServiceMutableDictionary(hash_store_id_, pref_service_));
1285510728d28bb1ee04abc32da3d21b7df12948053Charles Davis}
129d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
130d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangstd::string PrefServiceHashStoreContents::GetSuperMac() const {
1315510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  const base::DictionaryValue* pref_hash_dicts =
132d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang      pref_service_->GetDictionary(kProfilePreferenceHashes);
133d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  const base::DictionaryValue* hash_of_hashes_dict = NULL;
1345510728d28bb1ee04abc32da3d21b7df12948053Charles Davis  std::string hash_of_hashes;
135d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  if (pref_hash_dicts->GetDictionaryWithoutPathExpansion(
136d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang          kHashOfHashesDict, &hash_of_hashes_dict)) {
137d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang    hash_of_hashes_dict->GetStringWithoutPathExpansion(hash_store_id_,
138d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang                                                       &hash_of_hashes);
139d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  }
140d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  return hash_of_hashes;
141d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
142d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang
143d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fangvoid PrefServiceHashStoreContents::SetSuperMac(const std::string& super_mac) {
144d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang  PrefServiceMutableDictionary(kHashOfHashesDict, pref_service_)
145d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang      ->SetStringWithoutPathExpansion(hash_store_id_, super_mac);
146d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang}
1475510728d28bb1ee04abc32da3d21b7df12948053Charles Davis