pref_service.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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) 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) 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::DictionaryValue* PrefService::GetPreferenceValues() const { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* out = new base::DictionaryValue; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistry::const_iterator i = pref_registry_->begin(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; i != pref_registry_->end(); ++i) { 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::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) 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::DictionaryValue* PrefService::GetDictionary( 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* path) const { 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (value->GetType() != base::Value::TYPE_DICTIONARY) { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return static_cast<const base::DictionaryValue*>(value); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetUserPrefValue(const char* path) const { 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to get an unregistered pref: " << path; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Look for an existing preference in the user store. If it doesn't 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exist, return NULL. 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value = NULL; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->GetMutableValue(path, &value)) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value->IsType(pref->GetType())) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Pref value type doesn't match registered type."; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetDefaultPrefValue(const char* path, 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value) { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry_->SetDefaultPrefValue(path, value); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetDefaultPrefValue(const char* path) const { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lookup the preference in the default store. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value* value = NULL; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref_registry_->defaults()->GetValue(path, &value)) { 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Default value missing for pref: " << path; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::ListValue* PrefService::GetList(const char* path) const { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (value->GetType() != base::Value::TYPE_LIST) { 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return static_cast<const base::ListValue*>(value); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddPrefObserver(const char* path, PrefObserver* obs) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->AddPrefObserver(path, obs); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::RemovePrefObserver(const char* path, PrefObserver* obs) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->RemovePrefObserver(path, obs); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddPrefInitObserver(base::Callback<void(bool)> obs) { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_notifier_->AddInitObserver(obs); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefRegistry* PrefService::DeprecatedGetPrefRegistry() { 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_registry_.get(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddInitialPreferences() { 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PrefRegistry::const_iterator it = pref_registry_->begin(); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != pref_registry_->end(); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it) { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddRegisteredPreference(it->first.c_str(), it->second); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(joi): Once MarkNeedsEmptyValue is gone, we can probably 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// completely get rid of this method. There will be one difference in 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// semantics; currently all registered preferences are stored right 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// away in the prefs_map_, if we remove this they would be stored only 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// opportunistically. 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::AddRegisteredPreference(const char* path, 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value* default_value) { 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For ListValue and DictionaryValue with non empty default, empty value 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for |path| needs to be persisted in |user_pref_store_|. So that 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non empty default is not used when user sets an empty ListValue or 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DictionaryValue. 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_empty_value = false; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type orig_type = default_value->GetType(); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (orig_type == base::Value::TYPE_LIST) { 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* list = NULL; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (default_value->GetAsList(&list) && !list->empty()) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_empty_value = true; 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (orig_type == base::Value::TYPE_DICTIONARY) { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* dict = NULL; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (default_value->GetAsDictionary(&dict) && !dict->empty()) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_empty_value = true; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (needs_empty_value) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->MarkNeedsEmptyValue(path); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::ClearPref(const char* path) { 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to clear an unregistered pref: " << path; 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->RemoveValue(path); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PrefService::Set(const char* path, const base::Value& value) { 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, value.DeepCopy()); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetBoolean(const char* path, bool value) { 3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetUserPrefValue(path, base::Value::CreateBooleanValue(value)); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetInteger(const char* path, int value) { 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetUserPrefValue(path, base::Value::CreateIntegerValue(value)); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetDouble(const char* path, double value) { 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetUserPrefValue(path, base::Value::CreateDoubleValue(value)); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetString(const char* path, const std::string& value) { 3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetUserPrefValue(path, base::Value::CreateStringValue(value)); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetFilePath(const char* path, const base::FilePath& value) { 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserPrefValue(path, base::CreateFilePathValue(value)); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetInt64(const char* path, int64 value) { 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetUserPrefValue(path, 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value::CreateStringValue(base::Int64ToString(value))); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 PrefService::GetInt64(const char* path) const { 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result("0"); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 val; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt64(result, &val); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::SetUint64(const char* path, uint64 value) { 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetUserPrefValue(path, 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value::CreateStringValue(base::Uint64ToString(value))); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint64 PrefService::GetUint64(const char* path) const { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* value = GetPreferenceValue(path); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to read an unregistered pref: " << path; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result("0"); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rv = value->GetAsString(&result); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(rv); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 val; 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToUint64(result, &val); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* PrefService::GetMutableUserPref(const char* path, 4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value::Type type) { 4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK(type == base::Value::TYPE_DICTIONARY || type == base::Value::TYPE_LIST); 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 get an unregistered pref: " << path; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref->GetType() != type) { 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Wrong type for GetMutableValue: " << path; 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Look for an existing preference in the user store. If it doesn't 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exist or isn't the correct type, create a new user preference. 4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value* value = NULL; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_pref_store_->GetMutableValue(path, &value) || 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !value->IsType(type)) { 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (type == base::Value::TYPE_DICTIONARY) { 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) value = new base::DictionaryValue; 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else if (type == base::Value::TYPE_LIST) { 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) value = new base::ListValue; 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->SetValueSilently(path, value); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::ReportUserPrefChanged(const std::string& key) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->ReportValueChanged(key); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PrefService::SetUserPrefValue(const char* path, base::Value* new_value) { 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<base::Value> owned_value(new_value); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Preference* pref = FindPreference(path); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pref) { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to write an unregistered pref: " << path; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref->GetType() != new_value->GetType()) { 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Trying to set pref " << path 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " of type " << pref->GetType() 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " to value of type " << new_value->GetType(); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_pref_store_->SetValue(path, owned_value.release()); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefService::UpdateCommandLinePrefStore(PrefStore* command_line_store) { 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_value_store_->UpdateCommandLinePrefStore(command_line_store); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PrefService::Preference 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService::Preference::Preference(const PrefService* service, 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* name, 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type type) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : name_(name), 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_(type), 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_service_(service) { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(name); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(service); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string PrefService::Preference::name() const { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return name_; 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Value::Type PrefService::Preference::GetType() const { 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_; 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::Value* PrefService::Preference::GetValue() const { 5197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* result= pref_service_->GetPreferenceValue(name_); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(result) << "Must register pref before getting its value"; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::Value* PrefService::Preference::GetRecommendedValue() const { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(pref_service_->FindPreference(name_.c_str())) << 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Must register pref before getting its value"; 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* found_value = NULL; 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_value_store()->GetRecommendedValue(name_, type_, &found_value)) { 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(found_value->IsType(type_)); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found_value; 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The pref has no recommended value. 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsManaged() const { 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInManagedStore(name_.c_str()); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsRecommended() const { 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromRecommendedStore(name_.c_str()); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::HasExtensionSetting() const { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInExtensionStore(name_.c_str()); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::HasUserSetting() const { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueInUserStore(name_.c_str()); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsExtensionControlled() const { 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromExtensionStore(name_.c_str()); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsUserControlled() const { 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromUserStore(name_.c_str()); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsDefaultValue() const { 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueFromDefaultStore(name_.c_str()); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsUserModifiable() const { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueUserModifiable(name_.c_str()); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrefService::Preference::IsExtensionModifiable() const { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pref_value_store()->PrefValueExtensionModifiable(name_.c_str()); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::Value* PrefService::GetPreferenceValue( 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path) const { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* default_value = NULL; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_registry_->defaults()->GetValue(path, &default_value)) { 5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* found_value = NULL; 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::Type default_type = default_value->GetType(); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pref_value_store_->GetValue(path, default_type, &found_value)) { 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(found_value->IsType(default_type)); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found_value; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Every registered preference has at least a default value. 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "no valid value found for registered pref " << path; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 592