| OLD | NEW |
| 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 "base/prefs/pref_member.h" | 5 #include "base/prefs/pref_member.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
| 11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
| 12 #include "base/value_conversions.h" | 12 #include "base/value_conversions.h" |
| 13 | 13 |
| 14 using base::MessageLoopProxy; | 14 using base::MessageLoopProxy; |
| 15 using base::SingleThreadTaskRunner; | 15 using base::SingleThreadTaskRunner; |
| 16 | 16 |
| 17 namespace subtle { | 17 namespace subtle { |
| 18 | 18 |
| 19 PrefMemberBase::PrefMemberBase() | 19 PrefMemberBase::PrefMemberBase() |
| 20 : prefs_(NULL), | 20 : prefs_(NULL), |
| 21 setting_value_(false) { | 21 setting_value_(false) { |
| 22 } | 22 } |
| 23 | 23 |
| 24 PrefMemberBase::~PrefMemberBase() { | 24 PrefMemberBase::~PrefMemberBase() { |
| 25 Destroy(); | 25 Destroy(); |
| 26 } | 26 } |
| 27 | 27 |
| 28 void PrefMemberBase::Init(const char* pref_name, | 28 void PrefMemberBase::Init(const std::string& pref_name, |
| 29 PrefService* prefs, | 29 PrefService* prefs, |
| 30 const NamedChangeCallback& observer) { | 30 const NamedChangeCallback& observer) { |
| 31 observer_ = observer; | 31 observer_ = observer; |
| 32 Init(pref_name, prefs); | 32 Init(pref_name, prefs); |
| 33 } | 33 } |
| 34 | 34 |
| 35 void PrefMemberBase::Init(const char* pref_name, | 35 void PrefMemberBase::Init(const std::string& pref_name, PrefService* prefs) { |
| 36 PrefService* prefs) { | |
| 37 DCHECK(pref_name); | |
| 38 DCHECK(prefs); | 36 DCHECK(prefs); |
| 39 DCHECK(pref_name_.empty()); // Check that Init is only called once. | 37 DCHECK(pref_name_.empty()); // Check that Init is only called once. |
| 40 prefs_ = prefs; | 38 prefs_ = prefs; |
| 41 pref_name_ = pref_name; | 39 pref_name_ = pref_name; |
| 42 // Check that the preference is registered. | 40 // Check that the preference is registered. |
| 43 DCHECK(prefs_->FindPreference(pref_name_.c_str())) | 41 DCHECK(prefs_->FindPreference(pref_name_)) << pref_name << " not registered."; |
| 44 << pref_name << " not registered."; | |
| 45 | 42 |
| 46 // Add ourselves as a pref observer so we can keep our local value in sync. | 43 // Add ourselves as a pref observer so we can keep our local value in sync. |
| 47 prefs_->AddPrefObserver(pref_name, this); | 44 prefs_->AddPrefObserver(pref_name, this); |
| 48 } | 45 } |
| 49 | 46 |
| 50 void PrefMemberBase::Destroy() { | 47 void PrefMemberBase::Destroy() { |
| 51 if (prefs_ && !pref_name_.empty()) { | 48 if (prefs_ && !pref_name_.empty()) { |
| 52 prefs_->RemovePrefObserver(pref_name_.c_str(), this); | 49 prefs_->RemovePrefObserver(pref_name_, this); |
| 53 prefs_ = NULL; | 50 prefs_ = NULL; |
| 54 } | 51 } |
| 55 } | 52 } |
| 56 | 53 |
| 57 void PrefMemberBase::MoveToThread( | 54 void PrefMemberBase::MoveToThread( |
| 58 const scoped_refptr<SingleThreadTaskRunner>& task_runner) { | 55 const scoped_refptr<SingleThreadTaskRunner>& task_runner) { |
| 59 VerifyValuePrefName(); | 56 VerifyValuePrefName(); |
| 60 // Load the value from preferences if it hasn't been loaded so far. | 57 // Load the value from preferences if it hasn't been loaded so far. |
| 61 if (!internal()) | 58 if (!internal()) |
| 62 UpdateValueFromPref(base::Closure()); | 59 UpdateValueFromPref(base::Closure()); |
| 63 internal()->MoveToThread(task_runner); | 60 internal()->MoveToThread(task_runner); |
| 64 } | 61 } |
| 65 | 62 |
| 66 void PrefMemberBase::OnPreferenceChanged(PrefService* service, | 63 void PrefMemberBase::OnPreferenceChanged(PrefService* service, |
| 67 const std::string& pref_name) { | 64 const std::string& pref_name) { |
| 68 VerifyValuePrefName(); | 65 VerifyValuePrefName(); |
| 69 UpdateValueFromPref((!setting_value_ && !observer_.is_null()) ? | 66 UpdateValueFromPref((!setting_value_ && !observer_.is_null()) ? |
| 70 base::Bind(observer_, pref_name) : base::Closure()); | 67 base::Bind(observer_, pref_name) : base::Closure()); |
| 71 } | 68 } |
| 72 | 69 |
| 73 void PrefMemberBase::UpdateValueFromPref(const base::Closure& callback) const { | 70 void PrefMemberBase::UpdateValueFromPref(const base::Closure& callback) const { |
| 74 VerifyValuePrefName(); | 71 VerifyValuePrefName(); |
| 75 const PrefService::Preference* pref = | 72 const PrefService::Preference* pref = prefs_->FindPreference(pref_name_); |
| 76 prefs_->FindPreference(pref_name_.c_str()); | |
| 77 DCHECK(pref); | 73 DCHECK(pref); |
| 78 if (!internal()) | 74 if (!internal()) |
| 79 CreateInternal(); | 75 CreateInternal(); |
| 80 internal()->UpdateValue(pref->GetValue()->DeepCopy(), | 76 internal()->UpdateValue(pref->GetValue()->DeepCopy(), |
| 81 pref->IsManaged(), | 77 pref->IsManaged(), |
| 82 pref->IsUserModifiable(), | 78 pref->IsUserModifiable(), |
| 83 callback); | 79 callback); |
| 84 } | 80 } |
| 85 | 81 |
| 86 void PrefMemberBase::VerifyPref() const { | 82 void PrefMemberBase::VerifyPref() const { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 } | 147 } |
| 152 | 148 |
| 153 string_vector->swap(local_vector); | 149 string_vector->swap(local_vector); |
| 154 return true; | 150 return true; |
| 155 } | 151 } |
| 156 | 152 |
| 157 } // namespace subtle | 153 } // namespace subtle |
| 158 | 154 |
| 159 template <> | 155 template <> |
| 160 void PrefMember<bool>::UpdatePref(const bool& value) { | 156 void PrefMember<bool>::UpdatePref(const bool& value) { |
| 161 prefs()->SetBoolean(pref_name().c_str(), value); | 157 prefs()->SetBoolean(pref_name(), value); |
| 162 } | 158 } |
| 163 | 159 |
| 164 template <> | 160 template <> |
| 165 bool PrefMember<bool>::Internal::UpdateValueInternal( | 161 bool PrefMember<bool>::Internal::UpdateValueInternal( |
| 166 const base::Value& value) const { | 162 const base::Value& value) const { |
| 167 return value.GetAsBoolean(&value_); | 163 return value.GetAsBoolean(&value_); |
| 168 } | 164 } |
| 169 | 165 |
| 170 template <> | 166 template <> |
| 171 void PrefMember<int>::UpdatePref(const int& value) { | 167 void PrefMember<int>::UpdatePref(const int& value) { |
| 172 prefs()->SetInteger(pref_name().c_str(), value); | 168 prefs()->SetInteger(pref_name(), value); |
| 173 } | 169 } |
| 174 | 170 |
| 175 template <> | 171 template <> |
| 176 bool PrefMember<int>::Internal::UpdateValueInternal( | 172 bool PrefMember<int>::Internal::UpdateValueInternal( |
| 177 const base::Value& value) const { | 173 const base::Value& value) const { |
| 178 return value.GetAsInteger(&value_); | 174 return value.GetAsInteger(&value_); |
| 179 } | 175 } |
| 180 | 176 |
| 181 template <> | 177 template <> |
| 182 void PrefMember<double>::UpdatePref(const double& value) { | 178 void PrefMember<double>::UpdatePref(const double& value) { |
| 183 prefs()->SetDouble(pref_name().c_str(), value); | 179 prefs()->SetDouble(pref_name(), value); |
| 184 } | 180 } |
| 185 | 181 |
| 186 template <> | 182 template <> |
| 187 bool PrefMember<double>::Internal::UpdateValueInternal(const base::Value& value) | 183 bool PrefMember<double>::Internal::UpdateValueInternal(const base::Value& value) |
| 188 const { | 184 const { |
| 189 return value.GetAsDouble(&value_); | 185 return value.GetAsDouble(&value_); |
| 190 } | 186 } |
| 191 | 187 |
| 192 template <> | 188 template <> |
| 193 void PrefMember<std::string>::UpdatePref(const std::string& value) { | 189 void PrefMember<std::string>::UpdatePref(const std::string& value) { |
| 194 prefs()->SetString(pref_name().c_str(), value); | 190 prefs()->SetString(pref_name(), value); |
| 195 } | 191 } |
| 196 | 192 |
| 197 template <> | 193 template <> |
| 198 bool PrefMember<std::string>::Internal::UpdateValueInternal( | 194 bool PrefMember<std::string>::Internal::UpdateValueInternal( |
| 199 const base::Value& value) | 195 const base::Value& value) |
| 200 const { | 196 const { |
| 201 return value.GetAsString(&value_); | 197 return value.GetAsString(&value_); |
| 202 } | 198 } |
| 203 | 199 |
| 204 template <> | 200 template <> |
| 205 void PrefMember<base::FilePath>::UpdatePref(const base::FilePath& value) { | 201 void PrefMember<base::FilePath>::UpdatePref(const base::FilePath& value) { |
| 206 prefs()->SetFilePath(pref_name().c_str(), value); | 202 prefs()->SetFilePath(pref_name(), value); |
| 207 } | 203 } |
| 208 | 204 |
| 209 template <> | 205 template <> |
| 210 bool PrefMember<base::FilePath>::Internal::UpdateValueInternal( | 206 bool PrefMember<base::FilePath>::Internal::UpdateValueInternal( |
| 211 const base::Value& value) | 207 const base::Value& value) |
| 212 const { | 208 const { |
| 213 return base::GetValueAsFilePath(value, &value_); | 209 return base::GetValueAsFilePath(value, &value_); |
| 214 } | 210 } |
| 215 | 211 |
| 216 template <> | 212 template <> |
| 217 void PrefMember<std::vector<std::string> >::UpdatePref( | 213 void PrefMember<std::vector<std::string> >::UpdatePref( |
| 218 const std::vector<std::string>& value) { | 214 const std::vector<std::string>& value) { |
| 219 base::ListValue list_value; | 215 base::ListValue list_value; |
| 220 list_value.AppendStrings(value); | 216 list_value.AppendStrings(value); |
| 221 prefs()->Set(pref_name().c_str(), list_value); | 217 prefs()->Set(pref_name(), list_value); |
| 222 } | 218 } |
| 223 | 219 |
| 224 template <> | 220 template <> |
| 225 bool PrefMember<std::vector<std::string> >::Internal::UpdateValueInternal( | 221 bool PrefMember<std::vector<std::string> >::Internal::UpdateValueInternal( |
| 226 const base::Value& value) const { | 222 const base::Value& value) const { |
| 227 return subtle::PrefMemberVectorStringUpdate(value, &value_); | 223 return subtle::PrefMemberVectorStringUpdate(value, &value_); |
| 228 } | 224 } |
| OLD | NEW |