Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(765)

Unified Diff: chrome/browser/prefs/pref_service.cc

Issue 11741003: Remove PrefServiceSimple, replacing it with PrefService and PrefRegistrySimple. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix double registration in Chrome Frame test. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/prefs/pref_service.h ('k') | chrome/browser/prefs/pref_service_builder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « chrome/browser/prefs/pref_service.h ('k') | chrome/browser/prefs/pref_service_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698