Index: chrome/browser/prefs/pref_service.cc |
diff --git a/chrome/browser/prefs/pref_service.cc b/chrome/browser/prefs/pref_service.cc |
index 9071f24898abe56a4e2f85186565ff74c218e880..0e499db776af827c5f793e08ce1e1ee10f9a3d34 100644 |
--- a/chrome/browser/prefs/pref_service.cc |
+++ b/chrome/browser/prefs/pref_service.cc |
@@ -86,16 +86,8 @@ void NotifyReadError(PrefService* pref, int message_id) { |
// static |
PrefService* PrefService::CreatePrefService(const FilePath& pref_filename, |
PrefStore* extension_prefs, |
- Profile* profile) { |
- return CreatePrefServiceAsync(pref_filename, extension_prefs, profile, NULL); |
-} |
- |
-// static |
-PrefService* PrefService::CreatePrefServiceAsync( |
- const FilePath& pref_filename, |
- PrefStore* extension_prefs, |
- Profile* profile, |
- PrefServiceDelegate* delegate) { |
+ Profile* profile, |
+ bool async) { |
using policy::ConfigurationPolicyPrefStore; |
#if defined(OS_LINUX) |
@@ -127,14 +119,19 @@ PrefService* PrefService::CreatePrefServiceAsync( |
profile); |
DefaultPrefStore* default_pref_store = new DefaultPrefStore(); |
- return new PrefService(managed_platform, managed_cloud, extension_prefs, |
- command_line, user, recommended_platform, |
- recommended_cloud, default_pref_store, delegate); |
+ PrefService* service = new PrefService( |
+ managed_platform, managed_cloud, extension_prefs, |
+ command_line, user, recommended_platform, |
+ recommended_cloud, default_pref_store); |
+ service->InitFromStorage(async); |
+ return service; |
} |
PrefService* PrefService::CreateIncognitoPrefService( |
PrefStore* incognito_extension_prefs) { |
- return new PrefService(*this, incognito_extension_prefs); |
+ PrefService* service = new PrefService(*this, incognito_extension_prefs); |
+ service->InitFromStorage(false); |
+ return service; |
} |
PrefService::PrefService(PrefStore* managed_platform_prefs, |
@@ -144,11 +141,9 @@ PrefService::PrefService(PrefStore* managed_platform_prefs, |
PersistentPrefStore* user_prefs, |
PrefStore* recommended_platform_prefs, |
PrefStore* recommended_cloud_prefs, |
- DefaultPrefStore* default_store, |
- PrefServiceDelegate* delegate) |
+ DefaultPrefStore* default_store) |
: user_pref_store_(user_prefs), |
- default_store_(default_store), |
- delegate_(delegate) { |
+ default_store_(default_store) { |
pref_notifier_.reset(new PrefNotifierImpl(this)); |
pref_value_store_.reset( |
new PrefValueStore(managed_platform_prefs, |
@@ -160,15 +155,13 @@ PrefService::PrefService(PrefStore* managed_platform_prefs, |
recommended_cloud_prefs, |
default_store, |
pref_notifier_.get())); |
- InitFromStorage(); |
} |
PrefService::PrefService(const PrefService& original, |
PrefStore* incognito_extension_prefs) |
: user_pref_store_( |
new OverlayPersistentPrefStore(original.user_pref_store_.get())), |
- default_store_(original.default_store_.get()), |
- delegate_(NULL) { |
+ default_store_(original.default_store_.get()) { |
pref_notifier_.reset(new PrefNotifierImpl(this)); |
pref_value_store_.reset(original.pref_value_store_->CloneAndSpecialize( |
NULL, // managed_platform_prefs |
@@ -180,7 +173,6 @@ PrefService::PrefService(const PrefService& original, |
NULL, // recommended_cloud_prefs |
default_store_.get(), |
pref_notifier_.get())); |
- InitFromStorage(); |
} |
PrefService::~PrefService() { |
@@ -194,14 +186,19 @@ PrefService::~PrefService() { |
default_store_ = NULL; |
} |
-void PrefService::OnPrefsRead(PersistentPrefStore::PrefReadError error, |
- bool no_dir) { |
- if (no_dir) { |
+void PrefService::OnInitializationCompleted() { |
+ // This is the only message PrefService is waiting for, so remove us from the |
+ // observers list. |
+ user_pref_store_->RemoveObserver(this); |
+ |
+ PersistentPrefStore::PrefReadError error; |
+ bool is_fatal; |
+ user_pref_store_->GetErrors(&error, &is_fatal); |
+ if (is_fatal) { |
// Bad news. When profile is created, the process that creates the directory |
// is explicitly started. So if directory is missing it probably means that |
// Chromium hasn't sufficient privileges. |
- CHECK(delegate_); |
- delegate_->OnPrefsLoaded(this, false); |
+ pref_notifier_->OnPersistentPrefsRead(false); |
return; |
} |
@@ -222,19 +219,15 @@ void PrefService::OnPrefsRead(PersistentPrefStore::PrefReadError error, |
} |
UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 20); |
} |
- |
- if (delegate_) |
- delegate_->OnPrefsLoaded(this, true); |
+ pref_notifier_->OnPersistentPrefsRead(true); |
} |
-void PrefService::InitFromStorage() { |
- if (!delegate_) { |
- const PersistentPrefStore::PrefReadError error = |
- user_pref_store_->ReadPrefs(); |
- OnPrefsRead(error, false); |
+void PrefService::InitFromStorage(bool async) { |
+ user_pref_store_->AddObserver(this); |
+ if (!async) { |
+ user_pref_store_->ReadPrefs(); |
} else { |
- // todo(altimofeev): move this method to PersistentPrefStore interface. |
- (static_cast<JsonPrefStore*>(user_pref_store_.get()))->ReadPrefs(this); |
+ user_pref_store_.get()->ReadPrefsAsync(); |
} |
} |