Index: base/prefs/json_pref_store.cc |
diff --git a/base/prefs/json_pref_store.cc b/base/prefs/json_pref_store.cc |
index ad97b8459cb1c5c614f021d2a24408c10e9c3df3..d9524f42fab85758bc3e922133a406bf8e996393 100644 |
--- a/base/prefs/json_pref_store.cc |
+++ b/base/prefs/json_pref_store.cc |
@@ -13,6 +13,7 @@ |
#include "base/json/json_string_value_serializer.h" |
#include "base/memory/ref_counted.h" |
#include "base/message_loop/message_loop_proxy.h" |
+#include "base/prefs/pref_filter.h" |
#include "base/sequenced_task_runner.h" |
#include "base/threading/sequenced_worker_pool.h" |
#include "base/values.h" |
@@ -151,12 +152,14 @@ scoped_refptr<base::SequencedTaskRunner> JsonPrefStore::GetTaskRunnerForFile( |
} |
JsonPrefStore::JsonPrefStore(const base::FilePath& filename, |
- base::SequencedTaskRunner* sequenced_task_runner) |
+ 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), |
read_error_(PREF_READ_ERROR_OTHER) {} |
@@ -264,7 +267,14 @@ void JsonPrefStore::CommitPendingWrite() { |
} |
void JsonPrefStore::ReportValueChanged(const std::string& key) { |
- FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); |
+ // Don't notify observers about changes during initialization (i.e., due to |
+ // filters). |
+ if (initialized_) { |
+ if (pref_filter_.get()) |
Bernhard Bauer
2013/12/10 16:52:07
Nit: scoped_ptr has a bool() operator, so the .get
|
+ pref_filter_->FilterUpdate(this, key); |
+ FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); |
+ } |
+ |
if (!read_only_) |
writer_.ScheduleWrite(this); |
} |
@@ -282,8 +292,6 @@ void JsonPrefStore::OnFileRead(base::Value* value_owned, |
return; |
} |
- initialized_ = true; |
- |
switch (error) { |
case PREF_READ_ERROR_ACCESS_DENIED: |
case PREF_READ_ERROR_FILE_OTHER: |
@@ -295,6 +303,8 @@ void JsonPrefStore::OnFileRead(base::Value* value_owned, |
case PREF_READ_ERROR_NONE: |
DCHECK(value.get()); |
prefs_.reset(static_cast<base::DictionaryValue*>(value.release())); |
+ if (pref_filter_.get()) |
+ pref_filter_->FilterOnLoad(this); |
break; |
case PREF_READ_ERROR_NO_FILE: |
// If the file just doesn't exist, maybe this is first run. In any case |
@@ -307,6 +317,8 @@ void JsonPrefStore::OnFileRead(base::Value* value_owned, |
NOTREACHED() << "Unknown error: " << error; |
} |
+ initialized_ = true; |
+ |
if (error_delegate_.get() && error != PREF_READ_ERROR_NONE) |
error_delegate_->OnError(error); |