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

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: Merge to head again; base::File changes conflicted. 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/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 }
OLDNEW
« no previous file with comments | « chrome/browser/prefs/pref_service_syncable.h ('k') | chrome/browser/prefs/pref_service_syncable_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698