12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/default_pref_store.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_notifier_impl.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_value_store.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/value_conversions.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "build/build_config.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ReadErrorHandler : public PersistentPrefStore::ReadErrorDelegate { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadErrorHandler(base::Callback<void(PersistentPrefStore::PrefReadError)> cb) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : callback_(cb) {} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnError(PersistentPrefStore::PrefReadError error) OVERRIDE { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.Run(error); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Callback<void(PersistentPrefStore::PrefReadError)> callback_; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::PrefService( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefNotifierImpl* pref_notifier, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefValueStore* pref_value_store, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersistentPrefStore* user_prefs, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistry* pref_registry, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Callback<void(PersistentPrefStore::PrefReadError)> 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_error_callback, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : pref_notifier_(pref_notifier), 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_value_store_(pref_value_store), 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry_(pref_registry), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_(user_prefs), 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_error_callback_(read_error_callback) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->SetPrefService(this); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitFromStorage(async); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::~PrefService() { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset pointers so accesses after destruction reliably crash. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_value_store_.reset(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry_ = NULL; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_ = NULL; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_.reset(); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::InitFromStorage(bool async) { 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (user_pref_store_->IsInitializationComplete()) { 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch read_error_callback_.Run(user_pref_store_->GetReadError()); 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (!async) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_error_callback_.Run(user_pref_store_->ReadPrefs()); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Guarantee that initialization happens after this function returned. 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&PersistentPrefStore::ReadPrefsAsync, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_.get(), 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ReadErrorHandler(read_error_callback_))); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::CommitPendingWrite() { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->CommitPendingWrite(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::GetBoolean(const char* path) const { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = false; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsBoolean(&result); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int PrefService::GetInteger(const char* path) const { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result = 0; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsInteger(&result); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double PrefService::GetDouble(const char* path) const { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double result = 0.0; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsDouble(&result); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string PrefService::GetString(const char* path) const { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath PrefService::GetFilePath(const char* path) const { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath result; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(result); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = base::GetValueAsFilePath(*value, &result); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::HasPrefPath(const char* path) const { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref && !pref->IsDefaultValue(); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValues() const { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistry::const_iterator i = pref_registry_->begin(); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; i != pref_registry_->end(); ++i) { 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(i->first); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(value); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out->Set(i->first, value->DeepCopy()); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return out.Pass(); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)scoped_ptr<base::DictionaryValue> 1820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PrefService::GetPreferenceValuesWithoutPathExpansion() const { 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrefRegistry::const_iterator i = pref_registry_->begin(); 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (; i != pref_registry_->end(); ++i) { 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::Value* value = GetPreferenceValue(i->first); 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(value); 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) out->SetWithoutPathExpansion(i->first, value->DeepCopy()); 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return out.Pass(); 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PrefService::Preference* PrefService::FindPreference( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* pref_name) const { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PreferenceMap::iterator it = prefs_map_.find(pref_name); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it != prefs_map_.end()) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &(it->second); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* default_value = NULL; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref_registry_->defaults()->GetValue(pref_name, &default_value)) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = prefs_map_.insert( 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(pref_name, Preference( 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, pref_name, default_value->GetType()))).first; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &(it->second); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::ReadOnly() const { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return user_pref_store_->ReadOnly(); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::PrefInitializationStatus PrefService::GetInitializationStatus() 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->IsInitializationComplete()) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return INITIALIZATION_STATUS_WAITING; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (user_pref_store_->GetReadError()) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PersistentPrefStore::PREF_READ_ERROR_NONE: 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return INITIALIZATION_STATUS_SUCCESS; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PersistentPrefStore::PREF_READ_ERROR_NO_FILE: 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return INITIALIZATION_STATUS_CREATED_NEW_PREF_STORE; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return INITIALIZATION_STATUS_ERROR; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::IsManagedPreference(const char* pref_name) const { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(pref_name); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref && pref->IsManaged(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::IsUserModifiablePreference(const char* pref_name) const { 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(pref_name); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref && pref->IsUserModifiable(); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::DictionaryValue* PrefService::GetDictionary( 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* path) const { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (value->GetType() != base::Value::TYPE_DICTIONARY) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return static_cast<const base::DictionaryValue*>(value); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetUserPrefValue(const char* path) const { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to get an unregistered pref: " << path; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Look for an existing preference in the user store. If it doesn't 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exist, return NULL. 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value = NULL; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->GetMutableValue(path, &value)) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value->IsType(pref->GetType())) { 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Pref value type doesn't match registered type."; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetDefaultPrefValue(const char* path, 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value) { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry_->SetDefaultPrefValue(path, value); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetDefaultPrefValue(const char* path) const { 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lookup the preference in the default store. 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = NULL; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref_registry_->defaults()->GetValue(path, &value)) { 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Default value missing for pref: " << path; 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::ListValue* PrefService::GetList(const char* path) const { 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (value->GetType() != base::Value::TYPE_LIST) { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return static_cast<const base::ListValue*>(value); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddPrefObserver(const char* path, PrefObserver* obs) { 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->AddPrefObserver(path, obs); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::RemovePrefObserver(const char* path, PrefObserver* obs) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->RemovePrefObserver(path, obs); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddPrefInitObserver(base::Callback<void(bool)> obs) { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->AddInitObserver(obs); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefRegistry* PrefService::DeprecatedGetPrefRegistry() { 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_registry_.get(); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::ClearPref(const char* path) { 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to clear an unregistered pref: " << path; 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->RemoveValue(path); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PrefService::Set(const char* path, const base::Value& value) { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, value.DeepCopy()); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetBoolean(const char* path, bool value) { 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUserPrefValue(path, new base::FundamentalValue(value)); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetInteger(const char* path, int value) { 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUserPrefValue(path, new base::FundamentalValue(value)); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetDouble(const char* path, double value) { 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUserPrefValue(path, new base::FundamentalValue(value)); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetString(const char* path, const std::string& value) { 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUserPrefValue(path, new base::StringValue(value)); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetFilePath(const char* path, const base::FilePath& value) { 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, base::CreateFilePathValue(value)); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetInt64(const char* path, int64 value) { 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUserPrefValue(path, new base::StringValue(base::Int64ToString(value))); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 PrefService::GetInt64(const char* path) const { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result("0"); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 val; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt64(result, &val); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetUint64(const char* path, uint64 value) { 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUserPrefValue(path, new base::StringValue(base::Uint64ToString(value))); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint64 PrefService::GetUint64(const char* path) const { 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result("0"); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 val; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToUint64(result, &val); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* PrefService::GetMutableUserPref(const char* path, 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value::Type type) { 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK(type == base::Value::TYPE_DICTIONARY || type == base::Value::TYPE_LIST); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to get an unregistered pref: " << path; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref->GetType() != type) { 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Wrong type for GetMutableValue: " << path; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Look for an existing preference in the user store. If it doesn't 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exist or isn't the correct type, create a new user preference. 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value* value = NULL; 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->GetMutableValue(path, &value) || 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !value->IsType(type)) { 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (type == base::Value::TYPE_DICTIONARY) { 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) value = new base::DictionaryValue; 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else if (type == base::Value::TYPE_LIST) { 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) value = new base::ListValue; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->SetValueSilently(path, value); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::ReportUserPrefChanged(const std::string& key) { 435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(CalledOnValidThread()); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->ReportValueChanged(key); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PrefService::SetUserPrefValue(const char* path, base::Value* new_value) { 4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<base::Value> owned_value(new_value); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to write an unregistered pref: " << path; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref->GetType() != new_value->GetType()) { 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to set pref " << path 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " of type " << pref->GetType() 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " to value of type " << new_value->GetType(); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->SetValue(path, owned_value.release()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::UpdateCommandLinePrefStore(PrefStore* command_line_store) { 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_value_store_->UpdateCommandLinePrefStore(command_line_store); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PrefService::Preference 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::Preference::Preference(const PrefService* service, 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* name, 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type type) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : name_(name), 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_(type), 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_service_(service) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(name); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(service); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string PrefService::Preference::name() const { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return name_; 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Value::Type PrefService::Preference::GetType() const { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::Value* PrefService::Preference::GetValue() const { 4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* result= pref_service_->GetPreferenceValue(name_); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(result) << "Must register pref before getting its value"; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::Value* PrefService::Preference::GetRecommendedValue() const { 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(pref_service_->FindPreference(name_.c_str())) << 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Must register pref before getting its value"; 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* found_value = NULL; 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_value_store()->GetRecommendedValue(name_, type_, &found_value)) { 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(found_value->IsType(type_)); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found_value; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pref has no recommended value. 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsManaged() const { 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInManagedStore(name_.c_str()); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsRecommended() const { 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromRecommendedStore(name_.c_str()); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::HasExtensionSetting() const { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInExtensionStore(name_.c_str()); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::HasUserSetting() const { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInUserStore(name_.c_str()); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsExtensionControlled() const { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromExtensionStore(name_.c_str()); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsUserControlled() const { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromUserStore(name_.c_str()); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsDefaultValue() const { 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromDefaultStore(name_.c_str()); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsUserModifiable() const { 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueUserModifiable(name_.c_str()); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsExtensionModifiable() const { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueExtensionModifiable(name_.c_str()); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetPreferenceValue( 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path) const { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 5427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* default_value = NULL; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_registry_->defaults()->GetValue(path, &default_value)) { 5447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* found_value = NULL; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type default_type = default_value->GetType(); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_value_store_->GetValue(path, default_type, &found_value)) { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(found_value->IsType(default_type)); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found_value; 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Every registered preference has at least a default value. 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "no valid value found for registered pref " << path; 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 557