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