| 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/ui/prefs/prefs_tab_helper.h" | 19 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
| 20 #include "ui/base/l10n/l10n_util.h" | |
| 21 | |
| 22 namespace { | |
| 23 | |
| 24 // A helper function for RegisterLocalized*Pref that creates a Value* | |
| 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 } | |
| 65 | |
| 66 } // namespace | |
| 67 | 20 |
| 68 PrefServiceSyncable::PrefServiceSyncable( | 21 PrefServiceSyncable::PrefServiceSyncable( |
| 69 PrefNotifierImpl* pref_notifier, | 22 PrefNotifierImpl* pref_notifier, |
| 70 PrefValueStore* pref_value_store, | 23 PrefValueStore* pref_value_store, |
| 71 PersistentPrefStore* user_prefs, | 24 PersistentPrefStore* user_prefs, |
| 72 PrefRegistry* pref_registry, | 25 PrefRegistrySyncable* pref_registry, |
| 73 base::Callback<void(PersistentPrefStore::PrefReadError)> | 26 base::Callback<void(PersistentPrefStore::PrefReadError)> |
| 74 read_error_callback, | 27 read_error_callback, |
| 75 bool async) | 28 bool async) |
| 76 : PrefService(pref_notifier, | 29 : PrefService(pref_notifier, |
| 77 pref_value_store, | 30 pref_value_store, |
| 78 user_prefs, | 31 user_prefs, |
| 79 pref_registry, | 32 pref_registry, |
| 80 read_error_callback, | 33 read_error_callback, |
| 81 async) { | 34 async) { |
| 82 pref_sync_associator_.SetPrefService(this); | 35 pref_sync_associator_.SetPrefService(this); |
| 83 | 36 |
| 84 pref_value_store->set_callback( | 37 pref_value_store->set_callback( |
| 85 base::Bind(&PrefModelAssociator::ProcessPrefChange, | 38 base::Bind(&PrefModelAssociator::ProcessPrefChange, |
| 86 base::Unretained(&pref_sync_associator_))); | 39 base::Unretained(&pref_sync_associator_))); |
| 40 |
| 41 pref_registry->SetSyncableRegistrationCallback( |
| 42 base::Bind(&PrefServiceSyncable::AddRegisteredSyncablePreference, |
| 43 base::Unretained(this))); |
| 87 } | 44 } |
| 88 | 45 |
| 89 PrefServiceSyncable::~PrefServiceSyncable() {} | 46 PrefServiceSyncable::~PrefServiceSyncable() { |
| 47 // Remove our callback from the registry, since it may outlive us. |
| 48 PrefRegistrySyncable* registry = |
| 49 static_cast<PrefRegistrySyncable*>(pref_registry_.get()); |
| 50 registry->SetSyncableRegistrationCallback( |
| 51 PrefRegistrySyncable::SyncableRegistrationCallback()); |
| 52 } |
| 90 | 53 |
| 91 PrefServiceSyncable* PrefServiceSyncable::CreateIncognitoPrefService( | 54 PrefServiceSyncable* PrefServiceSyncable::CreateIncognitoPrefService( |
| 92 PrefStore* incognito_extension_prefs) { | 55 PrefStore* incognito_extension_prefs) { |
| 93 pref_service_forked_ = true; | 56 pref_service_forked_ = true; |
| 94 PrefNotifierImpl* pref_notifier = new PrefNotifierImpl(); | 57 PrefNotifierImpl* pref_notifier = new PrefNotifierImpl(); |
| 95 OverlayUserPrefStore* incognito_pref_store = | 58 OverlayUserPrefStore* incognito_pref_store = |
| 96 new OverlayUserPrefStore(user_pref_store_.get()); | 59 new OverlayUserPrefStore(user_pref_store_.get()); |
| 97 PrefsTabHelper::InitIncognitoUserPrefStore(incognito_pref_store); | 60 PrefsTabHelper::InitIncognitoUserPrefStore(incognito_pref_store); |
| 98 | 61 |
| 99 // For the incognito service, we need a registry that shares the | 62 // For the incognito service, we need a registry that shares the |
| 100 // same default prefs, but does not interfere with callbacks on | 63 // same default prefs, but does not interfere with callbacks on |
| 101 // registration/unregistration made to the main service, or allow | 64 // registration/unregistration made to the main service, or allow |
| 102 // any registrations. | 65 // any registrations. |
| 103 // | 66 // |
| 104 // TODO(joi): We can directly reuse the same PrefRegistry once | 67 // TODO(joi): We can directly reuse the same PrefRegistry once |
| 105 // PrefService no longer registers for callbacks on registration and | 68 // PrefService no longer registers for callbacks on registration and |
| 106 // unregistration. | 69 // unregistration. |
| 107 scoped_refptr<PrefRegistry> incognito_registry = new PrefRegistry; | 70 scoped_refptr<PrefRegistrySyncable> incognito_registry = |
| 71 new PrefRegistrySyncable(); |
| 108 incognito_registry->defaults_ = pref_registry_->defaults_; | 72 incognito_registry->defaults_ = pref_registry_->defaults_; |
| 109 | 73 |
| 110 PrefServiceSyncable* incognito_service = new PrefServiceSyncable( | 74 PrefServiceSyncable* incognito_service = new PrefServiceSyncable( |
| 111 pref_notifier, | 75 pref_notifier, |
| 112 pref_value_store_->CloneAndSpecialize( | 76 pref_value_store_->CloneAndSpecialize( |
| 113 NULL, // managed | 77 NULL, // managed |
| 114 incognito_extension_prefs, | 78 incognito_extension_prefs, |
| 115 NULL, // command_line_prefs | 79 NULL, // command_line_prefs |
| 116 incognito_pref_store, | 80 incognito_pref_store, |
| 117 NULL, // recommended | 81 NULL, // recommended |
| (...skipping 12 matching lines...) Expand all Loading... |
| 130 | 94 |
| 131 void PrefServiceSyncable::AddObserver(PrefServiceSyncableObserver* observer) { | 95 void PrefServiceSyncable::AddObserver(PrefServiceSyncableObserver* observer) { |
| 132 observer_list_.AddObserver(observer); | 96 observer_list_.AddObserver(observer); |
| 133 } | 97 } |
| 134 | 98 |
| 135 void PrefServiceSyncable::RemoveObserver( | 99 void PrefServiceSyncable::RemoveObserver( |
| 136 PrefServiceSyncableObserver* observer) { | 100 PrefServiceSyncableObserver* observer) { |
| 137 observer_list_.RemoveObserver(observer); | 101 observer_list_.RemoveObserver(observer); |
| 138 } | 102 } |
| 139 | 103 |
| 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() { | 104 syncer::SyncableService* PrefServiceSyncable::GetSyncableService() { |
| 273 return &pref_sync_associator_; | 105 return &pref_sync_associator_; |
| 274 } | 106 } |
| 275 | 107 |
| 276 void PrefServiceSyncable::UpdateCommandLinePrefStore( | 108 void PrefServiceSyncable::UpdateCommandLinePrefStore( |
| 277 PrefStore* cmd_line_store) { | 109 PrefStore* cmd_line_store) { |
| 278 // If |pref_service_forked_| is true, then this PrefService and the forked | 110 // If |pref_service_forked_| is true, then this PrefService and the forked |
| 279 // copies will be out of sync. | 111 // copies will be out of sync. |
| 280 DCHECK(!pref_service_forked_); | 112 DCHECK(!pref_service_forked_); |
| 281 PrefService::UpdateCommandLinePrefStore(cmd_line_store); | 113 PrefService::UpdateCommandLinePrefStore(cmd_line_store); |
| 282 } | 114 } |
| 283 | 115 |
| 116 void PrefServiceSyncable::AddRegisteredSyncablePreference(const char* path) { |
| 117 DCHECK(FindPreference(path)); |
| 118 pref_sync_associator_.RegisterPref(path); |
| 119 } |
| 120 |
| 121 void PrefServiceSyncable::RemoveRegisteredPreference(const char* path) { |
| 122 PrefService::RemoveRegisteredPreference(path); |
| 123 |
| 124 if (pref_sync_associator_.IsPrefRegistered(path)) { |
| 125 pref_sync_associator_.UnregisterPref(path); |
| 126 } |
| 127 } |
| 128 |
| 284 void PrefServiceSyncable::OnIsSyncingChanged() { | 129 void PrefServiceSyncable::OnIsSyncingChanged() { |
| 285 FOR_EACH_OBSERVER(PrefServiceSyncableObserver, observer_list_, | 130 FOR_EACH_OBSERVER(PrefServiceSyncableObserver, observer_list_, |
| 286 OnIsSyncingChanged()); | 131 OnIsSyncingChanged()); |
| 287 } | 132 } |
| 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 |