Home | History | Annotate | Download | only in pref_registry
      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.
     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 new base::FundamentalValue(true);
     29       if ("false" == resource_string)
     30         return new base::FundamentalValue(false);
     31       break;
     32     }
     33 
     34     case base::Value::TYPE_INTEGER: {
     35       int val;
     36       base::StringToInt(resource_string, &val);
     37       return new base::FundamentalValue(val);
     38     }
     39 
     40     case base::Value::TYPE_DOUBLE: {
     41       double val;
     42       base::StringToDouble(resource_string, &val);
     43       return new base::FundamentalValue(val);
     44     }
     45 
     46     case base::Value::TYPE_STRING: {
     47       return new base::StringValue(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 
     61 PrefRegistrySyncable::PrefRegistrySyncable() {
     62 }
     63 
     64 PrefRegistrySyncable::~PrefRegistrySyncable() {
     65 }
     66 
     67 const PrefRegistrySyncable::PrefToStatus&
     68 PrefRegistrySyncable::syncable_preferences() const {
     69   return syncable_preferences_;
     70 }
     71 
     72 void PrefRegistrySyncable::SetSyncableRegistrationCallback(
     73     const SyncableRegistrationCallback& cb) {
     74   callback_ = cb;
     75 }
     76 
     77 void PrefRegistrySyncable::RegisterBooleanPref(const char* path,
     78                                                bool default_value,
     79                                                PrefSyncStatus sync_status) {
     80   RegisterSyncablePreference(
     81       path, new base::FundamentalValue(default_value), sync_status);
     82 }
     83 
     84 void PrefRegistrySyncable::RegisterIntegerPref(const char* path,
     85                                                int default_value,
     86                                                PrefSyncStatus sync_status) {
     87   RegisterSyncablePreference(
     88       path, new base::FundamentalValue(default_value), sync_status);
     89 }
     90 
     91 void PrefRegistrySyncable::RegisterDoublePref(const char* path,
     92                                               double default_value,
     93                                               PrefSyncStatus sync_status) {
     94   RegisterSyncablePreference(
     95       path, new base::FundamentalValue(default_value), sync_status);
     96 }
     97 
     98 void PrefRegistrySyncable::RegisterStringPref(const char* path,
     99                                               const std::string& default_value,
    100                                               PrefSyncStatus sync_status) {
    101   RegisterSyncablePreference(
    102       path, new base::StringValue(default_value), sync_status);
    103 }
    104 
    105 void PrefRegistrySyncable::RegisterFilePathPref(
    106     const char* path,
    107     const base::FilePath& default_value,
    108     PrefSyncStatus sync_status) {
    109   RegisterSyncablePreference(
    110       path, new base::StringValue(default_value.value()), sync_status);
    111 }
    112 
    113 void PrefRegistrySyncable::RegisterListPref(const char* path,
    114                                             PrefSyncStatus sync_status) {
    115   RegisterSyncablePreference(path, new base::ListValue(), sync_status);
    116 }
    117 
    118 void PrefRegistrySyncable::RegisterListPref(const char* path,
    119                                             base::ListValue* default_value,
    120                                             PrefSyncStatus sync_status) {
    121   RegisterSyncablePreference(path, default_value, sync_status);
    122 }
    123 
    124 void PrefRegistrySyncable::RegisterDictionaryPref(const char* path,
    125                                                   PrefSyncStatus sync_status) {
    126   RegisterSyncablePreference(path, new base::DictionaryValue(), sync_status);
    127 }
    128 
    129 void PrefRegistrySyncable::RegisterDictionaryPref(
    130     const char* path,
    131     base::DictionaryValue* default_value,
    132     PrefSyncStatus sync_status) {
    133   RegisterSyncablePreference(path, default_value, sync_status);
    134 }
    135 
    136 void PrefRegistrySyncable::RegisterLocalizedBooleanPref(
    137     const char* path,
    138     int locale_default_message_id,
    139     PrefSyncStatus sync_status) {
    140   RegisterSyncablePreference(
    141       path,
    142       CreateLocaleDefaultValue(base::Value::TYPE_BOOLEAN,
    143                                locale_default_message_id),
    144       sync_status);
    145 }
    146 
    147 void PrefRegistrySyncable::RegisterLocalizedIntegerPref(
    148     const char* path,
    149     int locale_default_message_id,
    150     PrefSyncStatus sync_status) {
    151   RegisterSyncablePreference(
    152       path,
    153       CreateLocaleDefaultValue(base::Value::TYPE_INTEGER,
    154                                locale_default_message_id),
    155       sync_status);
    156 }
    157 
    158 void PrefRegistrySyncable::RegisterLocalizedDoublePref(
    159     const char* path,
    160     int locale_default_message_id,
    161     PrefSyncStatus sync_status) {
    162   RegisterSyncablePreference(
    163       path,
    164       CreateLocaleDefaultValue(base::Value::TYPE_DOUBLE,
    165                                locale_default_message_id),
    166       sync_status);
    167 }
    168 
    169 void PrefRegistrySyncable::RegisterLocalizedStringPref(
    170     const char* path,
    171     int locale_default_message_id,
    172     PrefSyncStatus sync_status) {
    173   RegisterSyncablePreference(
    174       path,
    175       CreateLocaleDefaultValue(base::Value::TYPE_STRING,
    176                                locale_default_message_id),
    177       sync_status);
    178 }
    179 
    180 void PrefRegistrySyncable::RegisterInt64Pref(
    181     const char* path,
    182     int64 default_value,
    183     PrefSyncStatus sync_status) {
    184   RegisterSyncablePreference(
    185       path,
    186       new base::StringValue(base::Int64ToString(default_value)),
    187       sync_status);
    188 }
    189 
    190 void PrefRegistrySyncable::RegisterUint64Pref(
    191     const char* path,
    192     uint64 default_value,
    193     PrefSyncStatus sync_status) {
    194   RegisterSyncablePreference(
    195       path,
    196       new base::StringValue(base::Uint64ToString(default_value)),
    197       sync_status);
    198 }
    199 
    200 void PrefRegistrySyncable::RegisterSyncablePreference(
    201     const char* path,
    202     base::Value* default_value,
    203     PrefSyncStatus sync_status) {
    204   PrefRegistry::RegisterPreference(path, default_value);
    205 
    206   if (sync_status == PrefRegistrySyncable::SYNCABLE_PREF ||
    207       sync_status == PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF) {
    208     syncable_preferences_[path] = sync_status;
    209 
    210     if (!callback_.is_null())
    211       callback_.Run(path, sync_status);
    212   }
    213 }
    214 
    215 scoped_refptr<PrefRegistrySyncable> PrefRegistrySyncable::ForkForIncognito() {
    216   // TODO(joi): We can directly reuse the same PrefRegistry once
    217   // PrefService no longer registers for callbacks on registration and
    218   // unregistration.
    219   scoped_refptr<PrefRegistrySyncable> registry(new PrefRegistrySyncable());
    220   registry->defaults_ = defaults_;
    221   return registry;
    222 }
    223 
    224 }  // namespace user_prefs
    225