Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(405)

Side by Side Diff: base/prefs/pref_service.cc

Issue 1141793003: Update from https://crrev.com/329939 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/prefs/pref_service.h ('k') | base/prefs/pref_service_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_service.h" 5 #include "base/prefs/pref_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 20 matching lines...) Expand all
31 : callback_(cb) {} 31 : callback_(cb) {}
32 32
33 void OnError(PersistentPrefStore::PrefReadError error) override { 33 void OnError(PersistentPrefStore::PrefReadError error) override {
34 callback_.Run(error); 34 callback_.Run(error);
35 } 35 }
36 36
37 private: 37 private:
38 base::Callback<void(PersistentPrefStore::PrefReadError)> callback_; 38 base::Callback<void(PersistentPrefStore::PrefReadError)> callback_;
39 }; 39 };
40 40
41 // Returns the WriteablePrefStore::PrefWriteFlags for the pref with the given
42 // |path|.
43 uint32 GetWriteFlags(const PrefService::Preference* pref) {
44 uint32 write_flags = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS;
45
46 if (!pref)
47 return write_flags;
48
49 if (pref->registration_flags() & PrefRegistry::LOSSY_PREF)
50 write_flags |= WriteablePrefStore::LOSSY_PREF_WRITE_FLAG;
51 return write_flags;
52 }
53
41 } // namespace 54 } // namespace
42 55
43 PrefService::PrefService( 56 PrefService::PrefService(
44 PrefNotifierImpl* pref_notifier, 57 PrefNotifierImpl* pref_notifier,
45 PrefValueStore* pref_value_store, 58 PrefValueStore* pref_value_store,
46 PersistentPrefStore* user_prefs, 59 PersistentPrefStore* user_prefs,
47 PrefRegistry* pref_registry, 60 PrefRegistry* pref_registry,
48 base::Callback<void(PersistentPrefStore::PrefReadError)> 61 base::Callback<void(PersistentPrefStore::PrefReadError)>
49 read_error_callback, 62 read_error_callback,
50 bool async) 63 bool async)
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 183
171 bool PrefService::HasPrefPath(const std::string& path) const { 184 bool PrefService::HasPrefPath(const std::string& path) const {
172 const Preference* pref = FindPreference(path); 185 const Preference* pref = FindPreference(path);
173 return pref && !pref->IsDefaultValue(); 186 return pref && !pref->IsDefaultValue();
174 } 187 }
175 188
176 scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValues() const { 189 scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValues() const {
177 DCHECK(CalledOnValidThread()); 190 DCHECK(CalledOnValidThread());
178 scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue); 191 scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue);
179 for (const auto& it : *pref_registry_) { 192 for (const auto& it : *pref_registry_) {
180 const base::Value* value = GetPreferenceValue(it.first); 193 out->Set(it.first, GetPreferenceValue(it.first)->CreateDeepCopy());
181 out->Set(it.first, value->DeepCopy());
182 } 194 }
183 return out.Pass(); 195 return out.Pass();
184 } 196 }
185 197
186 scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValuesOmitDefaults() 198 scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValuesOmitDefaults()
187 const { 199 const {
188 DCHECK(CalledOnValidThread()); 200 DCHECK(CalledOnValidThread());
189 scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue); 201 scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue);
190 for (const auto& it : *pref_registry_) { 202 for (const auto& it : *pref_registry_) {
191 const Preference* pref = FindPreference(it.first); 203 const Preference* pref = FindPreference(it.first);
192 if (pref->IsDefaultValue()) 204 if (pref->IsDefaultValue())
193 continue; 205 continue;
194 out->Set(it.first, pref->GetValue()->DeepCopy()); 206 out->Set(it.first, pref->GetValue()->CreateDeepCopy());
195 } 207 }
196 return out.Pass(); 208 return out.Pass();
197 } 209 }
198 210
199 scoped_ptr<base::DictionaryValue> 211 scoped_ptr<base::DictionaryValue>
200 PrefService::GetPreferenceValuesWithoutPathExpansion() const { 212 PrefService::GetPreferenceValuesWithoutPathExpansion() const {
201 DCHECK(CalledOnValidThread()); 213 DCHECK(CalledOnValidThread());
202 scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue); 214 scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue);
203 for (const auto& it : *pref_registry_) { 215 for (const auto& it : *pref_registry_) {
204 const base::Value* value = GetPreferenceValue(it.first); 216 const base::Value* value = GetPreferenceValue(it.first);
205 DCHECK(value); 217 DCHECK(value);
206 out->SetWithoutPathExpansion(it.first, value->DeepCopy()); 218 out->SetWithoutPathExpansion(it.first, value->CreateDeepCopy());
207 } 219 }
208 return out.Pass(); 220 return out.Pass();
209 } 221 }
210 222
211 const PrefService::Preference* PrefService::FindPreference( 223 const PrefService::Preference* PrefService::FindPreference(
212 const std::string& pref_name) const { 224 const std::string& pref_name) const {
213 DCHECK(CalledOnValidThread()); 225 DCHECK(CalledOnValidThread());
214 PreferenceMap::iterator it = prefs_map_.find(pref_name); 226 PreferenceMap::iterator it = prefs_map_.find(pref_name);
215 if (it != prefs_map_.end()) 227 if (it != prefs_map_.end())
216 return &(it->second); 228 return &(it->second);
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 } 362 }
351 363
352 void PrefService::ClearPref(const std::string& path) { 364 void PrefService::ClearPref(const std::string& path) {
353 DCHECK(CalledOnValidThread()); 365 DCHECK(CalledOnValidThread());
354 366
355 const Preference* pref = FindPreference(path); 367 const Preference* pref = FindPreference(path);
356 if (!pref) { 368 if (!pref) {
357 NOTREACHED() << "Trying to clear an unregistered pref: " << path; 369 NOTREACHED() << "Trying to clear an unregistered pref: " << path;
358 return; 370 return;
359 } 371 }
360 user_pref_store_->RemoveValue(path); 372 user_pref_store_->RemoveValue(path, GetWriteFlags(pref));
361 } 373 }
362 374
363 void PrefService::Set(const std::string& path, const base::Value& value) { 375 void PrefService::Set(const std::string& path, const base::Value& value) {
364 SetUserPrefValue(path, value.DeepCopy()); 376 SetUserPrefValue(path, value.DeepCopy());
365 } 377 }
366 378
367 void PrefService::SetBoolean(const std::string& path, bool value) { 379 void PrefService::SetBoolean(const std::string& path, bool value) {
368 SetUserPrefValue(path, new base::FundamentalValue(value)); 380 SetUserPrefValue(path, new base::FundamentalValue(value));
369 } 381 }
370 382
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 base::Value* value = NULL; 459 base::Value* value = NULL;
448 if (!user_pref_store_->GetMutableValue(path, &value) || 460 if (!user_pref_store_->GetMutableValue(path, &value) ||
449 !value->IsType(type)) { 461 !value->IsType(type)) {
450 if (type == base::Value::TYPE_DICTIONARY) { 462 if (type == base::Value::TYPE_DICTIONARY) {
451 value = new base::DictionaryValue; 463 value = new base::DictionaryValue;
452 } else if (type == base::Value::TYPE_LIST) { 464 } else if (type == base::Value::TYPE_LIST) {
453 value = new base::ListValue; 465 value = new base::ListValue;
454 } else { 466 } else {
455 NOTREACHED(); 467 NOTREACHED();
456 } 468 }
457 user_pref_store_->SetValueSilently(path, value); 469 user_pref_store_->SetValueSilently(path, value, GetWriteFlags(pref));
458 } 470 }
459 return value; 471 return value;
460 } 472 }
461 473
462 void PrefService::ReportUserPrefChanged(const std::string& key) { 474 void PrefService::ReportUserPrefChanged(const std::string& key) {
463 DCHECK(CalledOnValidThread()); 475 DCHECK(CalledOnValidThread());
464 user_pref_store_->ReportValueChanged(key); 476 user_pref_store_->ReportValueChanged(key, GetWriteFlags(FindPreference(key)));
465 } 477 }
466 478
467 void PrefService::SetUserPrefValue(const std::string& path, 479 void PrefService::SetUserPrefValue(const std::string& path,
468 base::Value* new_value) { 480 base::Value* new_value) {
469 scoped_ptr<base::Value> owned_value(new_value); 481 scoped_ptr<base::Value> owned_value(new_value);
470 DCHECK(CalledOnValidThread()); 482 DCHECK(CalledOnValidThread());
471 483
472 const Preference* pref = FindPreference(path); 484 const Preference* pref = FindPreference(path);
473 if (!pref) { 485 if (!pref) {
474 NOTREACHED() << "Trying to write an unregistered pref: " << path; 486 NOTREACHED() << "Trying to write an unregistered pref: " << path;
475 return; 487 return;
476 } 488 }
477 if (pref->GetType() != new_value->GetType()) { 489 if (pref->GetType() != new_value->GetType()) {
478 NOTREACHED() << "Trying to set pref " << path 490 NOTREACHED() << "Trying to set pref " << path
479 << " of type " << pref->GetType() 491 << " of type " << pref->GetType()
480 << " to value of type " << new_value->GetType(); 492 << " to value of type " << new_value->GetType();
481 return; 493 return;
482 } 494 }
483 495
484 user_pref_store_->SetValue(path, owned_value.release()); 496 user_pref_store_->SetValue(path, owned_value.release(), GetWriteFlags(pref));
485 } 497 }
486 498
487 void PrefService::UpdateCommandLinePrefStore(PrefStore* command_line_store) { 499 void PrefService::UpdateCommandLinePrefStore(PrefStore* command_line_store) {
488 pref_value_store_->UpdateCommandLinePrefStore(command_line_store); 500 pref_value_store_->UpdateCommandLinePrefStore(command_line_store);
489 } 501 }
490 502
491 /////////////////////////////////////////////////////////////////////////////// 503 ///////////////////////////////////////////////////////////////////////////////
492 // PrefService::Preference 504 // PrefService::Preference
493 505
494 PrefService::Preference::Preference(const PrefService* service, 506 PrefService::Preference::Preference(const PrefService* service,
495 const std::string& name, 507 const std::string& name,
496 base::Value::Type type) 508 base::Value::Type type)
497 : name_(name), type_(type), pref_service_(service) { 509 : name_(name), type_(type), pref_service_(service) {
498 DCHECK(service); 510 DCHECK(service);
511 // Cache the registration flags at creation time to avoid multiple map lookups
512 // later.
513 registration_flags_ = service->pref_registry_->GetRegistrationFlags(name_);
499 } 514 }
500 515
501 const std::string PrefService::Preference::name() const { 516 const std::string PrefService::Preference::name() const {
502 return name_; 517 return name_;
503 } 518 }
504 519
505 base::Value::Type PrefService::Preference::GetType() const { 520 base::Value::Type PrefService::Preference::GetType() const {
506 return type_; 521 return type_;
507 } 522 }
508 523
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 DCHECK(found_value->IsType(default_type)); 600 DCHECK(found_value->IsType(default_type));
586 return found_value; 601 return found_value;
587 } else { 602 } else {
588 // Every registered preference has at least a default value. 603 // Every registered preference has at least a default value.
589 NOTREACHED() << "no valid value found for registered pref " << path; 604 NOTREACHED() << "no valid value found for registered pref " << path;
590 } 605 }
591 } 606 }
592 607
593 return NULL; 608 return NULL;
594 } 609 }
OLDNEW
« no previous file with comments | « base/prefs/pref_service.h ('k') | base/prefs/pref_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698