| 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();
|
| }
|
| }
|
|
|
|
|