Index: chrome/browser/prefs/pref_service_syncable.cc |
diff --git a/chrome/browser/prefs/pref_service_syncable.cc b/chrome/browser/prefs/pref_service_syncable.cc |
index cfa66b7e43b67fb63d090f0ecae57976f20f781d..d6fe226d0c0a7ff530e59a2634d750e0978baea0 100644 |
--- a/chrome/browser/prefs/pref_service_syncable.cc |
+++ b/chrome/browser/prefs/pref_service_syncable.cc |
@@ -13,63 +13,28 @@ |
#include "chrome/browser/prefs/pref_model_associator.h" |
#include "chrome/browser/prefs/pref_notifier_impl.h" |
#include "chrome/browser/prefs/pref_registry.h" |
-#include "chrome/browser/prefs/pref_registry_simple.h" |
+#include "chrome/browser/prefs/pref_registry_syncable.h" |
#include "chrome/browser/prefs/pref_service_syncable_observer.h" |
#include "chrome/browser/prefs/pref_value_store.h" |
+#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
-#include "ui/base/l10n/l10n_util.h" |
-namespace { |
- |
-// A helper function for RegisterLocalized*Pref that creates a Value* |
-// based on a localized resource. Because we control the values in a |
-// locale dll, this should always return a Value of the appropriate |
-// type. |
-Value* CreateLocaleDefaultValue(base::Value::Type type, |
- int message_id) { |
- const std::string resource_string = l10n_util::GetStringUTF8(message_id); |
- DCHECK(!resource_string.empty()); |
- switch (type) { |
- case Value::TYPE_BOOLEAN: { |
- if ("true" == resource_string) |
- return Value::CreateBooleanValue(true); |
- if ("false" == resource_string) |
- return Value::CreateBooleanValue(false); |
- break; |
- } |
- |
- case Value::TYPE_INTEGER: { |
- int val; |
- base::StringToInt(resource_string, &val); |
- return Value::CreateIntegerValue(val); |
- } |
- |
- case Value::TYPE_DOUBLE: { |
- double val; |
- base::StringToDouble(resource_string, &val); |
- return Value::CreateDoubleValue(val); |
- } |
- |
- case Value::TYPE_STRING: { |
- return Value::CreateStringValue(resource_string); |
- } |
- |
- default: { |
- NOTREACHED() << |
- "list and dictionary types cannot have default locale values"; |
- } |
- } |
- NOTREACHED(); |
- return Value::CreateNullValue(); |
+// static |
+PrefServiceSyncable* PrefServiceSyncable::FromProfile(Profile* profile) { |
+ return static_cast<PrefServiceSyncable*>(profile->GetPrefs()); |
} |
-} // namespace |
+// static |
+PrefServiceSyncable* PrefServiceSyncable::IncognitoFromProfile( |
+ Profile* profile) { |
+ return static_cast<PrefServiceSyncable*>(profile->GetOffTheRecordPrefs()); |
+} |
PrefServiceSyncable::PrefServiceSyncable( |
PrefNotifierImpl* pref_notifier, |
PrefValueStore* pref_value_store, |
PersistentPrefStore* user_prefs, |
- PrefRegistry* pref_registry, |
+ PrefRegistrySyncable* pref_registry, |
base::Callback<void(PersistentPrefStore::PrefReadError)> |
read_error_callback, |
bool async) |
@@ -81,12 +46,33 @@ PrefServiceSyncable::PrefServiceSyncable( |
async) { |
pref_sync_associator_.SetPrefService(this); |
+ // Let PrefModelAssociator know about changes to preference values. |
pref_value_store->set_callback( |
base::Bind(&PrefModelAssociator::ProcessPrefChange, |
base::Unretained(&pref_sync_associator_))); |
+ |
+ // Add already-registered syncable preferences to PrefModelAssociator. |
+ const std::set<std::string>& syncable_preferences = |
+ pref_registry->syncable_preferences(); |
+ for (std::set<std::string>::const_iterator it = syncable_preferences.begin(); |
+ it != syncable_preferences.end(); |
+ ++it) { |
+ AddRegisteredSyncablePreference(it->c_str()); |
+ } |
+ |
+ // Watch for syncable preferences registered after this point. |
+ pref_registry->SetSyncableRegistrationCallback( |
+ base::Bind(&PrefServiceSyncable::AddRegisteredSyncablePreference, |
+ base::Unretained(this))); |
} |
-PrefServiceSyncable::~PrefServiceSyncable() {} |
+PrefServiceSyncable::~PrefServiceSyncable() { |
+ // Remove our callback from the registry, since it may outlive us. |
+ PrefRegistrySyncable* registry = |
+ static_cast<PrefRegistrySyncable*>(pref_registry_.get()); |
+ registry->SetSyncableRegistrationCallback( |
+ PrefRegistrySyncable::SyncableRegistrationCallback()); |
+} |
PrefServiceSyncable* PrefServiceSyncable::CreateIncognitoPrefService( |
PrefStore* incognito_extension_prefs) { |
@@ -96,17 +82,9 @@ PrefServiceSyncable* PrefServiceSyncable::CreateIncognitoPrefService( |
new OverlayUserPrefStore(user_pref_store_.get()); |
PrefsTabHelper::InitIncognitoUserPrefStore(incognito_pref_store); |
- // For the incognito service, we need a registry that shares the |
- // same default prefs, but does not interfere with callbacks on |
- // registration/unregistration made to the main service, or allow |
- // any registrations. |
- // |
- // TODO(joi): We can directly reuse the same PrefRegistry once |
- // PrefService no longer registers for callbacks on registration and |
- // unregistration. |
- scoped_refptr<PrefRegistry> incognito_registry = new PrefRegistry; |
- incognito_registry->defaults_ = pref_registry_->defaults_; |
- |
+ scoped_refptr<PrefRegistrySyncable> forked_registry = |
+ static_cast<PrefRegistrySyncable*>( |
+ pref_registry_.get())->ForkForIncognito(); |
PrefServiceSyncable* incognito_service = new PrefServiceSyncable( |
pref_notifier, |
pref_value_store_->CloneAndSpecialize( |
@@ -115,10 +93,10 @@ PrefServiceSyncable* PrefServiceSyncable::CreateIncognitoPrefService( |
NULL, // command_line_prefs |
incognito_pref_store, |
NULL, // recommended |
- incognito_registry->defaults(), |
+ forked_registry->defaults(), |
pref_notifier), |
incognito_pref_store, |
- incognito_registry, |
+ forked_registry, |
read_error_callback_, |
false); |
return incognito_service; |
@@ -137,139 +115,6 @@ void PrefServiceSyncable::RemoveObserver( |
observer_list_.RemoveObserver(observer); |
} |
-void PrefServiceSyncable::UnregisterPreference(const char* path) { |
- // TODO(joi): Temporary until we have PrefRegistrySyncable. |
- static_cast<PrefRegistrySimple*>( |
- DeprecatedGetPrefRegistry())->DeprecatedUnregisterPreference(path); |
- |
- if (pref_sync_associator_.IsPrefRegistered(path)) { |
- pref_sync_associator_.UnregisterPref(path); |
- } |
-} |
- |
-void PrefServiceSyncable::RegisterBooleanPref(const char* path, |
- bool default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, |
- Value::CreateBooleanValue(default_value), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterIntegerPref(const char* path, |
- int default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, |
- Value::CreateIntegerValue(default_value), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterDoublePref(const char* path, |
- double default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, |
- Value::CreateDoubleValue(default_value), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterStringPref(const char* path, |
- const std::string& default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, |
- Value::CreateStringValue(default_value), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterFilePathPref( |
- const char* path, |
- const base::FilePath& default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, |
- Value::CreateStringValue(default_value.value()), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterListPref(const char* path, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, new ListValue(), sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterListPref(const char* path, |
- ListValue* default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, default_value, sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterDictionaryPref(const char* path, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, new DictionaryValue(), sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterDictionaryPref(const char* path, |
- DictionaryValue* default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference(path, default_value, sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterLocalizedBooleanPref( |
- const char* path, |
- int locale_default_message_id, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference( |
- path, |
- CreateLocaleDefaultValue(Value::TYPE_BOOLEAN, locale_default_message_id), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterLocalizedIntegerPref( |
- const char* path, |
- int locale_default_message_id, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference( |
- path, |
- CreateLocaleDefaultValue(Value::TYPE_INTEGER, locale_default_message_id), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterLocalizedDoublePref( |
- const char* path, |
- int locale_default_message_id, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference( |
- path, |
- CreateLocaleDefaultValue(Value::TYPE_DOUBLE, locale_default_message_id), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterLocalizedStringPref( |
- const char* path, |
- int locale_default_message_id, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference( |
- path, |
- CreateLocaleDefaultValue(Value::TYPE_STRING, locale_default_message_id), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterInt64Pref( |
- const char* path, |
- int64 default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference( |
- path, |
- Value::CreateStringValue(base::Int64ToString(default_value)), |
- sync_status); |
-} |
- |
-void PrefServiceSyncable::RegisterUint64Pref( |
- const char* path, |
- uint64 default_value, |
- PrefSyncStatus sync_status) { |
- RegisterSyncablePreference( |
- path, |
- Value::CreateStringValue(base::Uint64ToString(default_value)), |
- sync_status); |
-} |
- |
syncer::SyncableService* PrefServiceSyncable::GetSyncableService() { |
return &pref_sync_associator_; |
} |
@@ -282,17 +127,19 @@ void PrefServiceSyncable::UpdateCommandLinePrefStore( |
PrefService::UpdateCommandLinePrefStore(cmd_line_store); |
} |
+void PrefServiceSyncable::AddRegisteredSyncablePreference(const char* path) { |
+ DCHECK(FindPreference(path)); |
+ pref_sync_associator_.RegisterPref(path); |
+} |
+ |
+void PrefServiceSyncable::RemoveRegisteredPreference(const char* path) { |
+ PrefService::RemoveRegisteredPreference(path); |
+ |
+ if (pref_sync_associator_.IsPrefRegistered(path)) |
+ pref_sync_associator_.UnregisterPref(path); |
+} |
+ |
void PrefServiceSyncable::OnIsSyncingChanged() { |
FOR_EACH_OBSERVER(PrefServiceSyncableObserver, observer_list_, |
OnIsSyncingChanged()); |
} |
- |
-void PrefServiceSyncable::RegisterSyncablePreference( |
- const char* path, Value* default_value, PrefSyncStatus sync_status) { |
- // TODO(joi): Temporary until we have PrefRegistrySyncable. |
- static_cast<PrefRegistrySimple*>( |
- DeprecatedGetPrefRegistry())->RegisterPreference(path, default_value); |
- // Register with sync if necessary. |
- if (sync_status == SYNCABLE_PREF) |
- pref_sync_associator_.RegisterPref(path); |
-} |