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..9950316008888980c3c3850990922b39b6535a90 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,26 +44,40 @@ PrefService::PrefService( |
PrefNotifierImpl* pref_notifier, |
PrefValueStore* pref_value_store, |
PersistentPrefStore* user_prefs, |
- DefaultPrefStore* default_store, |
+ PrefRegistry* pref_registry, |
base::Callback<void(PersistentPrefStore::PrefReadError)> |
read_error_callback, |
bool async) |
: pref_notifier_(pref_notifier), |
pref_value_store_(pref_value_store), |
+ pref_registry_(pref_registry), |
user_pref_store_(user_prefs), |
- default_store_(default_store), |
read_error_callback_(read_error_callback) { |
pref_notifier_->SetPrefService(this); |
+ |
+ pref_registry_->SetRegistrationCallback( |
+ base::Bind(&PrefService::AddRegisteredPreference, |
+ base::Unretained(this))); |
+ pref_registry_->SetUnregistrationCallback( |
+ base::Bind(&PrefService::RemoveRegisteredPreference, |
+ base::Unretained(this))); |
+ AddInitialPreferences(); |
+ |
InitFromStorage(async); |
} |
PrefService::~PrefService() { |
DCHECK(CalledOnValidThread()); |
+ // Remove our callbacks, setting NULL ones. |
+ pref_registry_->SetRegistrationCallback(PrefRegistry::RegistrationCallback()); |
+ pref_registry_->SetUnregistrationCallback( |
+ PrefRegistry::UnregistrationCallback()); |
+ |
// Reset pointers so accesses after destruction reliably crash. |
pref_value_store_.reset(); |
+ pref_registry_ = NULL; |
user_pref_store_ = NULL; |
- default_store_ = NULL; |
pref_notifier_.reset(); |
} |
@@ -172,8 +187,8 @@ bool PrefService::HasPrefPath(const char* path) const { |
DictionaryValue* PrefService::GetPreferenceValues() const { |
DCHECK(CalledOnValidThread()); |
DictionaryValue* out = new DictionaryValue; |
- DefaultPrefStore::const_iterator i = default_store_->begin(); |
- for (; i != default_store_->end(); ++i) { |
+ PrefRegistry::const_iterator i = pref_registry_->begin(); |
+ for (; i != pref_registry_->end(); ++i) { |
const Value* value = GetPreferenceValue(i->first); |
DCHECK(value); |
out->Set(i->first, value->DeepCopy()); |
@@ -187,11 +202,12 @@ const PrefService::Preference* PrefService::FindPreference( |
PreferenceMap::iterator it = prefs_map_.find(pref_name); |
if (it != prefs_map_.end()) |
return &(it->second); |
- const base::Value::Type type = default_store_->GetType(pref_name); |
- if (type == Value::TYPE_NULL) |
+ const base::Value* default_value = NULL; |
+ if (!pref_registry_->defaults()->GetValue(pref_name, &default_value)) |
return NULL; |
it = prefs_map_.insert( |
- std::make_pair(pref_name, Preference(this, pref_name, type))).first; |
+ std::make_pair(pref_name, Preference( |
+ this, pref_name, default_value->GetType()))).first; |
return &(it->second); |
} |
@@ -266,7 +282,7 @@ const base::Value* PrefService::GetDefaultPrefValue(const char* path) const { |
DCHECK(CalledOnValidThread()); |
// Lookup the preference in the default store. |
const base::Value* value = NULL; |
- if (!default_store_->GetValue(path, &value)) { |
+ if (!pref_registry_->defaults()->GetValue(path, &value)) { |
NOTREACHED() << "Default value missing for pref: " << path; |
return NULL; |
} |
@@ -300,24 +316,33 @@ void PrefService::AddPrefInitObserver(base::Callback<void(bool)> obs) { |
pref_notifier_->AddInitObserver(obs); |
} |
-void PrefService::RegisterPreference(const char* path, |
- Value* default_value) { |
- DCHECK(CalledOnValidThread()); |
- |
- // The main code path takes ownership, but most don't. We'll be safe. |
- scoped_ptr<Value> scoped_value(default_value); |
+PrefRegistry* PrefService::DeprecatedGetPrefRegistry() { |
+ return pref_registry_.get(); |
+} |
- CHECK(!FindPreference(path)) << "Tried to register duplicate pref " << path; |
+void PrefService::AddInitialPreferences() { |
+ for (PrefRegistry::const_iterator it = pref_registry_->begin(); |
+ it != pref_registry_->end(); |
+ ++it) { |
+ AddRegisteredPreference(it->first.c_str(), it->second); |
+ } |
+} |
- base::Value::Type orig_type = default_value->GetType(); |
- DCHECK(orig_type != Value::TYPE_NULL && orig_type != Value::TYPE_BINARY) << |
- "invalid preference type: " << orig_type; |
+// TODO(joi): Once MarkNeedsEmptyValue is gone, we can probably |
+// completely get rid of this method. There will be one difference in |
+// semantics; currently all registered preferences are stored right |
+// away in the prefs_map_, if we remove this they would be stored only |
+// opportunistically. |
+void PrefService::AddRegisteredPreference(const char* path, |
+ Value* default_value) { |
+ DCHECK(CalledOnValidThread()); |
// For ListValue and DictionaryValue with non empty default, empty value |
// for |path| needs to be persisted in |user_pref_store_|. So that |
// non empty default is not used when user sets an empty ListValue or |
// DictionaryValue. |
bool needs_empty_value = false; |
+ base::Value::Type orig_type = default_value->GetType(); |
if (orig_type == base::Value::TYPE_LIST) { |
const base::ListValue* list = NULL; |
if (default_value->GetAsList(&list) && !list->empty()) |
@@ -329,20 +354,14 @@ 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()); |
} |
-void PrefService::UnregisterPreference(const char* path) { |
+// TODO(joi): We can get rid of this once the ability to unregister |
+// prefs has been removed. |
+void PrefService::RemoveRegisteredPreference(const char* path) { |
DCHECK(CalledOnValidThread()); |
- PreferenceMap::iterator it = prefs_map_.find(path); |
- CHECK(it != prefs_map_.end()) << "Trying to unregister an unregistered pref: " |
- << path; |
- |
- prefs_map_.erase(it); |
- default_store_->RemoveDefaultValue(path); |
+ prefs_map_.erase(path); |
} |
void PrefService::ClearPref(const char* path) { |
@@ -561,16 +580,18 @@ bool PrefService::Preference::IsExtensionModifiable() const { |
const base::Value* PrefService::GetPreferenceValue( |
const std::string& path) const { |
DCHECK(CalledOnValidThread()); |
- const base::Value::Type type = default_store_->GetType(path); |
- if (type == Value::TYPE_NULL) |
- return NULL; |
- const Value* found_value = NULL; |
- if (pref_value_store_->GetValue(path, type, &found_value)) { |
- DCHECK(found_value->IsType(type)); |
- return found_value; |
+ const Value* default_value = NULL; |
+ if (pref_registry_->defaults()->GetValue(path, &default_value)) { |
+ const Value* found_value = NULL; |
+ base::Value::Type default_type = default_value->GetType(); |
+ if (pref_value_store_->GetValue(path, default_type, &found_value)) { |
+ DCHECK(found_value->IsType(default_type)); |
+ return found_value; |
+ } else { |
+ // Every registered preference has at least a default value. |
+ NOTREACHED() << "no valid value found for registered pref " << path; |
+ } |
} |
- // Every registered preference has at least a default value. |
- NOTREACHED() << "no valid value found for registered pref " << path; |
return NULL; |
} |