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

Unified Diff: base/prefs/json_pref_store.cc

Issue 257003007: Introduce a new framework for back-and-forth tracked/protected preferences migration. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months 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 b0a16cc11431e01fd8661949388c11cdc972f156..8dc46fedfaf3ee7b925d197e0b7cc845ab787705 100644
--- a/base/prefs/json_pref_store.cc
+++ b/base/prefs/json_pref_store.cc
@@ -59,7 +59,7 @@ class FileThreadDeserializer
// Reports deserialization result on the origin thread.
void ReportOnOriginThread() {
DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
- delegate_->OnFileRead(value_.release(), error_, no_dir_);
+ delegate_->OnFileRead(value_.Pass(), error_, no_dir_);
}
static base::Value* DoReading(const base::FilePath& path,
@@ -234,15 +234,16 @@ PersistentPrefStore::PrefReadError JsonPrefStore::GetReadError() const {
PersistentPrefStore::PrefReadError JsonPrefStore::ReadPrefs() {
if (path_.empty()) {
- OnFileRead(NULL, PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
+ OnFileRead(
+ scoped_ptr<base::Value>(), PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
return PREF_READ_ERROR_FILE_NOT_SPECIFIED;
}
PrefReadError error;
bool no_dir;
- base::Value* value =
- FileThreadDeserializer::DoReading(path_, &error, &no_dir);
- OnFileRead(value, error, no_dir);
+ scoped_ptr<base::Value> value(
+ FileThreadDeserializer::DoReading(path_, &error, &no_dir));
+ OnFileRead(value.Pass(), error, no_dir);
return error;
}
@@ -250,7 +251,8 @@ void JsonPrefStore::ReadPrefsAsync(ReadErrorDelegate *error_delegate) {
initialized_ = false;
error_delegate_.reset(error_delegate);
if (path_.empty()) {
- OnFileRead(NULL, PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
+ OnFileRead(
+ scoped_ptr<base::Value>(), PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
return;
}
@@ -276,53 +278,60 @@ void JsonPrefStore::ReportValueChanged(const std::string& key) {
writer_.ScheduleWrite(this);
}
-void JsonPrefStore::OnFileRead(base::Value* value_owned,
+void JsonPrefStore::InterceptNextFileRead(
+ const OnFileReadInterceptor& on_file_read_interceptor) {
+ on_file_read_interceptor_.reset(
+ new OnFileReadInterceptor(on_file_read_interceptor));
+}
+
+void JsonPrefStore::OnFileRead(scoped_ptr<base::Value> value,
PersistentPrefStore::PrefReadError error,
bool no_dir) {
- scoped_ptr<base::Value> value(value_owned);
- read_error_ = error;
+ scoped_ptr<base::DictionaryValue> unprocessed_prefs(
+ new base::DictionaryValue);
- if (no_dir) {
- FOR_EACH_OBSERVER(PrefStore::Observer,
- observers_,
- OnInitializationCompleted(false));
- return;
- }
+ read_error_ = error;
- initialized_ = true;
+ bool initialization_successful = !no_dir;
- switch (error) {
- case PREF_READ_ERROR_ACCESS_DENIED:
- case PREF_READ_ERROR_FILE_OTHER:
- case PREF_READ_ERROR_FILE_LOCKED:
- case PREF_READ_ERROR_JSON_TYPE:
- case PREF_READ_ERROR_FILE_NOT_SPECIFIED:
- read_only_ = true;
- break;
- case PREF_READ_ERROR_NONE:
- DCHECK(value.get());
- prefs_.reset(static_cast<base::DictionaryValue*>(value.release()));
- break;
- case PREF_READ_ERROR_NO_FILE:
- // If the file just doesn't exist, maybe this is first run. In any case
- // there's no harm in writing out default prefs in this case.
- break;
- case PREF_READ_ERROR_JSON_PARSE:
- case PREF_READ_ERROR_JSON_REPEAT:
- break;
- default:
- NOTREACHED() << "Unknown error: " << error;
+ if (initialization_successful) {
+ switch (error) {
+ case PREF_READ_ERROR_ACCESS_DENIED:
+ case PREF_READ_ERROR_FILE_OTHER:
+ case PREF_READ_ERROR_FILE_LOCKED:
+ case PREF_READ_ERROR_JSON_TYPE:
+ case PREF_READ_ERROR_FILE_NOT_SPECIFIED:
+ read_only_ = true;
+ break;
+ case PREF_READ_ERROR_NONE:
+ DCHECK(value.get());
+ unprocessed_prefs.reset(
+ static_cast<base::DictionaryValue*>(value.release()));
+ break;
+ case PREF_READ_ERROR_NO_FILE:
+ // If the file just doesn't exist, maybe this is first run. In any case
+ // there's no harm in writing out default prefs in this case.
+ break;
+ case PREF_READ_ERROR_JSON_PARSE:
+ case PREF_READ_ERROR_JSON_REPEAT:
+ break;
+ default:
Bernhard Bauer 2014/04/29 15:13:04 Could we get rid of the default statement?
gab 2014/04/29 15:46:44 Yes, if we provide a case for PREF_READ_ERROR_MAX_
+ NOTREACHED() << "Unknown error: " << error;
+ }
}
- if (pref_filter_ && pref_filter_->FilterOnLoad(prefs_.get()))
- writer_.ScheduleWrite(this);
-
- if (error_delegate_.get() && error != PREF_READ_ERROR_NONE)
- error_delegate_->OnError(error);
-
- FOR_EACH_OBSERVER(PrefStore::Observer,
- observers_,
- OnInitializationCompleted(true));
+ if (on_file_read_interceptor_) {
+ const FinalizePrefsReadCallback finalize_file_read(
+ base::Bind(&JsonPrefStore::FinalizeFileRead, this,
+ initialization_successful));
+ on_file_read_interceptor_->Run(unprocessed_prefs.Pass(),
+ read_only_,
+ finalize_file_read);
+ on_file_read_interceptor_.reset();
+ } else {
+ FinalizeFileRead(initialization_successful, unprocessed_prefs.Pass(),
+ false);
+ }
}
JsonPrefStore::~JsonPrefStore() {
@@ -337,3 +346,31 @@ bool JsonPrefStore::SerializeData(std::string* output) {
serializer.set_pretty_print(true);
return serializer.Serialize(*prefs_);
}
+
+void JsonPrefStore::FinalizeFileRead(bool initialization_successful,
+ scoped_ptr<base::DictionaryValue> prefs,
+ bool schedule_write) {
+ if (!initialization_successful) {
+ FOR_EACH_OBSERVER(PrefStore::Observer,
+ observers_,
+ OnInitializationCompleted(false));
+ return;
+ }
+
+ prefs_ = prefs.Pass();
+
+ initialized_ = true;
+
+ const bool had_filter_modification =
Bernhard Bauer 2014/04/29 15:13:04 Nit: we don't usually mark local variables as cons
gab 2014/04/29 15:46:44 Sure, I like putting const as much as possible whe
+ pref_filter_ && pref_filter_->FilterOnLoad(prefs_.get());
+
+ if ((schedule_write || had_filter_modification) && !read_only_)
+ writer_.ScheduleWrite(this);
+
+ if (error_delegate_.get() && read_error_ != PREF_READ_ERROR_NONE)
Bernhard Bauer 2014/04/29 15:13:04 You could probably leave out the .get().
gab 2014/04/29 15:46:44 Done.
+ error_delegate_->OnError(read_error_);
+
+ FOR_EACH_OBSERVER(PrefStore::Observer,
+ observers_,
+ OnInitializationCompleted(true));
+}

Powered by Google App Engine
This is Rietveld 408576698