| Index: chrome/browser/chromeos/locale_change_guard.cc
|
| diff --git a/chrome/browser/chromeos/locale_change_guard.cc b/chrome/browser/chromeos/locale_change_guard.cc
|
| index f875cdf5745de25f8fd96c7027636f6995e23625..f10775167b6fd3da4eb2cfc989118c7e8708e908 100644
|
| --- a/chrome/browser/chromeos/locale_change_guard.cc
|
| +++ b/chrome/browser/chromeos/locale_change_guard.cc
|
| @@ -33,15 +33,27 @@ LocaleChangeGuard::LocaleChangeGuard()
|
| }
|
|
|
| void LocaleChangeGuard::RevertLocaleChange(const ListValue* list) {
|
| + if (note_ == NULL ||
|
| + tab_contents_ == NULL ||
|
| + from_locale_.empty() ||
|
| + to_locale_.empty()) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| + if (reverted_)
|
| + return;
|
| +
|
| + PrefService* prefs = tab_contents_->profile()->GetPrefs();
|
| + if (prefs == NULL)
|
| + return;
|
| +
|
| reverted_ = true;
|
| UserMetrics::RecordAction(UserMetricsAction("LanguageChange_Revert"));
|
| tab_contents_->profile()->ChangeApplicationLocale(from_locale_, true);
|
| - PrefService* prefs = tab_contents_->profile()->GetPrefs();
|
| - if (prefs) {
|
| - prefs->SetString(prefs::kApplicationLocaleBackup, from_locale_);
|
| - prefs->ClearPref(prefs::kApplicationLocaleAccepted);
|
| - prefs->ScheduleSavePersistentPrefs();
|
| - }
|
| + prefs->SetString(prefs::kApplicationLocaleBackup, from_locale_);
|
| + prefs->ClearPref(prefs::kApplicationLocaleAccepted);
|
| + prefs->ScheduleSavePersistentPrefs();
|
| +
|
| Browser* browser = Browser::GetBrowserForController(
|
| &tab_contents_->controller(), NULL);
|
| if (browser)
|
| @@ -52,37 +64,58 @@ void LocaleChangeGuard::CheckLocaleChange(TabContents* tab_contents) {
|
| // We want notification to be shown no more than once per session.
|
| if (note_ != NULL)
|
| return;
|
| + DCHECK(note_ == NULL && tab_contents_ == NULL);
|
| + DCHECK(from_locale_.empty() && to_locale_.empty());
|
| +
|
| // We check profile Id because:
|
| // (1) we want to exit fast in common case when nothing should be done.
|
| // (2) on ChromeOS this guard may be invoked for a dummy profile first time.
|
| ProfileId cur_profile_id = tab_contents->profile()->GetRuntimeId();
|
| - if (cur_profile_id == profile_id_)
|
| + if (cur_profile_id == profile_id_) {
|
| + // We have already checked this profile, exiting fast.
|
| return;
|
| + }
|
| profile_id_ = cur_profile_id;
|
| +
|
| std::string cur_locale = g_browser_process->GetApplicationLocale();
|
| - if (cur_locale.empty())
|
| + if (cur_locale.empty()) {
|
| + NOTREACHED();
|
| return;
|
| + }
|
| +
|
| PrefService* prefs = tab_contents->profile()->GetPrefs();
|
| if (prefs == NULL)
|
| return;
|
| - to_locale_ = prefs->GetString(prefs::kApplicationLocaleOverride);
|
| - if (!to_locale_.empty()) {
|
| - DCHECK(to_locale_ == cur_locale);
|
| +
|
| + std::string to_locale = prefs->GetString(prefs::kApplicationLocaleOverride);
|
| + if (!to_locale.empty()) {
|
| + DCHECK(to_locale == cur_locale);
|
| return;
|
| }
|
| - to_locale_ = prefs->GetString(prefs::kApplicationLocale);
|
| - if (to_locale_ != cur_locale)
|
| +
|
| + to_locale = prefs->GetString(prefs::kApplicationLocale);
|
| + if (to_locale != cur_locale) {
|
| + // This conditional branch can occur in case kApplicationLocale
|
| + // preference was modified by synchronization.
|
| return;
|
| - from_locale_ = prefs->GetString(prefs::kApplicationLocaleBackup);
|
| - if (from_locale_.empty() || from_locale_ == to_locale_)
|
| + }
|
| +
|
| + std::string from_locale = prefs->GetString(prefs::kApplicationLocaleBackup);
|
| + if (from_locale.empty() || from_locale == to_locale) {
|
| + // No locale change was detected, just exit.
|
| return;
|
| + }
|
| +
|
| + // Locale change detected, showing notification.
|
| + from_locale_ = from_locale;
|
| + to_locale_ = to_locale;
|
| + tab_contents_ = tab_contents;
|
| note_.reset(new chromeos::SystemNotification(
|
| tab_contents->profile(),
|
| new Delegate(this),
|
| IDR_DEFAULT_FAVICON,
|
| l10n_util::GetStringUTF16(
|
| IDS_OPTIONS_SETTINGS_SECTION_TITLE_LANGUAGE)));
|
| - tab_contents_ = tab_contents;
|
| note_->Show(
|
| l10n_util::GetStringFUTF16(
|
| IDS_LOCALE_CHANGE_MESSAGE,
|
| @@ -95,10 +128,16 @@ void LocaleChangeGuard::CheckLocaleChange(TabContents* tab_contents) {
|
| }
|
|
|
| void LocaleChangeGuard::AcceptLocaleChange() {
|
| + if (note_ == NULL ||
|
| + tab_contents_ == NULL ||
|
| + from_locale_.empty() ||
|
| + to_locale_.empty()) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| // Check whether locale has been reverted or changed.
|
| // If not: mark current locale as accepted.
|
| - if (tab_contents_ == NULL)
|
| - return;
|
| if (reverted_)
|
| return;
|
| PrefService* prefs = tab_contents_->profile()->GetPrefs();
|
|
|