| 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);
|
| -}
|
|
|