Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Unified Diff: base/prefs/json_pref_store.cc

Issue 90563003: Fix a race condition in preference metric reporting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « base/prefs/json_pref_store.h ('k') | base/prefs/pref_filter.h » ('j') | base/prefs/pref_filter.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698