Chromium Code Reviews| Index: chrome/browser/prefs/pref_service.cc |
| diff --git a/chrome/browser/prefs/pref_service.cc b/chrome/browser/prefs/pref_service.cc |
| index 61f54f7f1f36acdf5ca20d96b01ae0cc27764c2c..b780995ed1a09ec2220b392bc1c1059bddf8c3e1 100644 |
| --- a/chrome/browser/prefs/pref_service.cc |
| +++ b/chrome/browser/prefs/pref_service.cc |
| @@ -18,6 +18,7 @@ |
| #include "base/value_conversions.h" |
| #include "build/build_config.h" |
| #include "chrome/browser/prefs/pref_notifier_impl.h" |
| +#include "chrome/browser/prefs/pref_registry.h" |
| #include "chrome/browser/prefs/pref_value_store.h" |
| using content::BrowserContext; |
| @@ -43,16 +44,21 @@ PrefService::PrefService( |
| PrefNotifierImpl* pref_notifier, |
| PrefValueStore* pref_value_store, |
| PersistentPrefStore* user_prefs, |
| - DefaultPrefStore* default_store, |
| + scoped_ptr<PrefRegistry> pref_registry, |
| base::Callback<void(PersistentPrefStore::PrefReadError)> |
| read_error_callback, |
| bool async) |
| : pref_notifier_(pref_notifier), |
| pref_value_store_(pref_value_store), |
| user_pref_store_(user_prefs), |
| - default_store_(default_store), |
| - read_error_callback_(read_error_callback) { |
| + read_error_callback_(read_error_callback), |
| + pref_registry_(pref_registry.Pass()) { |
| pref_notifier_->SetPrefService(this); |
| + |
| + pref_registry_->RetrieveDefaults(&default_store_); |
| + pref_registry_->pref_service_ = this; |
| + RegisterInitialPreferences(); |
| + |
| InitFromStorage(async); |
| } |
| @@ -300,8 +306,37 @@ void PrefService::AddPrefInitObserver(base::Callback<void(bool)> obs) { |
| pref_notifier_->AddInitObserver(obs); |
| } |
| +PrefRegistry* PrefService::DeprecatedGetPrefRegistry() const { |
| + return pref_registry_.get(); |
| +} |
| + |
| +void PrefService::RegisterInitialPreferences() { |
| + // Invariant: default_store_ is valid and contains the preferences |
| + // registered prior to construction time. |
| + for (DefaultPrefStore::const_iterator it = default_store_->begin(); |
| + it != default_store_->end(); |
| + ++it) { |
| + RegisterPreference(it->first.c_str(), it->second, true); |
| + } |
| +} |
| + |
| +// TODO(joi): Once all registration is done before the PrefService is |
| +// constructed, we can stop exposing a separate RegisterPreference |
| +// method, and we can simplify the registration logic. Possibly at the |
| +// same point we can remove UnregisterPreference. For now, because a |
| +// few remaining places register preferences after PrefService |
| +// construction, it is better to leave this here and have PrefRegistry |
| +// delegate to PrefService::RegisterPreference after that |
| +// point. Otherwise, PrefRegistry would need to control PrefService's |
| +// default_store_ and user_pref_store_ members, as well as the |
| +// pref_map_ member for UnregisterPreference. |
|
Mattias Nissler (ping if slow)
2013/01/25 14:57:11
The default_store_ it controls already! The user_p
Jói
2013/01/29 16:10:02
Registration is now fully owned by PrefRegistry. P
|
| +// |
| +// We are, however, able to implement the interface we desire in the |
| +// long term on PrefRegistry, and make this relationship an |
| +// implementation detail. |
| void PrefService::RegisterPreference(const char* path, |
| - Value* default_value) { |
| + Value* default_value, |
| + bool in_default_store) { |
| DCHECK(CalledOnValidThread()); |
| // The main code path takes ownership, but most don't. We'll be safe. |
| @@ -330,8 +365,10 @@ void PrefService::RegisterPreference(const char* path, |
| if (needs_empty_value) |
| user_pref_store_->MarkNeedsEmptyValue(path); |
| - // Hand off ownership. |
| - default_store_->SetDefaultValue(path, scoped_value.release()); |
| + if (!in_default_store) { |
| + // Hand off ownership. |
| + default_store_->SetDefaultValue(path, scoped_value.release()); |
| + } |
| } |
| void PrefService::UnregisterPreference(const char* path) { |
| @@ -345,6 +382,10 @@ void PrefService::UnregisterPreference(const char* path) { |
| default_store_->RemoveDefaultValue(path); |
| } |
| +bool PrefService::AllowPrefRegistrarSimple() const { |
| + return true; |
| +} |
| + |
| void PrefService::ClearPref(const char* path) { |
| DCHECK(CalledOnValidThread()); |