| Index: chrome/browser/prefs/pref_service.cc
|
| diff --git a/chrome/browser/prefs/pref_service.cc b/chrome/browser/prefs/pref_service.cc
|
| index 5096d1d73cfcc8bee6fc8da7e0f69ea919a37fc0..5614bbfbe209539797df55887342d5fa9b3b3faf 100644
|
| --- a/chrome/browser/prefs/pref_service.cc
|
| +++ b/chrome/browser/prefs/pref_service.cc
|
| @@ -79,25 +79,41 @@ Value* CreateLocaleDefaultValue(Value::ValueType type, int message_id) {
|
|
|
| // Forwards a notification after a PostMessage so that we can wait for the
|
| // MessageLoop to run.
|
| -void NotifyReadError(PrefService* pref, int message_id) {
|
| +void NotifyReadError(int message_id) {
|
| ShowProfileErrorDialog(message_id);
|
| }
|
|
|
| +// Shows notifications which correspond to PersistentPrefStore's reading errors.
|
| +class ReadErrorHandler : public PersistentPrefStore::ReadErrorDelegate {
|
| + public:
|
| + virtual void OnError(PersistentPrefStore::PrefReadError error) {
|
| + if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) {
|
| + // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for
|
| + // an example problem that this can cause.
|
| + // Do some diagnosis and try to avoid losing data.
|
| + int message_id = 0;
|
| + if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE) {
|
| + message_id = IDS_PREFERENCES_CORRUPT_ERROR;
|
| + } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) {
|
| + message_id = IDS_PREFERENCES_UNREADABLE_ERROR;
|
| + }
|
| +
|
| + if (message_id) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + NewRunnableFunction(&NotifyReadError, message_id));
|
| + }
|
| + UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 20);
|
| + }
|
| + }
|
| +};
|
| +
|
| } // namespace
|
|
|
| // 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)
|
| @@ -129,9 +145,10 @@ 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);
|
| + return new PrefService(
|
| + managed_platform, managed_cloud, extension_prefs,
|
| + command_line, user, recommended_platform,
|
| + recommended_cloud, default_pref_store, async);
|
| }
|
|
|
| PrefService* PrefService::CreateIncognitoPrefService(
|
| @@ -147,10 +164,9 @@ PrefService::PrefService(PrefStore* managed_platform_prefs,
|
| PrefStore* recommended_platform_prefs,
|
| PrefStore* recommended_cloud_prefs,
|
| DefaultPrefStore* default_store,
|
| - PrefServiceDelegate* delegate)
|
| + bool async)
|
| : user_pref_store_(user_prefs),
|
| - default_store_(default_store),
|
| - delegate_(delegate) {
|
| + default_store_(default_store) {
|
| pref_sync_associator_.reset(new PrefModelAssociator(this));
|
| pref_notifier_.reset(new PrefNotifierImpl(this));
|
| pref_value_store_.reset(
|
| @@ -164,15 +180,14 @@ PrefService::PrefService(PrefStore* managed_platform_prefs,
|
| default_store,
|
| pref_sync_associator_.get(),
|
| pref_notifier_.get()));
|
| - InitFromStorage();
|
| + InitFromStorage(async);
|
| }
|
|
|
| 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()) {
|
| // Incognito mode doesn't sync, so no need to create PrefModelAssociator.
|
| pref_notifier_.reset(new PrefNotifierImpl(this));
|
| pref_value_store_.reset(original.pref_value_store_->CloneAndSpecialize(
|
| @@ -186,7 +201,6 @@ PrefService::PrefService(const PrefService& original,
|
| default_store_.get(),
|
| NULL, // pref_sync_associator_
|
| pref_notifier_.get()));
|
| - InitFromStorage();
|
| }
|
|
|
| PrefService::~PrefService() {
|
| @@ -203,47 +217,17 @@ PrefService::~PrefService() {
|
| pref_sync_associator_.reset();
|
| }
|
|
|
| -void PrefService::OnPrefsRead(PersistentPrefStore::PrefReadError error,
|
| - bool no_dir) {
|
| - if (no_dir) {
|
| - // 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);
|
| - return;
|
| - }
|
| -
|
| - if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) {
|
| - // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for
|
| - // an example problem that this can cause.
|
| - // Do some diagnosis and try to avoid losing data.
|
| - int message_id = 0;
|
| - if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE) {
|
| - message_id = IDS_PREFERENCES_CORRUPT_ERROR;
|
| - } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) {
|
| - message_id = IDS_PREFERENCES_UNREADABLE_ERROR;
|
| - }
|
| -
|
| - if (message_id) {
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - NewRunnableFunction(&NotifyReadError, this, message_id));
|
| - }
|
| - UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 20);
|
| - }
|
| -
|
| - if (delegate_)
|
| - delegate_->OnPrefsLoaded(this, true);
|
| -}
|
| -
|
| -void PrefService::InitFromStorage() {
|
| - if (!delegate_) {
|
| - const PersistentPrefStore::PrefReadError error =
|
| - user_pref_store_->ReadPrefs();
|
| - OnPrefsRead(error, false);
|
| +void PrefService::InitFromStorage(bool async) {
|
| + if (!async) {
|
| + ReadErrorHandler error_handler;
|
| + error_handler.OnError(user_pref_store_->ReadPrefs());
|
| } else {
|
| - // todo(altimofeev): move this method to PersistentPrefStore interface.
|
| - (static_cast<JsonPrefStore*>(user_pref_store_.get()))->ReadPrefs(this);
|
| + // Guarantee that initialization happens after this function returned.
|
| + MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + NewRunnableMethod(user_pref_store_.get(),
|
| + &PersistentPrefStore::ReadPrefsAsync,
|
| + new ReadErrorHandler()));
|
| }
|
| }
|
|
|
|
|