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