Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/prefs/pref_service_syncable.h" | 5 #include "chrome/browser/prefs/pref_service_syncable.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/prefs/default_pref_store.h" | 9 #include "base/prefs/default_pref_store.h" |
| 10 #include "base/prefs/overlay_user_pref_store.h" | 10 #include "base/prefs/overlay_user_pref_store.h" |
| 11 #include "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
| 12 #include "base/value_conversions.h" | 12 #include "base/value_conversions.h" |
| 13 #include "chrome/browser/prefs/pref_model_associator.h" | 13 #include "chrome/browser/prefs/pref_model_associator.h" |
| 14 #include "chrome/browser/prefs/pref_notifier_impl.h" | 14 #include "chrome/browser/prefs/pref_notifier_impl.h" |
| 15 #include "chrome/browser/prefs/pref_registry.h" | 15 #include "chrome/browser/prefs/pref_registry.h" |
| 16 #include "chrome/browser/prefs/pref_registry_simple.h" | 16 #include "chrome/browser/prefs/pref_registry_syncable.h" |
| 17 #include "chrome/browser/prefs/pref_service_syncable_observer.h" | 17 #include "chrome/browser/prefs/pref_service_syncable_observer.h" |
| 18 #include "chrome/browser/prefs/pref_value_store.h" | 18 #include "chrome/browser/prefs/pref_value_store.h" |
| 19 #include "chrome/browser/profiles/profile.h" | |
| 19 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" | 20 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
| 20 #include "ui/base/l10n/l10n_util.h" | |
| 21 | 21 |
| 22 namespace { | 22 // static |
| 23 | 23 PrefServiceSyncable* PrefServiceSyncable::FromProfile(Profile* profile) { |
| 24 // A helper function for RegisterLocalized*Pref that creates a Value* | 24 return static_cast<PrefServiceSyncable*>(profile->GetPrefs()); |
| 25 // based on a localized resource. Because we control the values in a | |
| 26 // locale dll, this should always return a Value of the appropriate | |
| 27 // type. | |
| 28 Value* CreateLocaleDefaultValue(base::Value::Type type, | |
| 29 int message_id) { | |
| 30 const std::string& resource_string = l10n_util::GetStringUTF8(message_id); | |
| 31 DCHECK(!resource_string.empty()); | |
| 32 switch (type) { | |
| 33 case Value::TYPE_BOOLEAN: { | |
| 34 if ("true" == resource_string) | |
| 35 return Value::CreateBooleanValue(true); | |
| 36 if ("false" == resource_string) | |
| 37 return Value::CreateBooleanValue(false); | |
| 38 break; | |
| 39 } | |
| 40 | |
| 41 case Value::TYPE_INTEGER: { | |
| 42 int val; | |
| 43 base::StringToInt(resource_string, &val); | |
| 44 return Value::CreateIntegerValue(val); | |
| 45 } | |
| 46 | |
| 47 case Value::TYPE_DOUBLE: { | |
| 48 double val; | |
| 49 base::StringToDouble(resource_string, &val); | |
| 50 return Value::CreateDoubleValue(val); | |
| 51 } | |
| 52 | |
| 53 case Value::TYPE_STRING: { | |
| 54 return Value::CreateStringValue(resource_string); | |
| 55 } | |
| 56 | |
| 57 default: { | |
| 58 NOTREACHED() << | |
| 59 "list and dictionary types cannot have default locale values"; | |
| 60 } | |
| 61 } | |
| 62 NOTREACHED(); | |
| 63 return Value::CreateNullValue(); | |
| 64 } | 25 } |
| 65 | 26 |
| 66 } // namespace | 27 // static |
| 28 PrefServiceSyncable* PrefServiceSyncable::IncognitoFromProfile( | |
| 29 Profile* profile) { | |
| 30 return static_cast<PrefServiceSyncable*>(profile->GetOffTheRecordPrefs()); | |
| 31 } | |
| 67 | 32 |
| 68 PrefServiceSyncable::PrefServiceSyncable( | 33 PrefServiceSyncable::PrefServiceSyncable( |
| 69 PrefNotifierImpl* pref_notifier, | 34 PrefNotifierImpl* pref_notifier, |
| 70 PrefValueStore* pref_value_store, | 35 PrefValueStore* pref_value_store, |
| 71 PersistentPrefStore* user_prefs, | 36 PersistentPrefStore* user_prefs, |
| 72 PrefRegistry* pref_registry, | 37 PrefRegistrySyncable* pref_registry, |
| 73 base::Callback<void(PersistentPrefStore::PrefReadError)> | 38 base::Callback<void(PersistentPrefStore::PrefReadError)> |
| 74 read_error_callback, | 39 read_error_callback, |
| 75 bool async) | 40 bool async) |
| 76 : PrefService(pref_notifier, | 41 : PrefService(pref_notifier, |
| 77 pref_value_store, | 42 pref_value_store, |
| 78 user_prefs, | 43 user_prefs, |
| 79 pref_registry, | 44 pref_registry, |
| 80 read_error_callback, | 45 read_error_callback, |
| 81 async) { | 46 async) { |
| 82 pref_sync_associator_.SetPrefService(this); | 47 pref_sync_associator_.SetPrefService(this); |
| 83 | 48 |
| 49 // Let PrefModelAssociator know about changes to preference values. | |
| 84 pref_value_store->set_callback( | 50 pref_value_store->set_callback( |
| 85 base::Bind(&PrefModelAssociator::ProcessPrefChange, | 51 base::Bind(&PrefModelAssociator::ProcessPrefChange, |
| 86 base::Unretained(&pref_sync_associator_))); | 52 base::Unretained(&pref_sync_associator_))); |
| 53 | |
| 54 // Add already-registered syncable preferences to PrefModelAssociator. | |
| 55 const std::set<std::string>& syncable_preferences = | |
| 56 pref_registry->syncable_preferences(); | |
| 57 for (std::set<std::string>::const_iterator it = syncable_preferences.begin(); | |
| 58 it != syncable_preferences.end(); | |
| 59 ++it) { | |
| 60 AddRegisteredSyncablePreference(it->c_str()); | |
| 61 } | |
| 62 | |
| 63 // Watch for syncable preferences registered after this point. | |
| 64 pref_registry->SetSyncableRegistrationCallback( | |
| 65 base::Bind(&PrefServiceSyncable::AddRegisteredSyncablePreference, | |
| 66 base::Unretained(this))); | |
| 87 } | 67 } |
| 88 | 68 |
| 89 PrefServiceSyncable::~PrefServiceSyncable() {} | 69 PrefServiceSyncable::~PrefServiceSyncable() { |
| 70 // Remove our callback from the registry, since it may outlive us. | |
| 71 PrefRegistrySyncable* registry = | |
| 72 static_cast<PrefRegistrySyncable*>(pref_registry_.get()); | |
| 73 registry->SetSyncableRegistrationCallback( | |
| 74 PrefRegistrySyncable::SyncableRegistrationCallback()); | |
| 75 } | |
| 90 | 76 |
| 91 PrefServiceSyncable* PrefServiceSyncable::CreateIncognitoPrefService( | 77 PrefServiceSyncable* PrefServiceSyncable::CreateIncognitoPrefService( |
| 92 PrefStore* incognito_extension_prefs) { | 78 PrefStore* incognito_extension_prefs) { |
| 93 pref_service_forked_ = true; | 79 pref_service_forked_ = true; |
| 94 PrefNotifierImpl* pref_notifier = new PrefNotifierImpl(); | 80 PrefNotifierImpl* pref_notifier = new PrefNotifierImpl(); |
| 95 OverlayUserPrefStore* incognito_pref_store = | 81 OverlayUserPrefStore* incognito_pref_store = |
| 96 new OverlayUserPrefStore(user_pref_store_.get()); | 82 new OverlayUserPrefStore(user_pref_store_.get()); |
| 97 PrefsTabHelper::InitIncognitoUserPrefStore(incognito_pref_store); | 83 PrefsTabHelper::InitIncognitoUserPrefStore(incognito_pref_store); |
| 98 | 84 |
| 99 // For the incognito service, we need a registry that shares the | 85 scoped_refptr<PrefRegistrySyncable> forked_registry = |
| 100 // same default prefs, but does not interfere with callbacks on | 86 static_cast<PrefRegistrySyncable*>( |
| 101 // registration/unregistration made to the main service, or allow | 87 pref_registry_.get())->ForkForIncognito(); |
| 102 // any registrations. | |
| 103 // | |
| 104 // TODO(joi): We can directly reuse the same PrefRegistry once | |
| 105 // PrefService no longer registers for callbacks on registration and | |
| 106 // unregistration. | |
| 107 scoped_refptr<PrefRegistry> incognito_registry = new PrefRegistry; | |
| 108 incognito_registry->defaults_ = pref_registry_->defaults_; | |
| 109 | |
| 110 PrefServiceSyncable* incognito_service = new PrefServiceSyncable( | 88 PrefServiceSyncable* incognito_service = new PrefServiceSyncable( |
| 111 pref_notifier, | 89 pref_notifier, |
| 112 pref_value_store_->CloneAndSpecialize( | 90 pref_value_store_->CloneAndSpecialize( |
| 113 NULL, // managed | 91 NULL, // managed |
| 114 incognito_extension_prefs, | 92 incognito_extension_prefs, |
| 115 NULL, // command_line_prefs | 93 NULL, // command_line_prefs |
| 116 incognito_pref_store, | 94 incognito_pref_store, |
| 117 NULL, // recommended | 95 NULL, // recommended |
| 118 incognito_registry->defaults(), | 96 forked_registry->defaults(), |
| 119 pref_notifier), | 97 pref_notifier), |
| 120 incognito_pref_store, | 98 incognito_pref_store, |
| 121 incognito_registry, | 99 forked_registry, |
| 122 read_error_callback_, | 100 read_error_callback_, |
| 123 false); | 101 false); |
| 124 return incognito_service; | 102 return incognito_service; |
| 125 } | 103 } |
| 126 | 104 |
| 127 bool PrefServiceSyncable::IsSyncing() { | 105 bool PrefServiceSyncable::IsSyncing() { |
| 128 return pref_sync_associator_.models_associated(); | 106 return pref_sync_associator_.models_associated(); |
| 129 } | 107 } |
| 130 | 108 |
| 131 void PrefServiceSyncable::AddObserver(PrefServiceSyncableObserver* observer) { | 109 void PrefServiceSyncable::AddObserver(PrefServiceSyncableObserver* observer) { |
| 132 observer_list_.AddObserver(observer); | 110 observer_list_.AddObserver(observer); |
| 133 } | 111 } |
| 134 | 112 |
| 135 void PrefServiceSyncable::RemoveObserver( | 113 void PrefServiceSyncable::RemoveObserver( |
| 136 PrefServiceSyncableObserver* observer) { | 114 PrefServiceSyncableObserver* observer) { |
| 137 observer_list_.RemoveObserver(observer); | 115 observer_list_.RemoveObserver(observer); |
| 138 } | 116 } |
| 139 | 117 |
| 140 void PrefServiceSyncable::UnregisterPreference(const char* path) { | |
| 141 // TODO(joi): Temporary until we have PrefRegistrySyncable. | |
| 142 static_cast<PrefRegistrySimple*>( | |
| 143 DeprecatedGetPrefRegistry())->DeprecatedUnregisterPreference(path); | |
| 144 | |
| 145 if (pref_sync_associator_.IsPrefRegistered(path)) { | |
| 146 pref_sync_associator_.UnregisterPref(path); | |
| 147 } | |
| 148 } | |
| 149 | |
| 150 void PrefServiceSyncable::RegisterBooleanPref(const char* path, | |
| 151 bool default_value, | |
| 152 PrefSyncStatus sync_status) { | |
| 153 RegisterSyncablePreference(path, | |
| 154 Value::CreateBooleanValue(default_value), | |
| 155 sync_status); | |
| 156 } | |
| 157 | |
| 158 void PrefServiceSyncable::RegisterIntegerPref(const char* path, | |
| 159 int default_value, | |
| 160 PrefSyncStatus sync_status) { | |
| 161 RegisterSyncablePreference(path, | |
| 162 Value::CreateIntegerValue(default_value), | |
| 163 sync_status); | |
| 164 } | |
| 165 | |
| 166 void PrefServiceSyncable::RegisterDoublePref(const char* path, | |
| 167 double default_value, | |
| 168 PrefSyncStatus sync_status) { | |
| 169 RegisterSyncablePreference(path, | |
| 170 Value::CreateDoubleValue(default_value), | |
| 171 sync_status); | |
| 172 } | |
| 173 | |
| 174 void PrefServiceSyncable::RegisterStringPref(const char* path, | |
| 175 const std::string& default_value, | |
| 176 PrefSyncStatus sync_status) { | |
| 177 RegisterSyncablePreference(path, | |
| 178 Value::CreateStringValue(default_value), | |
| 179 sync_status); | |
| 180 } | |
| 181 | |
| 182 void PrefServiceSyncable::RegisterFilePathPref(const char* path, | |
| 183 const FilePath& default_value, | |
| 184 PrefSyncStatus sync_status) { | |
| 185 RegisterSyncablePreference(path, | |
| 186 Value::CreateStringValue(default_value.value()), | |
| 187 sync_status); | |
| 188 } | |
| 189 | |
| 190 void PrefServiceSyncable::RegisterListPref(const char* path, | |
| 191 PrefSyncStatus sync_status) { | |
| 192 RegisterSyncablePreference(path, new ListValue(), sync_status); | |
| 193 } | |
| 194 | |
| 195 void PrefServiceSyncable::RegisterListPref(const char* path, | |
| 196 ListValue* default_value, | |
| 197 PrefSyncStatus sync_status) { | |
| 198 RegisterSyncablePreference(path, default_value, sync_status); | |
| 199 } | |
| 200 | |
| 201 void PrefServiceSyncable::RegisterDictionaryPref(const char* path, | |
| 202 PrefSyncStatus sync_status) { | |
| 203 RegisterSyncablePreference(path, new DictionaryValue(), sync_status); | |
| 204 } | |
| 205 | |
| 206 void PrefServiceSyncable::RegisterDictionaryPref(const char* path, | |
| 207 DictionaryValue* default_value, | |
| 208 PrefSyncStatus sync_status) { | |
| 209 RegisterSyncablePreference(path, default_value, sync_status); | |
| 210 } | |
| 211 | |
| 212 void PrefServiceSyncable::RegisterLocalizedBooleanPref( | |
| 213 const char* path, | |
| 214 int locale_default_message_id, | |
| 215 PrefSyncStatus sync_status) { | |
| 216 RegisterSyncablePreference( | |
| 217 path, | |
| 218 CreateLocaleDefaultValue(Value::TYPE_BOOLEAN, locale_default_message_id), | |
| 219 sync_status); | |
| 220 } | |
| 221 | |
| 222 void PrefServiceSyncable::RegisterLocalizedIntegerPref( | |
| 223 const char* path, | |
| 224 int locale_default_message_id, | |
| 225 PrefSyncStatus sync_status) { | |
| 226 RegisterSyncablePreference( | |
| 227 path, | |
| 228 CreateLocaleDefaultValue(Value::TYPE_INTEGER, locale_default_message_id), | |
| 229 sync_status); | |
| 230 } | |
| 231 | |
| 232 void PrefServiceSyncable::RegisterLocalizedDoublePref( | |
| 233 const char* path, | |
| 234 int locale_default_message_id, | |
| 235 PrefSyncStatus sync_status) { | |
| 236 RegisterSyncablePreference( | |
| 237 path, | |
| 238 CreateLocaleDefaultValue(Value::TYPE_DOUBLE, locale_default_message_id), | |
| 239 sync_status); | |
| 240 } | |
| 241 | |
| 242 void PrefServiceSyncable::RegisterLocalizedStringPref( | |
| 243 const char* path, | |
| 244 int locale_default_message_id, | |
| 245 PrefSyncStatus sync_status) { | |
| 246 RegisterSyncablePreference( | |
| 247 path, | |
| 248 CreateLocaleDefaultValue(Value::TYPE_STRING, locale_default_message_id), | |
| 249 sync_status); | |
| 250 } | |
| 251 | |
| 252 void PrefServiceSyncable::RegisterInt64Pref( | |
| 253 const char* path, | |
| 254 int64 default_value, | |
| 255 PrefSyncStatus sync_status) { | |
| 256 RegisterSyncablePreference( | |
| 257 path, | |
| 258 Value::CreateStringValue(base::Int64ToString(default_value)), | |
| 259 sync_status); | |
| 260 } | |
| 261 | |
| 262 void PrefServiceSyncable::RegisterUint64Pref( | |
| 263 const char* path, | |
| 264 uint64 default_value, | |
| 265 PrefSyncStatus sync_status) { | |
| 266 RegisterSyncablePreference( | |
| 267 path, | |
| 268 Value::CreateStringValue(base::Uint64ToString(default_value)), | |
| 269 sync_status); | |
| 270 } | |
| 271 | |
| 272 syncer::SyncableService* PrefServiceSyncable::GetSyncableService() { | 118 syncer::SyncableService* PrefServiceSyncable::GetSyncableService() { |
| 273 return &pref_sync_associator_; | 119 return &pref_sync_associator_; |
| 274 } | 120 } |
| 275 | 121 |
| 276 void PrefServiceSyncable::UpdateCommandLinePrefStore( | 122 void PrefServiceSyncable::UpdateCommandLinePrefStore( |
| 277 PrefStore* cmd_line_store) { | 123 PrefStore* cmd_line_store) { |
| 278 // If |pref_service_forked_| is true, then this PrefService and the forked | 124 // If |pref_service_forked_| is true, then this PrefService and the forked |
| 279 // copies will be out of sync. | 125 // copies will be out of sync. |
| 280 DCHECK(!pref_service_forked_); | 126 DCHECK(!pref_service_forked_); |
| 281 PrefService::UpdateCommandLinePrefStore(cmd_line_store); | 127 PrefService::UpdateCommandLinePrefStore(cmd_line_store); |
| 282 } | 128 } |
| 283 | 129 |
| 130 void PrefServiceSyncable::AddRegisteredSyncablePreference(const char* path) { | |
| 131 DCHECK(FindPreference(path)); | |
| 132 pref_sync_associator_.RegisterPref(path); | |
| 133 } | |
| 134 | |
| 135 void PrefServiceSyncable::RemoveRegisteredPreference(const char* path) { | |
| 136 PrefService::RemoveRegisteredPreference(path); | |
| 137 | |
| 138 if (pref_sync_associator_.IsPrefRegistered(path)) { | |
|
Mattias Nissler (ping if slow)
2013/02/06 17:53:33
nit: no curlies required
Jói
2013/02/07 14:52:32
Done.
| |
| 139 pref_sync_associator_.UnregisterPref(path); | |
| 140 } | |
| 141 } | |
| 142 | |
| 284 void PrefServiceSyncable::OnIsSyncingChanged() { | 143 void PrefServiceSyncable::OnIsSyncingChanged() { |
| 285 FOR_EACH_OBSERVER(PrefServiceSyncableObserver, observer_list_, | 144 FOR_EACH_OBSERVER(PrefServiceSyncableObserver, observer_list_, |
| 286 OnIsSyncingChanged()); | 145 OnIsSyncingChanged()); |
| 287 } | 146 } |
| 288 | |
| 289 void PrefServiceSyncable::RegisterSyncablePreference( | |
| 290 const char* path, Value* default_value, PrefSyncStatus sync_status) { | |
| 291 // TODO(joi): Temporary until we have PrefRegistrySyncable. | |
| 292 static_cast<PrefRegistrySimple*>( | |
| 293 DeprecatedGetPrefRegistry())->RegisterPreference(path, default_value); | |
| 294 // Register with sync if necessary. | |
| 295 if (sync_status == SYNCABLE_PREF) | |
| 296 pref_sync_associator_.RegisterPref(path); | |
| 297 } | |
| OLD | NEW |