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