172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be 33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file. 43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_value_store.h" 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prefs/pref_notifier.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefStoreKeeper::PrefStoreKeeper() 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen : pref_value_store_(NULL), 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen type_(PrefValueStore::INVALID_STORE) { 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefStoreKeeper::~PrefStoreKeeper() { 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (pref_store_.get()) { 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_store_->RemoveObserver(this); 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pref_store_ = NULL; 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pref_value_store_ = NULL; 2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::PrefStoreKeeper::Initialize( 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore* store, 2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefStore* pref_store, 2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore::PrefStoreType type) { 2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (pref_store_.get()) 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_store_->RemoveObserver(this); 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen type_ = type; 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_value_store_ = store; 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pref_store_ = pref_store; 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (pref_store_.get()) 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_store_->AddObserver(this); 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::PrefStoreKeeper::OnPrefValueChanged( 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& key) { 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_value_store_->OnPrefValueChanged(type_, key); 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::PrefStoreKeeper::OnInitializationCompleted() { 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_value_store_->OnInitializationCompleted(type_); 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefValueStore(PrefStore* managed_platform_prefs, 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* managed_cloud_prefs, 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefStore* extension_prefs, 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefStore* command_line_prefs, 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefStore* user_prefs, 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* recommended_platform_prefs, 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* recommended_cloud_prefs, 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefStore* default_prefs, 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefNotifier* pref_notifier) 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen : pref_notifier_(pref_notifier) { 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InitPrefStore(MANAGED_PLATFORM_STORE, managed_platform_prefs); 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitPrefStore(MANAGED_CLOUD_STORE, managed_cloud_prefs); 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InitPrefStore(EXTENSION_STORE, extension_prefs); 5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InitPrefStore(COMMAND_LINE_STORE, command_line_prefs); 5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InitPrefStore(USER_STORE, user_prefs); 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitPrefStore(RECOMMENDED_PLATFORM_STORE, recommended_platform_prefs); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitPrefStore(RECOMMENDED_CLOUD_STORE, recommended_cloud_prefs); 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InitPrefStore(DEFAULT_STORE, default_prefs); 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CheckInitializationCompleted(); 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPrefValueStore::~PrefValueStore() {} 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPrefValueStore* PrefValueStore::CloneAndSpecialize( 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* managed_platform_prefs, 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* managed_cloud_prefs, 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* extension_prefs, 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* command_line_prefs, 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* user_prefs, 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* recommended_platform_prefs, 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* recommended_cloud_prefs, 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStore* default_prefs, 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefNotifier* pref_notifier) { 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(pref_notifier); 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!managed_platform_prefs) 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen managed_platform_prefs = GetPrefStore(MANAGED_PLATFORM_STORE); 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!managed_cloud_prefs) 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen managed_cloud_prefs = GetPrefStore(MANAGED_CLOUD_STORE); 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!extension_prefs) 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extension_prefs = GetPrefStore(EXTENSION_STORE); 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!command_line_prefs) 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen command_line_prefs = GetPrefStore(COMMAND_LINE_STORE); 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!user_prefs) 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen user_prefs = GetPrefStore(USER_STORE); 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!recommended_platform_prefs) 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen recommended_platform_prefs = GetPrefStore(RECOMMENDED_PLATFORM_STORE); 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!recommended_cloud_prefs) 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen recommended_cloud_prefs = GetPrefStore(RECOMMENDED_CLOUD_STORE); 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!default_prefs) 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default_prefs = GetPrefStore(DEFAULT_STORE); 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new PrefValueStore( 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen managed_platform_prefs, managed_cloud_prefs, extension_prefs, 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen command_line_prefs, user_prefs, recommended_platform_prefs, 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen recommended_cloud_prefs, default_prefs, 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pref_notifier); 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::GetValue(const std::string& name, 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Value::ValueType type, 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Value** out_value) const { 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *out_value = NULL; 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Check the |PrefStore|s in order of their priority from highest to lowest 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // to find the value of the preference described by the given preference name. 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (GetValueFromStore(name.c_str(), static_cast<PrefStoreType>(i), 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen out_value)) { 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!(*out_value)->IsType(type)) { 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LOG(WARNING) << "Expected type for " << name << " is " << type 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << " but got " << (*out_value)->GetType() 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << " in store " << i; 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen continue; 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::NotifyPrefChanged( 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* path, 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore::PrefStoreType new_store) { 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DCHECK(new_store != INVALID_STORE); 1285b4f7dfc48ceaeeb1088cf6e84ba69f994c3861bKristian Monsen 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If the pref is controlled by a higher-priority store, its effective value 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // cannot have changed. 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefStoreType controller = ControllingPrefStoreForPref(path); 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (controller == INVALID_STORE || controller >= new_store) 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_notifier_->OnPreferenceChanged(path); 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool PrefValueStore::PrefValueInManagedStore(const char* name) const { 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return PrefValueInStore(name, MANAGED_PLATFORM_STORE) || 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefValueInStore(name, MANAGED_CLOUD_STORE); 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueInExtensionStore(const char* name) const { 14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return PrefValueInStore(name, EXTENSION_STORE); 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueInUserStore(const char* name) const { 14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return PrefValueInStore(name, USER_STORE); 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueFromExtensionStore(const char* name) const { 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return ControllingPrefStoreForPref(name) == EXTENSION_STORE; 1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueFromUserStore(const char* name) const { 15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return ControllingPrefStoreForPref(name) == USER_STORE; 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueFromDefaultStore(const char* name) const { 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return ControllingPrefStoreForPref(name) == DEFAULT_STORE; 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefValueStore::PrefValueUserModifiable(const char* name) const { 16221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefStoreType effective_store = ControllingPrefStoreForPref(name); 16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return effective_store >= USER_STORE || 16421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen effective_store == INVALID_STORE; 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool PrefValueStore::PrefValueExtensionModifiable(const char* name) const { 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen PrefStoreType effective_store = ControllingPrefStoreForPref(name); 169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return effective_store >= EXTENSION_STORE || 170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen effective_store == INVALID_STORE; 171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool PrefValueStore::PrefValueInStore( 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char* name, 17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore::PrefStoreType store) const { 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Declare a temp Value* and call GetValueFromStore, 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // ignoring the output value. 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Value* tmp_value = NULL; 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return GetValueFromStore(name, store, &tmp_value); 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool PrefValueStore::PrefValueInStoreRange( 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char* name, 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore::PrefStoreType first_checked_store, 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore::PrefStoreType last_checked_store) const { 18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (first_checked_store > last_checked_store) { 18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTREACHED(); 18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (size_t i = first_checked_store; 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen i <= static_cast<size_t>(last_checked_store); ++i) { 19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (PrefValueInStore(name, static_cast<PrefStoreType>(i))) 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref( 20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* name) const { 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (PrefValueInStore(name, static_cast<PrefStoreType>(i))) 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return static_cast<PrefStoreType>(i); 2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return INVALID_STORE; 20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 2074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool PrefValueStore::GetValueFromStore(const char* name, 20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore::PrefStoreType store_type, 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Value** out_value) const { 21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Only return true if we find a value and it is the correct type, so stale 21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // values with the incorrect type will be ignored. 21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const PrefStore* store = GetPrefStore(static_cast<PrefStoreType>(store_type)); 21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (store) { 21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen switch (store->GetValue(name, out_value)) { 21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen case PrefStore::READ_USE_DEFAULT: 21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen store = GetPrefStore(DEFAULT_STORE); 21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!store || store->GetValue(name, out_value) != PrefStore::READ_OK) { 21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen *out_value = NULL; 22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Fall through... 22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen case PrefStore::READ_OK: 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen case PrefStore::READ_NO_VALUE: 22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen break; 22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // No valid value found for the given preference name: set the return false. 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen *out_value = NULL; 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::OnPrefValueChanged(PrefValueStore::PrefStoreType type, 23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& key) { 23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotifyPrefChanged(key.c_str(), type); 2384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 2394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::OnInitializationCompleted( 24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefValueStore::PrefStoreType type) { 24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CheckInitializationCompleted(); 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2445af4e3efaa07e1369024c188538dcf582ed5a21eKristian Monsen 24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::InitPrefStore(PrefValueStore::PrefStoreType type, 24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefStore* pref_store) { 24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_stores_[type].Initialize(this, pref_store, type); 24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 25021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrefValueStore::CheckInitializationCompleted() { 25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { 25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<PrefStore> store = 25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetPrefStore(static_cast<PrefStoreType>(i)); 25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (store && !store->IsInitializationComplete()) 25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen pref_notifier_->OnInitializationCompleted(); 2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 259