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 |