pref_service_hash_store_contents.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file. 423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/prefs/tracked/pref_service_hash_store_contents.h" 623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/prefs/pref_service.h" 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/values.h" 1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/pref_names.h" 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace { 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Implements get-or-create of a dictionary value and holds a 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// DictionaryPrefUpdate. 1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class PrefServiceMutableDictionary 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) : public HashStoreContents::MutableDictionary { 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public: 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Creates an instance that provides mutable access to a dictionary value 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // named |key| that is a child of |prefs::kProfilePreferenceHashes| in 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // |prefs|. 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PrefServiceMutableDictionary(const std::string& key, 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PrefService* pref_service); 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // HashStoreContents::MutableDictionary implementation 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual base::DictionaryValue* operator->() OVERRIDE; 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private: 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string key_; 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DictionaryPrefUpdate update_; 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PrefServiceMutableDictionary::PrefServiceMutableDictionary( 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& key, 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PrefService* pref_service) 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) : key_(key), update_(pref_service, prefs::kProfilePreferenceHashes) { 3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(!key_.empty()); 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)base::DictionaryValue* PrefServiceMutableDictionary::operator->() { 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::DictionaryValue* dictionary = NULL; 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!update_->GetDictionaryWithoutPathExpansion(key_, &dictionary)) { 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) dictionary = new base::DictionaryValue; 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) update_->SetWithoutPathExpansion(key_, dictionary); 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return dictionary; 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} // namespace 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// static 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char PrefServiceHashStoreContents::kHashOfHashesDict[] = "hash_of_hashes"; 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// static 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char PrefServiceHashStoreContents::kStoreVersionsDict[] = 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) "store_versions"; 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PrefServiceHashStoreContents::PrefServiceHashStoreContents( 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& hash_store_id, 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PrefService* pref_service) 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) : hash_store_id_(hash_store_id), pref_service_(pref_service) {} 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// static 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PrefServiceHashStoreContents::RegisterPrefs(PrefRegistrySimple* registry) { 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Register the top level dictionary to map profile names to dictionaries of 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // tracked preferences. 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) registry->RegisterDictionaryPref(prefs::kProfilePreferenceHashes); 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// static 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PrefServiceHashStoreContents::ResetAllPrefHashStores( 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PrefService* pref_service) { 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pref_service->ClearPref(prefs::kProfilePreferenceHashes); 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)std::string PrefServiceHashStoreContents::hash_store_id() const { 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return hash_store_id_; 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PrefServiceHashStoreContents::Reset() { 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DictionaryPrefUpdate update(pref_service_, prefs::kProfilePreferenceHashes); 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) update->RemoveWithoutPathExpansion(hash_store_id_, NULL); 8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Remove this store's entry in the kStoreVersionsDict. 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::DictionaryValue* version_dict; 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (update->GetDictionary(kStoreVersionsDict, &version_dict)) 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) version_dict->RemoveWithoutPathExpansion(hash_store_id_, NULL); 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Remove this store's entry in the kHashOfHashesDict. 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::DictionaryValue* hash_of_hashes_dict; 9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (update->GetDictionaryWithoutPathExpansion(kHashOfHashesDict, 9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &hash_of_hashes_dict)) { 9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) hash_of_hashes_dict->RemoveWithoutPathExpansion(hash_store_id_, NULL); 9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool PrefServiceHashStoreContents::IsInitialized() const { 10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::DictionaryValue* pref_hash_dicts = 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pref_service_->GetDictionary(prefs::kProfilePreferenceHashes); 10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return pref_hash_dicts->GetDictionaryWithoutPathExpansion(hash_store_id_, 10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) NULL); 10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool PrefServiceHashStoreContents::GetVersion(int* version) const { 10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(version); 10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::DictionaryValue* pref_hash_data = 10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pref_service_->GetDictionary(prefs::kProfilePreferenceHashes); 11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::DictionaryValue* version_dict; 11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return pref_hash_data->GetDictionary(kStoreVersionsDict, &version_dict) && 11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) version_dict->GetIntegerWithoutPathExpansion(hash_store_id_, version); 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PrefServiceHashStoreContents::SetVersion(int version) { 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PrefServiceMutableDictionary(kStoreVersionsDict, pref_service_) 11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ->SetIntegerWithoutPathExpansion(hash_store_id_, version); 11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const base::DictionaryValue* PrefServiceHashStoreContents::GetContents() const { 12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::DictionaryValue* pref_hash_dicts = 12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pref_service_->GetDictionary(prefs::kProfilePreferenceHashes); 12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::DictionaryValue* hashes_dict = NULL; 12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pref_hash_dicts->GetDictionaryWithoutPathExpansion(hash_store_id_, 12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &hashes_dict); 12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return hashes_dict; 12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)scoped_ptr<HashStoreContents::MutableDictionary> 13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PrefServiceHashStoreContents::GetMutableContents() { 13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return scoped_ptr<HashStoreContents::MutableDictionary>( 13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new PrefServiceMutableDictionary(hash_store_id_, pref_service_)); 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)std::string PrefServiceHashStoreContents::GetSuperMac() const { 13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::DictionaryValue* pref_hash_dicts = 13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pref_service_->GetDictionary(prefs::kProfilePreferenceHashes); 13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::DictionaryValue* hash_of_hashes_dict = NULL; 14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string hash_of_hashes; 14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (pref_hash_dicts->GetDictionaryWithoutPathExpansion( 14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) kHashOfHashesDict, &hash_of_hashes_dict)) { 14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) hash_of_hashes_dict->GetStringWithoutPathExpansion(hash_store_id_, 14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &hash_of_hashes); 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return hash_of_hashes; 14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void PrefServiceHashStoreContents::SetSuperMac(const std::string& super_mac) { 15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PrefServiceMutableDictionary(kHashOfHashesDict, pref_service_) 15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ->SetStringWithoutPathExpansion(hash_store_id_, super_mac); 15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 153