| Index: base/prefs/json_pref_store.cc
|
| diff --git a/base/prefs/json_pref_store.cc b/base/prefs/json_pref_store.cc
|
| index 416e43fce74862df138cf1a671f78dacf946e9de..da545b8634cfd1aff408204fe1638043a6ee57cc 100644
|
| --- a/base/prefs/json_pref_store.cc
|
| +++ b/base/prefs/json_pref_store.cc
|
| @@ -150,17 +150,10 @@ JsonPrefStore::JsonPrefStore(
|
| const base::FilePath& filename,
|
| const scoped_refptr<base::SequencedTaskRunner>& sequenced_task_runner,
|
| scoped_ptr<PrefFilter> pref_filter)
|
| - : path_(filename),
|
| - sequenced_task_runner_(sequenced_task_runner),
|
| - prefs_(new base::DictionaryValue()),
|
| - read_only_(false),
|
| - writer_(filename, sequenced_task_runner),
|
| - pref_filter_(pref_filter.Pass()),
|
| - initialized_(false),
|
| - filtering_in_progress_(false),
|
| - read_error_(PREF_READ_ERROR_NONE),
|
| - write_count_histogram_(writer_.commit_interval(), path_) {
|
| - DCHECK(!path_.empty());
|
| + : JsonPrefStore(filename,
|
| + base::FilePath(),
|
| + sequenced_task_runner,
|
| + pref_filter.Pass()) {
|
| }
|
|
|
| JsonPrefStore::JsonPrefStore(
|
| @@ -177,6 +170,7 @@ JsonPrefStore::JsonPrefStore(
|
| pref_filter_(pref_filter.Pass()),
|
| initialized_(false),
|
| filtering_in_progress_(false),
|
| + pending_lossy_write_(false),
|
| read_error_(PREF_READ_ERROR_NONE),
|
| write_count_histogram_(writer_.commit_interval(), path_) {
|
| DCHECK(!path_.empty());
|
| @@ -226,7 +220,9 @@ bool JsonPrefStore::GetMutableValue(const std::string& key,
|
| return prefs_->Get(key, result);
|
| }
|
|
|
| -void JsonPrefStore::SetValue(const std::string& key, base::Value* value) {
|
| +void JsonPrefStore::SetValue(const std::string& key,
|
| + base::Value* value,
|
| + uint32 flags) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| DCHECK(value);
|
| @@ -234,13 +230,14 @@ void JsonPrefStore::SetValue(const std::string& key, base::Value* value) {
|
| base::Value* old_value = NULL;
|
| prefs_->Get(key, &old_value);
|
| if (!old_value || !value->Equals(old_value)) {
|
| - prefs_->Set(key, new_value.release());
|
| - ReportValueChanged(key);
|
| + prefs_->Set(key, new_value.Pass());
|
| + ReportValueChanged(key, flags);
|
| }
|
| }
|
|
|
| void JsonPrefStore::SetValueSilently(const std::string& key,
|
| - base::Value* value) {
|
| + base::Value* value,
|
| + uint32 flags) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| DCHECK(value);
|
| @@ -248,25 +245,23 @@ void JsonPrefStore::SetValueSilently(const std::string& key,
|
| base::Value* old_value = NULL;
|
| prefs_->Get(key, &old_value);
|
| if (!old_value || !value->Equals(old_value)) {
|
| - prefs_->Set(key, new_value.release());
|
| - if (!read_only_)
|
| - writer_.ScheduleWrite(this);
|
| + prefs_->Set(key, new_value.Pass());
|
| + ScheduleWrite(flags);
|
| }
|
| }
|
|
|
| -void JsonPrefStore::RemoveValue(const std::string& key) {
|
| +void JsonPrefStore::RemoveValue(const std::string& key, uint32 flags) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| if (prefs_->RemovePath(key, NULL))
|
| - ReportValueChanged(key);
|
| + ReportValueChanged(key, flags);
|
| }
|
|
|
| -void JsonPrefStore::RemoveValueSilently(const std::string& key) {
|
| +void JsonPrefStore::RemoveValueSilently(const std::string& key, uint32 flags) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| prefs_->RemovePath(key, NULL);
|
| - if (!read_only_)
|
| - writer_.ScheduleWrite(this);
|
| + ScheduleWrite(flags);
|
| }
|
|
|
| bool JsonPrefStore::ReadOnly() const {
|
| @@ -306,11 +301,16 @@ void JsonPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) {
|
| void JsonPrefStore::CommitPendingWrite() {
|
| DCHECK(CalledOnValidThread());
|
|
|
| + // Schedule a write for any lossy writes that are outstanding to ensure that
|
| + // they get flushed when this function is called.
|
| + if (pending_lossy_write_)
|
| + writer_.ScheduleWrite(this);
|
| +
|
| if (writer_.HasPendingWrite() && !read_only_)
|
| writer_.DoScheduledWrite();
|
| }
|
|
|
| -void JsonPrefStore::ReportValueChanged(const std::string& key) {
|
| +void JsonPrefStore::ReportValueChanged(const std::string& key, uint32 flags) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| if (pref_filter_)
|
| @@ -318,8 +318,7 @@ void JsonPrefStore::ReportValueChanged(const std::string& key) {
|
|
|
| FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key));
|
|
|
| - if (!read_only_)
|
| - writer_.ScheduleWrite(this);
|
| + ScheduleWrite(flags);
|
| }
|
|
|
| void JsonPrefStore::RegisterOnNextSuccessfulWriteCallback(
|
| @@ -398,6 +397,8 @@ JsonPrefStore::~JsonPrefStore() {
|
| bool JsonPrefStore::SerializeData(std::string* output) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| + pending_lossy_write_ = false;
|
| +
|
| write_count_histogram_.RecordWriteOccured();
|
|
|
| if (pref_filter_)
|
| @@ -429,8 +430,8 @@ void JsonPrefStore::FinalizeFileRead(bool initialization_successful,
|
|
|
| initialized_ = true;
|
|
|
| - if (schedule_write && !read_only_)
|
| - writer_.ScheduleWrite(this);
|
| + if (schedule_write)
|
| + ScheduleWrite(DEFAULT_PREF_WRITE_FLAGS);
|
|
|
| if (error_delegate_ && read_error_ != PREF_READ_ERROR_NONE)
|
| error_delegate_->OnError(read_error_);
|
| @@ -442,6 +443,16 @@ void JsonPrefStore::FinalizeFileRead(bool initialization_successful,
|
| return;
|
| }
|
|
|
| +void JsonPrefStore::ScheduleWrite(uint32 flags) {
|
| + if (read_only_)
|
| + return;
|
| +
|
| + if (flags & LOSSY_PREF_WRITE_FLAG)
|
| + pending_lossy_write_ = true;
|
| + else
|
| + writer_.ScheduleWrite(this);
|
| +}
|
| +
|
| // NOTE: This value should NOT be changed without renaming the histogram
|
| // otherwise it will create incompatible buckets.
|
| const int32_t
|
|
|