pref_service.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/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) pref_registry_->SetRegistrationCallback( 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&PrefService::AddRegisteredPreference, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddInitialPreferences(); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitFromStorage(async); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::~PrefService() { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove our callback, setting a NULL one. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry_->SetRegistrationCallback(PrefRegistry::RegistrationCallback()); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset pointers so accesses after destruction reliably crash. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_value_store_.reset(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry_ = NULL; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_ = NULL; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_.reset(); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::InitFromStorage(bool async) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!async) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_error_callback_.Run(user_pref_store_->ReadPrefs()); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Guarantee that initialization happens after this function returned. 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask( 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&PersistentPrefStore::ReadPrefsAsync, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_.get(), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ReadErrorHandler(read_error_callback_))); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::ReloadPersistentPrefs() { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return user_pref_store_->ReadPrefs() == 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersistentPrefStore::PREF_READ_ERROR_NONE; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::CommitPendingWrite() { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->CommitPendingWrite(); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::GetBoolean(const char* path) const { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = false; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsBoolean(&result); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int PrefService::GetInteger(const char* path) const { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result = 0; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsInteger(&result); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double PrefService::GetDouble(const char* path) const { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double result = 0.0; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsDouble(&result); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string PrefService::GetString(const char* path) const { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath PrefService::GetFilePath(const char* path) const { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath result; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(result); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = base::GetValueAsFilePath(*value, &result); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::HasPrefPath(const char* path) const { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref && !pref->IsDefaultValue(); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryValue* PrefService::GetPreferenceValues() const { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* out = new DictionaryValue; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistry::const_iterator i = pref_registry_->begin(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; i != pref_registry_->end(); ++i) { 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* value = GetPreferenceValue(i->first); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(value); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out->Set(i->first, value->DeepCopy()); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return out; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PrefService::Preference* PrefService::FindPreference( 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* pref_name) const { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PreferenceMap::iterator it = prefs_map_.find(pref_name); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it != prefs_map_.end()) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &(it->second); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* default_value = NULL; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref_registry_->defaults()->GetValue(pref_name, &default_value)) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = prefs_map_.insert( 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(pref_name, Preference( 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, pref_name, default_value->GetType()))).first; 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &(it->second); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::ReadOnly() const { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return user_pref_store_->ReadOnly(); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::PrefInitializationStatus PrefService::GetInitializationStatus() 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->IsInitializationComplete()) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return INITIALIZATION_STATUS_WAITING; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (user_pref_store_->GetReadError()) { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PersistentPrefStore::PREF_READ_ERROR_NONE: 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return INITIALIZATION_STATUS_SUCCESS; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PersistentPrefStore::PREF_READ_ERROR_NO_FILE: 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return INITIALIZATION_STATUS_CREATED_NEW_PREF_STORE; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return INITIALIZATION_STATUS_ERROR; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::IsManagedPreference(const char* pref_name) const { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(pref_name); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref && pref->IsManaged(); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::IsUserModifiablePreference(const char* pref_name) const { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(pref_name); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref && pref->IsUserModifiable(); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const DictionaryValue* PrefService::GetDictionary(const char* path) const { 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* value = GetPreferenceValue(path); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetType() != Value::TYPE_DICTIONARY) { 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<const DictionaryValue*>(value); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetUserPrefValue(const char* path) const { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to get an unregistered pref: " << path; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Look for an existing preference in the user store. If it doesn't 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exist, return NULL. 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value = NULL; 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->GetMutableValue(path, &value)) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value->IsType(pref->GetType())) { 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Pref value type doesn't match registered type."; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetDefaultPrefValue(const char* path, 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value) { 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry_->SetDefaultPrefValue(path, value); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetDefaultPrefValue(const char* path) const { 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lookup the preference in the default store. 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = NULL; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref_registry_->defaults()->GetValue(path, &value)) { 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Default value missing for pref: " << path; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ListValue* PrefService::GetList(const char* path) const { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* value = GetPreferenceValue(path); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetType() != Value::TYPE_LIST) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<const ListValue*>(value); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddPrefObserver(const char* path, PrefObserver* obs) { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->AddPrefObserver(path, obs); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::RemovePrefObserver(const char* path, PrefObserver* obs) { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->RemovePrefObserver(path, obs); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddPrefInitObserver(base::Callback<void(bool)> obs) { 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->AddInitObserver(obs); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefRegistry* PrefService::DeprecatedGetPrefRegistry() { 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_registry_.get(); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddInitialPreferences() { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PrefRegistry::const_iterator it = pref_registry_->begin(); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != pref_registry_->end(); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it) { 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddRegisteredPreference(it->first.c_str(), it->second); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(joi): Once MarkNeedsEmptyValue is gone, we can probably 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// completely get rid of this method. There will be one difference in 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// semantics; currently all registered preferences are stored right 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// away in the prefs_map_, if we remove this they would be stored only 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// opportunistically. 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddRegisteredPreference(const char* path, 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value* default_value) { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For ListValue and DictionaryValue with non empty default, empty value 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for |path| needs to be persisted in |user_pref_store_|. So that 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non empty default is not used when user sets an empty ListValue or 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DictionaryValue. 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_empty_value = false; 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type orig_type = default_value->GetType(); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (orig_type == base::Value::TYPE_LIST) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* list = NULL; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (default_value->GetAsList(&list) && !list->empty()) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_empty_value = true; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (orig_type == base::Value::TYPE_DICTIONARY) { 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* dict = NULL; 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (default_value->GetAsDictionary(&dict) && !dict->empty()) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_empty_value = true; 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (needs_empty_value) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->MarkNeedsEmptyValue(path); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::ClearPref(const char* path) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to clear an unregistered pref: " << path; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->RemoveValue(path); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::Set(const char* path, const Value& value) { 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, value.DeepCopy()); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetBoolean(const char* path, bool value) { 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, Value::CreateBooleanValue(value)); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetInteger(const char* path, int value) { 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, Value::CreateIntegerValue(value)); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetDouble(const char* path, double value) { 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, Value::CreateDoubleValue(value)); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetString(const char* path, const std::string& value) { 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, Value::CreateStringValue(value)); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetFilePath(const char* path, const base::FilePath& value) { 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, base::CreateFilePathValue(value)); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetInt64(const char* path, int64 value) { 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, Value::CreateStringValue(base::Int64ToString(value))); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 PrefService::GetInt64(const char* path) const { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* value = GetPreferenceValue(path); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result("0"); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 val; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt64(result, &val); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetUint64(const char* path, uint64 value) { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, Value::CreateStringValue(base::Uint64ToString(value))); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint64 PrefService::GetUint64(const char* path) const { 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* value = GetPreferenceValue(path); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result("0"); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 val; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToUint64(result, &val); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value* PrefService::GetMutableUserPref(const char* path, 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type type) { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(type == Value::TYPE_DICTIONARY || type == Value::TYPE_LIST); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to get an unregistered pref: " << path; 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref->GetType() != type) { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Wrong type for GetMutableValue: " << path; 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Look for an existing preference in the user store. If it doesn't 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exist or isn't the correct type, create a new user preference. 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value* value = NULL; 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->GetMutableValue(path, &value) || 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !value->IsType(type)) { 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == Value::TYPE_DICTIONARY) { 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = new DictionaryValue; 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type == Value::TYPE_LIST) { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = new ListValue; 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->SetValueSilently(path, value); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::ReportUserPrefChanged(const std::string& key) { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->ReportValueChanged(key); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetUserPrefValue(const char* path, Value* new_value) { 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Value> owned_value(new_value); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to write an unregistered pref: " << path; 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref->GetType() != new_value->GetType()) { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to set pref " << path 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " of type " << pref->GetType() 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " to value of type " << new_value->GetType(); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->SetValue(path, owned_value.release()); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::UpdateCommandLinePrefStore(PrefStore* command_line_store) { 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_value_store_->UpdateCommandLinePrefStore(command_line_store); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PrefService::Preference 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::Preference::Preference(const PrefService* service, 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* name, 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type type) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : name_(name), 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_(type), 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_service_(service) { 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(name); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(service); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string PrefService::Preference::name() const { 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return name_; 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Value::Type PrefService::Preference::GetType() const { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_; 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const Value* PrefService::Preference::GetValue() const { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* result= pref_service_->GetPreferenceValue(name_); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(result) << "Must register pref before getting its value"; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const Value* PrefService::Preference::GetRecommendedValue() const { 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(pref_service_->FindPreference(name_.c_str())) << 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Must register pref before getting its value"; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* found_value = NULL; 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_value_store()->GetRecommendedValue(name_, type_, &found_value)) { 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(found_value->IsType(type_)); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found_value; 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pref has no recommended value. 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsManaged() const { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInManagedStore(name_.c_str()); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsRecommended() const { 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromRecommendedStore(name_.c_str()); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::HasExtensionSetting() const { 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInExtensionStore(name_.c_str()); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::HasUserSetting() const { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInUserStore(name_.c_str()); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsExtensionControlled() const { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromExtensionStore(name_.c_str()); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsUserControlled() const { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromUserStore(name_.c_str()); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsDefaultValue() const { 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromDefaultStore(name_.c_str()); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsUserModifiable() const { 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueUserModifiable(name_.c_str()); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsExtensionModifiable() const { 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueExtensionModifiable(name_.c_str()); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetPreferenceValue( 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path) const { 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* default_value = NULL; 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_registry_->defaults()->GetValue(path, &default_value)) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* found_value = NULL; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type default_type = default_value->GetType(); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_value_store_->GetValue(path, default_type, &found_value)) { 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(found_value->IsType(default_type)); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found_value; 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Every registered preference has at least a default value. 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "no valid value found for registered pref " << path; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 589