Index: components/prefs/json_pref_store.cc |
diff --git a/components/prefs/json_pref_store.cc b/components/prefs/json_pref_store.cc |
index 884829a7ac0392dd603417fba068896be475d372..e91a4063f7bf4307486017741afe8b666a27c25d 100644 |
--- a/components/prefs/json_pref_store.cc |
+++ b/components/prefs/json_pref_store.cc |
@@ -173,7 +173,7 @@ JsonPrefStore::JsonPrefStore( |
pending_lossy_write_(false), |
read_error_(PREF_READ_ERROR_NONE), |
has_pending_successful_write_reply_(false), |
- has_pending_write_callback_(false), |
+ has_pending_write_callbacks_(false), |
write_count_histogram_(writer_.commit_interval(), path_) { |
DCHECK(!path_.empty()); |
} |
@@ -330,7 +330,7 @@ void JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback( |
bool write_success) { |
DCHECK(CalledOnValidThread()); |
- has_pending_write_callback_ = false; |
+ has_pending_write_callbacks_ = false; |
if (has_pending_successful_write_reply_) { |
has_pending_successful_write_reply_ = false; |
if (write_success) { |
@@ -364,31 +364,35 @@ void JsonPrefStore::RegisterOnNextSuccessfulWriteReply( |
has_pending_successful_write_reply_ = true; |
on_next_successful_write_reply_ = on_next_successful_write_reply; |
- // If there already is a pending callback, avoid erasing it; the reply will |
- // be used as we set |on_next_successful_write_reply_|. Otherwise, setup a |
- // reply with an empty callback. |
- if (!has_pending_write_callback_) { |
- writer_.RegisterOnNextWriteCallback(base::Bind( |
- &PostWriteCallback, |
- base::Bind(&JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback, |
- AsWeakPtr()), |
- base::Callback<void(bool success)>(), |
- base::SequencedTaskRunnerHandle::Get())); |
+ // If there are pending callbacks, avoid erasing them; the reply will be used |
+ // as we set |on_next_successful_write_reply_|. Otherwise, setup a reply with |
+ // an empty callback. |
+ if (!has_pending_write_callbacks_) { |
+ writer_.RegisterOnNextWriteCallbacks( |
+ base::Closure(), |
+ base::Bind( |
+ &PostWriteCallback, |
+ base::Bind(&JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback, |
+ AsWeakPtr()), |
+ base::Callback<void(bool success)>(), |
+ base::SequencedTaskRunnerHandle::Get())); |
} |
} |
-void JsonPrefStore::RegisterOnNextWriteSynchronousCallback( |
- const base::Callback<void(bool success)>& on_next_write_callback) { |
+void JsonPrefStore::RegisterOnNextWriteSynchronousCallbacks( |
+ OnWriteCallbackPair callbacks) { |
DCHECK(CalledOnValidThread()); |
- DCHECK(!has_pending_write_callback_); |
+ DCHECK(!has_pending_write_callbacks_); |
- has_pending_write_callback_ = true; |
+ has_pending_write_callbacks_ = true; |
- writer_.RegisterOnNextWriteCallback(base::Bind( |
- &PostWriteCallback, |
- base::Bind(&JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback, |
- AsWeakPtr()), |
- on_next_write_callback, base::SequencedTaskRunnerHandle::Get())); |
+ writer_.RegisterOnNextWriteCallbacks( |
+ callbacks.first, |
+ base::Bind( |
+ &PostWriteCallback, |
+ base::Bind(&JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback, |
+ AsWeakPtr()), |
+ callbacks.second, base::SequencedTaskRunnerHandle::Get())); |
} |
void JsonPrefStore::ClearMutableValues() { |
@@ -462,8 +466,12 @@ bool JsonPrefStore::SerializeData(std::string* output) { |
write_count_histogram_.RecordWriteOccured(); |
- if (pref_filter_) |
- pref_filter_->FilterSerializeData(prefs_.get()); |
+ if (pref_filter_) { |
+ OnWriteCallbackPair callbacks = |
+ pref_filter_->FilterSerializeData(prefs_.get()); |
+ if (!callbacks.first.is_null() || !callbacks.second.is_null()) |
+ RegisterOnNextWriteSynchronousCallbacks(callbacks); |
+ } |
JSONStringValueSerializer serializer(output); |
// Not pretty-printing prefs shrinks pref file size by ~30%. To obtain |