| Index: base/prefs/json_pref_store.cc
|
| diff --git a/base/prefs/json_pref_store.cc b/base/prefs/json_pref_store.cc
|
| index e230407043aea5ebc29056618ece54571e274b9c..e0391ff72bb8168bb49d7bcf148bae1d095a4116 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) {}
|
|
|
| @@ -268,7 +271,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())
|
| + pref_filter_->FilterUpdate(this, key);
|
| + FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key));
|
| + }
|
| +
|
| if (!read_only_)
|
| writer_.ScheduleWrite(this);
|
| }
|
| @@ -286,8 +296,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:
|
| @@ -299,6 +307,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
|
| @@ -311,6 +321,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);
|
|
|
|
|