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/public/pref_member.h" | 5 #include "base/prefs/public/pref_member.h" |
6 | 6 |
7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/prefs/public/pref_service_base.h" | 10 #include "base/prefs/public/pref_service_base.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 is_managed_(false) { | 97 is_managed_(false) { |
98 } | 98 } |
99 PrefMemberBase::Internal::~Internal() { } | 99 PrefMemberBase::Internal::~Internal() { } |
100 | 100 |
101 bool PrefMemberBase::Internal::IsOnCorrectThread() const { | 101 bool PrefMemberBase::Internal::IsOnCorrectThread() const { |
102 // In unit tests, there may not be a message loop. | 102 // In unit tests, there may not be a message loop. |
103 return thread_loop_ == NULL || thread_loop_->BelongsToCurrentThread(); | 103 return thread_loop_ == NULL || thread_loop_->BelongsToCurrentThread(); |
104 } | 104 } |
105 | 105 |
106 void PrefMemberBase::Internal::UpdateValue( | 106 void PrefMemberBase::Internal::UpdateValue( |
107 Value* v, | 107 base::Value* v, |
108 bool is_managed, | 108 bool is_managed, |
109 bool is_user_modifiable, | 109 bool is_user_modifiable, |
110 const base::Closure& callback) const { | 110 const base::Closure& callback) const { |
111 scoped_ptr<Value> value(v); | 111 scoped_ptr<base::Value> value(v); |
112 base::ScopedClosureRunner closure_runner(callback); | 112 base::ScopedClosureRunner closure_runner(callback); |
113 if (IsOnCorrectThread()) { | 113 if (IsOnCorrectThread()) { |
114 bool rv = UpdateValueInternal(*value); | 114 bool rv = UpdateValueInternal(*value); |
115 DCHECK(rv); | 115 DCHECK(rv); |
116 is_managed_ = is_managed; | 116 is_managed_ = is_managed; |
117 is_user_modifiable_ = is_user_modifiable; | 117 is_user_modifiable_ = is_user_modifiable; |
118 } else { | 118 } else { |
119 bool may_run = thread_loop_->PostTask( | 119 bool may_run = thread_loop_->PostTask( |
120 FROM_HERE, | 120 FROM_HERE, |
121 base::Bind(&PrefMemberBase::Internal::UpdateValue, this, | 121 base::Bind(&PrefMemberBase::Internal::UpdateValue, this, |
122 value.release(), is_managed, is_user_modifiable, | 122 value.release(), is_managed, is_user_modifiable, |
123 closure_runner.Release())); | 123 closure_runner.Release())); |
124 DCHECK(may_run); | 124 DCHECK(may_run); |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 void PrefMemberBase::Internal::MoveToThread( | 128 void PrefMemberBase::Internal::MoveToThread( |
129 const scoped_refptr<MessageLoopProxy>& message_loop) { | 129 const scoped_refptr<MessageLoopProxy>& message_loop) { |
130 CheckOnCorrectThread(); | 130 CheckOnCorrectThread(); |
131 thread_loop_ = message_loop; | 131 thread_loop_ = message_loop; |
132 } | 132 } |
133 | 133 |
134 bool PrefMemberVectorStringUpdate(const Value& value, | 134 bool PrefMemberVectorStringUpdate(const base::Value& value, |
135 std::vector<std::string>* string_vector) { | 135 std::vector<std::string>* string_vector) { |
136 if (!value.IsType(Value::TYPE_LIST)) | 136 if (!value.IsType(base::Value::TYPE_LIST)) |
137 return false; | 137 return false; |
138 const ListValue* list = static_cast<const ListValue*>(&value); | 138 const ListValue* list = static_cast<const ListValue*>(&value); |
139 | 139 |
140 std::vector<std::string> local_vector; | 140 std::vector<std::string> local_vector; |
141 for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) { | 141 for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) { |
142 std::string string_value; | 142 std::string string_value; |
143 if (!(*it)->GetAsString(&string_value)) | 143 if (!(*it)->GetAsString(&string_value)) |
144 return false; | 144 return false; |
145 | 145 |
146 local_vector.push_back(string_value); | 146 local_vector.push_back(string_value); |
147 } | 147 } |
148 | 148 |
149 string_vector->swap(local_vector); | 149 string_vector->swap(local_vector); |
150 return true; | 150 return true; |
151 } | 151 } |
152 | 152 |
153 } // namespace subtle | 153 } // namespace subtle |
154 | 154 |
155 template <> | 155 template <> |
156 void PrefMember<bool>::UpdatePref(const bool& value) { | 156 void PrefMember<bool>::UpdatePref(const bool& value) { |
157 prefs()->SetBoolean(pref_name().c_str(), value); | 157 prefs()->SetBoolean(pref_name().c_str(), value); |
158 } | 158 } |
159 | 159 |
160 template <> | 160 template <> |
161 bool PrefMember<bool>::Internal::UpdateValueInternal(const Value& value) const { | 161 bool PrefMember<bool>::Internal::UpdateValueInternal( |
| 162 const base::Value& value) const { |
162 return value.GetAsBoolean(&value_); | 163 return value.GetAsBoolean(&value_); |
163 } | 164 } |
164 | 165 |
165 template <> | 166 template <> |
166 void PrefMember<int>::UpdatePref(const int& value) { | 167 void PrefMember<int>::UpdatePref(const int& value) { |
167 prefs()->SetInteger(pref_name().c_str(), value); | 168 prefs()->SetInteger(pref_name().c_str(), value); |
168 } | 169 } |
169 | 170 |
170 template <> | 171 template <> |
171 bool PrefMember<int>::Internal::UpdateValueInternal(const Value& value) const { | 172 bool PrefMember<int>::Internal::UpdateValueInternal( |
| 173 const base::Value& value) const { |
172 return value.GetAsInteger(&value_); | 174 return value.GetAsInteger(&value_); |
173 } | 175 } |
174 | 176 |
175 template <> | 177 template <> |
176 void PrefMember<double>::UpdatePref(const double& value) { | 178 void PrefMember<double>::UpdatePref(const double& value) { |
177 prefs()->SetDouble(pref_name().c_str(), value); | 179 prefs()->SetDouble(pref_name().c_str(), value); |
178 } | 180 } |
179 | 181 |
180 template <> | 182 template <> |
181 bool PrefMember<double>::Internal::UpdateValueInternal(const Value& value) | 183 bool PrefMember<double>::Internal::UpdateValueInternal(const base::Value& value) |
182 const { | 184 const { |
183 return value.GetAsDouble(&value_); | 185 return value.GetAsDouble(&value_); |
184 } | 186 } |
185 | 187 |
186 template <> | 188 template <> |
187 void PrefMember<std::string>::UpdatePref(const std::string& value) { | 189 void PrefMember<std::string>::UpdatePref(const std::string& value) { |
188 prefs()->SetString(pref_name().c_str(), value); | 190 prefs()->SetString(pref_name().c_str(), value); |
189 } | 191 } |
190 | 192 |
191 template <> | 193 template <> |
192 bool PrefMember<std::string>::Internal::UpdateValueInternal(const Value& value) | 194 bool PrefMember<std::string>::Internal::UpdateValueInternal( |
| 195 const base::Value& value) |
193 const { | 196 const { |
194 return value.GetAsString(&value_); | 197 return value.GetAsString(&value_); |
195 } | 198 } |
196 | 199 |
197 template <> | 200 template <> |
198 void PrefMember<FilePath>::UpdatePref(const FilePath& value) { | 201 void PrefMember<base::FilePath>::UpdatePref(const base::FilePath& value) { |
199 prefs()->SetFilePath(pref_name().c_str(), value); | 202 prefs()->SetFilePath(pref_name().c_str(), value); |
200 } | 203 } |
201 | 204 |
202 template <> | 205 template <> |
203 bool PrefMember<FilePath>::Internal::UpdateValueInternal(const Value& value) | 206 bool PrefMember<base::FilePath>::Internal::UpdateValueInternal( |
| 207 const base::Value& value) |
204 const { | 208 const { |
205 return base::GetValueAsFilePath(value, &value_); | 209 return base::GetValueAsFilePath(value, &value_); |
206 } | 210 } |
207 | 211 |
208 template <> | 212 template <> |
209 void PrefMember<std::vector<std::string> >::UpdatePref( | 213 void PrefMember<std::vector<std::string> >::UpdatePref( |
210 const std::vector<std::string>& value) { | 214 const std::vector<std::string>& value) { |
211 ListValue list_value; | 215 ListValue list_value; |
212 list_value.AppendStrings(value); | 216 list_value.AppendStrings(value); |
213 prefs()->Set(pref_name().c_str(), list_value); | 217 prefs()->Set(pref_name().c_str(), list_value); |
214 } | 218 } |
215 | 219 |
216 template <> | 220 template <> |
217 bool PrefMember<std::vector<std::string> >::Internal::UpdateValueInternal( | 221 bool PrefMember<std::vector<std::string> >::Internal::UpdateValueInternal( |
218 const Value& value) const { | 222 const base::Value& value) const { |
219 return subtle::PrefMemberVectorStringUpdate(value, &value_); | 223 return subtle::PrefMemberVectorStringUpdate(value, &value_); |
220 } | 224 } |
OLD | NEW |