Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(397)

Side by Side Diff: chrome/browser/prefs/pref_service_syncable.cc

Issue 12079097: Introduce PrefRegistrySyncable, simplifying PrefServiceSyncable. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698