Index: base/prefs/pref_service.cc |
diff --git a/base/prefs/pref_service.cc b/base/prefs/pref_service.cc |
index 3ccdae75a961c99611268affc40265dd6a4643ca..6e1d58ca0f163eff22c4048e6691ba3192bec884 100644 |
--- a/base/prefs/pref_service.cc |
+++ b/base/prefs/pref_service.cc |
@@ -38,6 +38,19 @@ class ReadErrorHandler : public PersistentPrefStore::ReadErrorDelegate { |
base::Callback<void(PersistentPrefStore::PrefReadError)> callback_; |
}; |
+// Returns the WriteablePrefStore::PrefWriteFlags for the pref with the given |
+// |path|. |
+uint32 GetWriteFlags(const PrefService::Preference* pref) { |
+ uint32 write_flags = WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS; |
+ |
+ if (!pref) |
+ return write_flags; |
+ |
+ if (pref->registration_flags() & PrefRegistry::LOSSY_PREF) |
+ write_flags |= WriteablePrefStore::LOSSY_PREF_WRITE_FLAG; |
+ return write_flags; |
+} |
+ |
} // namespace |
PrefService::PrefService( |
@@ -177,8 +190,7 @@ scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValues() const { |
DCHECK(CalledOnValidThread()); |
scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue); |
for (const auto& it : *pref_registry_) { |
- const base::Value* value = GetPreferenceValue(it.first); |
- out->Set(it.first, value->DeepCopy()); |
+ out->Set(it.first, GetPreferenceValue(it.first)->CreateDeepCopy()); |
} |
return out.Pass(); |
} |
@@ -191,7 +203,7 @@ scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValuesOmitDefaults() |
const Preference* pref = FindPreference(it.first); |
if (pref->IsDefaultValue()) |
continue; |
- out->Set(it.first, pref->GetValue()->DeepCopy()); |
+ out->Set(it.first, pref->GetValue()->CreateDeepCopy()); |
} |
return out.Pass(); |
} |
@@ -203,7 +215,7 @@ PrefService::GetPreferenceValuesWithoutPathExpansion() const { |
for (const auto& it : *pref_registry_) { |
const base::Value* value = GetPreferenceValue(it.first); |
DCHECK(value); |
- out->SetWithoutPathExpansion(it.first, value->DeepCopy()); |
+ out->SetWithoutPathExpansion(it.first, value->CreateDeepCopy()); |
} |
return out.Pass(); |
} |
@@ -357,7 +369,7 @@ void PrefService::ClearPref(const std::string& path) { |
NOTREACHED() << "Trying to clear an unregistered pref: " << path; |
return; |
} |
- user_pref_store_->RemoveValue(path); |
+ user_pref_store_->RemoveValue(path, GetWriteFlags(pref)); |
} |
void PrefService::Set(const std::string& path, const base::Value& value) { |
@@ -454,14 +466,14 @@ base::Value* PrefService::GetMutableUserPref(const std::string& path, |
} else { |
NOTREACHED(); |
} |
- user_pref_store_->SetValueSilently(path, value); |
+ user_pref_store_->SetValueSilently(path, value, GetWriteFlags(pref)); |
} |
return value; |
} |
void PrefService::ReportUserPrefChanged(const std::string& key) { |
DCHECK(CalledOnValidThread()); |
- user_pref_store_->ReportValueChanged(key); |
+ user_pref_store_->ReportValueChanged(key, GetWriteFlags(FindPreference(key))); |
} |
void PrefService::SetUserPrefValue(const std::string& path, |
@@ -481,7 +493,7 @@ void PrefService::SetUserPrefValue(const std::string& path, |
return; |
} |
- user_pref_store_->SetValue(path, owned_value.release()); |
+ user_pref_store_->SetValue(path, owned_value.release(), GetWriteFlags(pref)); |
} |
void PrefService::UpdateCommandLinePrefStore(PrefStore* command_line_store) { |
@@ -496,6 +508,9 @@ PrefService::Preference::Preference(const PrefService* service, |
base::Value::Type type) |
: name_(name), type_(type), pref_service_(service) { |
DCHECK(service); |
+ // Cache the registration flags at creation time to avoid multiple map lookups |
+ // later. |
+ registration_flags_ = service->pref_registry_->GetRegistrationFlags(name_); |
} |
const std::string PrefService::Preference::name() const { |