pref_registry_syncable.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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
13namespace user_prefs {
14
15namespace {
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.
21base::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
61PrefRegistrySyncable::PrefRegistrySyncable() {
62}
63
64PrefRegistrySyncable::~PrefRegistrySyncable() {
65}
66
67const PrefRegistrySyncable::PrefToStatus&
68PrefRegistrySyncable::syncable_preferences() const {
69  return syncable_preferences_;
70}
71
72void PrefRegistrySyncable::SetSyncableRegistrationCallback(
73    const SyncableRegistrationCallback& cb) {
74  callback_ = cb;
75}
76
77void 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
85void 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
93void 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
101void 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
109void 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
119void PrefRegistrySyncable::RegisterListPref(const char* path,
120                                            PrefSyncStatus sync_status) {
121  RegisterSyncablePreference(path, new base::ListValue(), sync_status);
122}
123
124void PrefRegistrySyncable::RegisterListPref(const char* path,
125                                            base::ListValue* default_value,
126                                            PrefSyncStatus sync_status) {
127  RegisterSyncablePreference(path, default_value, sync_status);
128}
129
130void PrefRegistrySyncable::RegisterDictionaryPref(const char* path,
131                                                  PrefSyncStatus sync_status) {
132  RegisterSyncablePreference(path, new base::DictionaryValue(), sync_status);
133}
134
135void PrefRegistrySyncable::RegisterDictionaryPref(
136    const char* path,
137    base::DictionaryValue* default_value,
138    PrefSyncStatus sync_status) {
139  RegisterSyncablePreference(path, default_value, sync_status);
140}
141
142void 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
153void 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
164void 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
175void 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
186void 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
196void 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
206void 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
221scoped_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