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 |