• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "components/pref_registry/pref_registry_syncable.h"
6 
7 #include "base/files/file_path.h"
8 #include "base/prefs/default_pref_store.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/values.h"
11 #include "ui/base/l10n/l10n_util.h"
12 
13 namespace user_prefs {
14 
15 namespace {
16 
17 // A helper function for RegisterLocalized*Pref that creates a Value*
18 // based on a localized resource.  Because we control the values in a
19 // locale dll, this should always return a Value of the appropriate
20 // type.
CreateLocaleDefaultValue(base::Value::Type type,int message_id)21 base::Value* CreateLocaleDefaultValue(base::Value::Type type,
22                                       int message_id) {
23   const std::string resource_string = l10n_util::GetStringUTF8(message_id);
24   DCHECK(!resource_string.empty());
25   switch (type) {
26     case base::Value::TYPE_BOOLEAN: {
27       if ("true" == resource_string)
28         return base::Value::CreateBooleanValue(true);
29       if ("false" == resource_string)
30         return base::Value::CreateBooleanValue(false);
31       break;
32     }
33 
34     case base::Value::TYPE_INTEGER: {
35       int val;
36       base::StringToInt(resource_string, &val);
37       return base::Value::CreateIntegerValue(val);
38     }
39 
40     case base::Value::TYPE_DOUBLE: {
41       double val;
42       base::StringToDouble(resource_string, &val);
43       return base::Value::CreateDoubleValue(val);
44     }
45 
46     case base::Value::TYPE_STRING: {
47       return base::Value::CreateStringValue(resource_string);
48     }
49 
50     default: {
51       NOTREACHED() <<
52           "list and dictionary types cannot have default locale values";
53     }
54   }
55   NOTREACHED();
56   return base::Value::CreateNullValue();
57 }
58 
59 }  // namespace
60 
PrefRegistrySyncable()61 PrefRegistrySyncable::PrefRegistrySyncable() {
62 }
63 
~PrefRegistrySyncable()64 PrefRegistrySyncable::~PrefRegistrySyncable() {
65 }
66 
67 const PrefRegistrySyncable::PrefToStatus&
syncable_preferences() const68 PrefRegistrySyncable::syncable_preferences() const {
69   return syncable_preferences_;
70 }
71 
SetSyncableRegistrationCallback(const SyncableRegistrationCallback & cb)72 void PrefRegistrySyncable::SetSyncableRegistrationCallback(
73     const SyncableRegistrationCallback& cb) {
74   callback_ = cb;
75 }
76 
RegisterBooleanPref(const char * path,bool default_value,PrefSyncStatus sync_status)77 void PrefRegistrySyncable::RegisterBooleanPref(const char* path,
78                                                bool default_value,
79                                                PrefSyncStatus sync_status) {
80   RegisterSyncablePreference(path,
81                              base::Value::CreateBooleanValue(default_value),
82                              sync_status);
83 }
84 
RegisterIntegerPref(const char * path,int default_value,PrefSyncStatus sync_status)85 void PrefRegistrySyncable::RegisterIntegerPref(const char* path,
86                                                int default_value,
87                                                PrefSyncStatus sync_status) {
88   RegisterSyncablePreference(path,
89                              base::Value::CreateIntegerValue(default_value),
90                              sync_status);
91 }
92 
RegisterDoublePref(const char * path,double default_value,PrefSyncStatus sync_status)93 void PrefRegistrySyncable::RegisterDoublePref(const char* path,
94                                               double default_value,
95                                               PrefSyncStatus sync_status) {
96   RegisterSyncablePreference(path,
97                              base::Value::CreateDoubleValue(default_value),
98                              sync_status);
99 }
100 
RegisterStringPref(const char * path,const std::string & default_value,PrefSyncStatus sync_status)101 void PrefRegistrySyncable::RegisterStringPref(const char* path,
102                                               const std::string& default_value,
103                                               PrefSyncStatus sync_status) {
104   RegisterSyncablePreference(path,
105                              base::Value::CreateStringValue(default_value),
106                              sync_status);
107 }
108 
RegisterFilePathPref(const char * path,const base::FilePath & default_value,PrefSyncStatus sync_status)109 void PrefRegistrySyncable::RegisterFilePathPref(
110     const char* path,
111     const base::FilePath& default_value,
112     PrefSyncStatus sync_status) {
113   RegisterSyncablePreference(path,
114                              base::Value::CreateStringValue(
115                                  default_value.value()),
116                              sync_status);
117 }
118 
RegisterListPref(const char * path,PrefSyncStatus sync_status)119 void PrefRegistrySyncable::RegisterListPref(const char* path,
120                                             PrefSyncStatus sync_status) {
121   RegisterSyncablePreference(path, new base::ListValue(), sync_status);
122 }
123 
RegisterListPref(const char * path,base::ListValue * default_value,PrefSyncStatus sync_status)124 void PrefRegistrySyncable::RegisterListPref(const char* path,
125                                             base::ListValue* default_value,
126                                             PrefSyncStatus sync_status) {
127   RegisterSyncablePreference(path, default_value, sync_status);
128 }
129 
RegisterDictionaryPref(const char * path,PrefSyncStatus sync_status)130 void PrefRegistrySyncable::RegisterDictionaryPref(const char* path,
131                                                   PrefSyncStatus sync_status) {
132   RegisterSyncablePreference(path, new base::DictionaryValue(), sync_status);
133 }
134 
RegisterDictionaryPref(const char * path,base::DictionaryValue * default_value,PrefSyncStatus sync_status)135 void PrefRegistrySyncable::RegisterDictionaryPref(
136     const char* path,
137     base::DictionaryValue* default_value,
138     PrefSyncStatus sync_status) {
139   RegisterSyncablePreference(path, default_value, sync_status);
140 }
141 
RegisterLocalizedBooleanPref(const char * path,int locale_default_message_id,PrefSyncStatus sync_status)142 void PrefRegistrySyncable::RegisterLocalizedBooleanPref(
143     const char* path,
144     int locale_default_message_id,
145     PrefSyncStatus sync_status) {
146   RegisterSyncablePreference(
147       path,
148       CreateLocaleDefaultValue(base::Value::TYPE_BOOLEAN,
149                                locale_default_message_id),
150       sync_status);
151 }
152 
RegisterLocalizedIntegerPref(const char * path,int locale_default_message_id,PrefSyncStatus sync_status)153 void PrefRegistrySyncable::RegisterLocalizedIntegerPref(
154     const char* path,
155     int locale_default_message_id,
156     PrefSyncStatus sync_status) {
157   RegisterSyncablePreference(
158       path,
159       CreateLocaleDefaultValue(base::Value::TYPE_INTEGER,
160                                locale_default_message_id),
161       sync_status);
162 }
163 
RegisterLocalizedDoublePref(const char * path,int locale_default_message_id,PrefSyncStatus sync_status)164 void PrefRegistrySyncable::RegisterLocalizedDoublePref(
165     const char* path,
166     int locale_default_message_id,
167     PrefSyncStatus sync_status) {
168   RegisterSyncablePreference(
169       path,
170       CreateLocaleDefaultValue(base::Value::TYPE_DOUBLE,
171                                locale_default_message_id),
172       sync_status);
173 }
174 
RegisterLocalizedStringPref(const char * path,int locale_default_message_id,PrefSyncStatus sync_status)175 void PrefRegistrySyncable::RegisterLocalizedStringPref(
176     const char* path,
177     int locale_default_message_id,
178     PrefSyncStatus sync_status) {
179   RegisterSyncablePreference(
180       path,
181       CreateLocaleDefaultValue(base::Value::TYPE_STRING,
182                                locale_default_message_id),
183       sync_status);
184 }
185 
RegisterInt64Pref(const char * path,int64 default_value,PrefSyncStatus sync_status)186 void PrefRegistrySyncable::RegisterInt64Pref(
187     const char* path,
188     int64 default_value,
189     PrefSyncStatus sync_status) {
190   RegisterSyncablePreference(
191       path,
192       base::Value::CreateStringValue(base::Int64ToString(default_value)),
193       sync_status);
194 }
195 
RegisterUint64Pref(const char * path,uint64 default_value,PrefSyncStatus sync_status)196 void PrefRegistrySyncable::RegisterUint64Pref(
197     const char* path,
198     uint64 default_value,
199     PrefSyncStatus sync_status) {
200   RegisterSyncablePreference(
201       path,
202       base::Value::CreateStringValue(base::Uint64ToString(default_value)),
203       sync_status);
204 }
205 
RegisterSyncablePreference(const char * path,base::Value * default_value,PrefSyncStatus sync_status)206 void PrefRegistrySyncable::RegisterSyncablePreference(
207     const char* path,
208     base::Value* default_value,
209     PrefSyncStatus sync_status) {
210   PrefRegistry::RegisterPreference(path, default_value);
211 
212   if (sync_status == PrefRegistrySyncable::SYNCABLE_PREF ||
213       sync_status == PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF) {
214     syncable_preferences_[path] = sync_status;
215 
216     if (!callback_.is_null())
217       callback_.Run(path, sync_status);
218   }
219 }
220 
ForkForIncognito()221 scoped_refptr<PrefRegistrySyncable> PrefRegistrySyncable::ForkForIncognito() {
222   // TODO(joi): We can directly reuse the same PrefRegistry once
223   // PrefService no longer registers for callbacks on registration and
224   // unregistration.
225   scoped_refptr<PrefRegistrySyncable> registry(new PrefRegistrySyncable());
226   registry->defaults_ = defaults_;
227   return registry;
228 }
229 
230 }  // namespace user_prefs
231