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/strings/string_number_conversions.h" | 11 #include "base/strings/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( | |
183 const char* path, | |
184 const base::FilePath& default_value, | |
185 PrefSyncStatus sync_status) { | |
186 RegisterSyncablePreference(path, | |
187 Value::CreateStringValue(default_value.value()), | |
188 sync_status); | |
189 } | |
190 | |
191 void PrefServiceSyncable::RegisterListPref(const char* path, | |
192 PrefSyncStatus sync_status) { | |
193 RegisterSyncablePreference(path, new ListValue(), sync_status); | |
194 } | |
195 | |
196 void PrefServiceSyncable::RegisterListPref(const char* path, | |
197 ListValue* default_value, | |
198 PrefSyncStatus sync_status) { | |
199 RegisterSyncablePreference(path, default_value, sync_status); | |
200 } | |
201 | |
202 void PrefServiceSyncable::RegisterDictionaryPref(const char* path, | |
203 PrefSyncStatus sync_status) { | |
204 RegisterSyncablePreference(path, new DictionaryValue(), sync_status); | |
205 } | |
206 | |
207 void PrefServiceSyncable::RegisterDictionaryPref(const char* path, | |
208 DictionaryValue* default_value, | |
209 PrefSyncStatus sync_status) { | |
210 RegisterSyncablePreference(path, default_value, sync_status); | |
211 } | |
212 | |
213 void PrefServiceSyncable::RegisterLocalizedBooleanPref( | |
214 const char* path, | |
215 int locale_default_message_id, | |
216 PrefSyncStatus sync_status) { | |
217 RegisterSyncablePreference( | |
218 path, | |
219 CreateLocaleDefaultValue(Value::TYPE_BOOLEAN, locale_default_message_id), | |
220 sync_status); | |
221 } | |
222 | |
223 void PrefServiceSyncable::RegisterLocalizedIntegerPref( | |
224 const char* path, | |
225 int locale_default_message_id, | |
226 PrefSyncStatus sync_status) { | |
227 RegisterSyncablePreference( | |
228 path, | |
229 CreateLocaleDefaultValue(Value::TYPE_INTEGER, locale_default_message_id), | |
230 sync_status); | |
231 } | |
232 | |
233 void PrefServiceSyncable::RegisterLocalizedDoublePref( | |
234 const char* path, | |
235 int locale_default_message_id, | |
236 PrefSyncStatus sync_status) { | |
237 RegisterSyncablePreference( | |
238 path, | |
239 CreateLocaleDefaultValue(Value::TYPE_DOUBLE, locale_default_message_id), | |
240 sync_status); | |
241 } | |
242 | |
243 void PrefServiceSyncable::RegisterLocalizedStringPref( | |
244 const char* path, | |
245 int locale_default_message_id, | |
246 PrefSyncStatus sync_status) { | |
247 RegisterSyncablePreference( | |
248 path, | |
249 CreateLocaleDefaultValue(Value::TYPE_STRING, locale_default_message_id), | |
250 sync_status); | |
251 } | |
252 | |
253 void PrefServiceSyncable::RegisterInt64Pref( | |
254 const char* path, | |
255 int64 default_value, | |
256 PrefSyncStatus sync_status) { | |
257 RegisterSyncablePreference( | |
258 path, | |
259 Value::CreateStringValue(base::Int64ToString(default_value)), | |
260 sync_status); | |
261 } | |
262 | |
263 void PrefServiceSyncable::RegisterUint64Pref( | |
264 const char* path, | |
265 uint64 default_value, | |
266 PrefSyncStatus sync_status) { | |
267 RegisterSyncablePreference( | |
268 path, | |
269 Value::CreateStringValue(base::Uint64ToString(default_value)), | |
270 sync_status); | |
271 } | |
272 | |
273 syncer::SyncableService* PrefServiceSyncable::GetSyncableService() { | 118 syncer::SyncableService* PrefServiceSyncable::GetSyncableService() { |
274 return &pref_sync_associator_; | 119 return &pref_sync_associator_; |
275 } | 120 } |
276 | 121 |
277 void PrefServiceSyncable::UpdateCommandLinePrefStore( | 122 void PrefServiceSyncable::UpdateCommandLinePrefStore( |
278 PrefStore* cmd_line_store) { | 123 PrefStore* cmd_line_store) { |
279 // 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 |
280 // copies will be out of sync. | 125 // copies will be out of sync. |
281 DCHECK(!pref_service_forked_); | 126 DCHECK(!pref_service_forked_); |
282 PrefService::UpdateCommandLinePrefStore(cmd_line_store); | 127 PrefService::UpdateCommandLinePrefStore(cmd_line_store); |
283 } | 128 } |
284 | 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)) |
| 139 pref_sync_associator_.UnregisterPref(path); |
| 140 } |
| 141 |
285 void PrefServiceSyncable::OnIsSyncingChanged() { | 142 void PrefServiceSyncable::OnIsSyncingChanged() { |
286 FOR_EACH_OBSERVER(PrefServiceSyncableObserver, observer_list_, | 143 FOR_EACH_OBSERVER(PrefServiceSyncableObserver, observer_list_, |
287 OnIsSyncingChanged()); | 144 OnIsSyncingChanged()); |
288 } | 145 } |
289 | |
290 void PrefServiceSyncable::RegisterSyncablePreference( | |
291 const char* path, Value* default_value, PrefSyncStatus sync_status) { | |
292 // TODO(joi): Temporary until we have PrefRegistrySyncable. | |
293 static_cast<PrefRegistrySimple*>( | |
294 DeprecatedGetPrefRegistry())->RegisterPreference(path, default_value); | |
295 // Register with sync if necessary. | |
296 if (sync_status == SYNCABLE_PREF) | |
297 pref_sync_associator_.RegisterPref(path); | |
298 } | |
OLD | NEW |