| Index: chrome/browser/profiles/profile_impl.cc
|
| diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
|
| index 9540a394521a5049217751cfc5cecf089f5cfd67..f6541f6100ecd2a2993c8af6e87d740274d6a961 100644
|
| --- a/chrome/browser/profiles/profile_impl.cc
|
| +++ b/chrome/browser/profiles/profile_impl.cc
|
| @@ -287,18 +287,25 @@ ProfileImpl::ProfileImpl(const FilePath& path,
|
| &ProfileImpl::EnsureSessionServiceCreated);
|
|
|
| if (delegate_) {
|
| - prefs_.reset(PrefService::CreatePrefServiceAsync(
|
| + // Wait for the notifcation that prefs has been loaded (successfully or
|
| + // not).
|
| + registrar_.Add(this, NotificationType::PREF_INITIALIZATION_COMPLETED,
|
| + Source<Profile>(this));
|
| + registrar_.Add(this, NotificationType::PREF_INITIALIZATION_FAILED,
|
| + Source<Profile>(this));
|
| + prefs_.reset(PrefService::CreatePrefService(
|
| GetPrefFilePath(),
|
| new ExtensionPrefStore(GetExtensionPrefValueMap(), false),
|
| GetOriginalProfile(),
|
| - this)); // Ask to notify us in the end.
|
| + true));
|
| } else {
|
| // Load prefs synchronously.
|
| prefs_.reset(PrefService::CreatePrefService(
|
| GetPrefFilePath(),
|
| new ExtensionPrefStore(GetExtensionPrefValueMap(), false),
|
| - GetOriginalProfile()));
|
| - OnPrefsLoaded(prefs_.get(), true);
|
| + GetOriginalProfile(),
|
| + false));
|
| + OnPrefsLoaded(true);
|
| }
|
| }
|
|
|
| @@ -797,9 +804,7 @@ net::TransportSecurityState*
|
| return transport_security_state_.get();
|
| }
|
|
|
| -void ProfileImpl::OnPrefsLoaded(PrefService* prefs, bool success) {
|
| - DCHECK(prefs == prefs_.get());
|
| -
|
| +void ProfileImpl::OnPrefsLoaded(bool success) {
|
| if (!success) {
|
| DCHECK(delegate_);
|
| delegate_->OnProfileCreated(this, false);
|
| @@ -1317,33 +1322,50 @@ void ProfileImpl::MarkAsCleanShutdown() {
|
| void ProfileImpl::Observe(NotificationType type,
|
| const NotificationSource& source,
|
| const NotificationDetails& details) {
|
| - if (NotificationType::PREF_CHANGED == type) {
|
| - std::string* pref_name_in = Details<std::string>(details).ptr();
|
| - PrefService* prefs = Source<PrefService>(source).ptr();
|
| - DCHECK(pref_name_in && prefs);
|
| - if (*pref_name_in == prefs::kSpellCheckDictionary ||
|
| - *pref_name_in == prefs::kEnableSpellCheck) {
|
| - ReinitializeSpellCheckHost(true);
|
| - } else if (*pref_name_in == prefs::kEnableAutoSpellCorrect) {
|
| - NotificationService::current()->Notify(
|
| - NotificationType::SPELLCHECK_AUTOSPELL_TOGGLED,
|
| - Source<Profile>(this), NotificationService::NoDetails());
|
| - } else if (*pref_name_in == prefs::kClearSiteDataOnExit) {
|
| - clear_local_state_on_exit_ =
|
| - prefs->GetBoolean(prefs::kClearSiteDataOnExit);
|
| - if (webkit_context_) {
|
| - webkit_context_->set_clear_local_state_on_exit(
|
| - clear_local_state_on_exit_);
|
| - }
|
| - if (appcache_service_) {
|
| - appcache_service_->SetClearLocalStateOnExit(
|
| - clear_local_state_on_exit_);
|
| + bool initialization_succeeded = true;
|
| + switch (type.value) {
|
| + case NotificationType::PREF_INITIALIZATION_FAILED:
|
| + initialization_succeeded = false;
|
| + // Fall through.
|
| + case NotificationType::PREF_INITIALIZATION_COMPLETED:
|
| + registrar_.Remove(this, NotificationType::PREF_INITIALIZATION_COMPLETED,
|
| + Source<Profile>(this));
|
| + registrar_.Remove(this, NotificationType::PREF_INITIALIZATION_FAILED,
|
| + Source<Profile>(this));
|
| + OnPrefsLoaded(initialization_succeeded);
|
| + break;
|
| + case NotificationType::PREF_CHANGED: {
|
| + std::string* pref_name_in = Details<std::string>(details).ptr();
|
| + PrefService* prefs = Source<PrefService>(source).ptr();
|
| + DCHECK(pref_name_in && prefs);
|
| + if (*pref_name_in == prefs::kSpellCheckDictionary ||
|
| + *pref_name_in == prefs::kEnableSpellCheck) {
|
| + ReinitializeSpellCheckHost(true);
|
| + } else if (*pref_name_in == prefs::kEnableAutoSpellCorrect) {
|
| + NotificationService::current()->Notify(
|
| + NotificationType::SPELLCHECK_AUTOSPELL_TOGGLED,
|
| + Source<Profile>(this), NotificationService::NoDetails());
|
| + } else if (*pref_name_in == prefs::kClearSiteDataOnExit) {
|
| + clear_local_state_on_exit_ =
|
| + prefs->GetBoolean(prefs::kClearSiteDataOnExit);
|
| + if (webkit_context_) {
|
| + webkit_context_->set_clear_local_state_on_exit(
|
| + clear_local_state_on_exit_);
|
| + }
|
| + if (appcache_service_) {
|
| + appcache_service_->SetClearLocalStateOnExit(
|
| + clear_local_state_on_exit_);
|
| + }
|
| }
|
| + break;
|
| }
|
| - } else if (NotificationType::BOOKMARK_MODEL_LOADED == type) {
|
| - GetProfileSyncService(); // Causes lazy-load if sync is enabled.
|
| - registrar_.Remove(this, NotificationType::BOOKMARK_MODEL_LOADED,
|
| - Source<Profile>(this));
|
| + case NotificationType::BOOKMARK_MODEL_LOADED:
|
| + GetProfileSyncService(); // Causes lazy-load if sync is enabled.
|
| + registrar_.Remove(this, NotificationType::BOOKMARK_MODEL_LOADED,
|
| + Source<Profile>(this));
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| }
|
| }
|
|
|
|
|