15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/locale_change_guard.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_delegate.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocaleChangeGuard::Delegate : public NotificationDelegate {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Delegate(chromeos::LocaleChangeGuard* master) : master_(master) {}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Close(bool by_user) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Display() OVERRIDE {}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Error() OVERRIDE {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Click() OVERRIDE {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string id() const OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual content::RenderViewHost* GetRenderViewHost() const OVERRIDE {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Delegate() {}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::LocaleChangeGuard* master_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Delegate);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocaleChangeGuard::LocaleChangeGuard(Profile* profile)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reverted_(false),
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      session_started_(false),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      main_frame_loaded_(false) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile_);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocaleChangeGuard::~LocaleChangeGuard() {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::OnLogin() {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_SESSION_STARTED,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllBrowserContextsAndSources());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::RevertLocaleChange() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (profile_ == NULL ||
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      from_locale_.empty() ||
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      to_locale_.empty()) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reverted_)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reverted_ = true;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("LanguageChange_Revert"));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->ChangeAppLocale(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      from_locale_, Profile::APP_LOCALE_CHANGED_VIA_REVERT);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AttemptUserExit();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::RevertLocaleChangeCallback(const ListValue* list) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RevertLocaleChange();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::Observe(int type,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const content::NotificationSource& source,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const content::NotificationDetails& details) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (profile_ == NULL) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_SESSION_STARTED: {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      session_started_ = true;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registrar_.Remove(this, chrome::NOTIFICATION_SESSION_STARTED,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        content::NotificationService::AllSources());
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (main_frame_loaded_)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Check();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME: {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (profile_ ==
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::Source<WebContents>(source)->GetBrowserContext()) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        main_frame_loaded_ = true;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We need to perform locale change check only once, so unsubscribe.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        registrar_.Remove(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          content::NotificationService::AllSources());
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (session_started_)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Check();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED: {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (DeviceSettingsService::Get()->HasPrivateOwnerKey()) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrefService* local_state = g_browser_process->local_state();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (local_state) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PrefService* prefs = profile_->GetPrefs();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (prefs == NULL) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            NOTREACHED();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          std::string owner_locale =
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs->GetString(prefs::kApplicationLocale);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!owner_locale.empty())
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            local_state->SetString(prefs::kOwnerLocale, owner_locale);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::Check() {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cur_locale = g_browser_process->GetApplicationLocale();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cur_locale.empty()) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile_->GetPrefs();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs == NULL) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string to_locale = prefs->GetString(prefs::kApplicationLocale);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (to_locale != cur_locale) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This conditional branch can occur in cases like:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (1) kApplicationLocale preference was modified by synchronization;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (2) kApplicationLocale is managed by policy.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string from_locale = prefs->GetString(prefs::kApplicationLocaleBackup);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (from_locale.empty() || from_locale == to_locale)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // No locale change was detected, just exit.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetString(prefs::kApplicationLocaleAccepted) == to_locale)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // Already accepted.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Locale change detected, showing notification.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (from_locale_ != from_locale || to_locale_ != to_locale) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Falling back to showing message in current locale.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) <<
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Showing locale change notification in current (not previous) language";
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrepareChangingLocale(from_locale, to_locale);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->system_tray_notifier()->NotifyLocaleChanged(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, cur_locale, from_locale_, to_locale_);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::AcceptLocaleChange() {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (profile_ == NULL ||
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      from_locale_.empty() ||
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      to_locale_.empty()) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check whether locale has been reverted or changed.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If not: mark current locale as accepted.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reverted_)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile_->GetPrefs();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs == NULL) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetString(prefs::kApplicationLocale) != to_locale_)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("LanguageChange_Accept"));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->SetString(prefs::kApplicationLocaleBackup, to_locale_);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->SetString(prefs::kApplicationLocaleAccepted, to_locale_);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::PrepareChangingLocale(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& from_locale, const std::string& to_locale) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string cur_locale = g_browser_process->GetApplicationLocale();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!from_locale.empty())
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    from_locale_ = from_locale;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!to_locale.empty())
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to_locale_ = to_locale;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!from_locale_.empty() && !to_locale_.empty()) {
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 from = l10n_util::GetDisplayNameForLocale(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        from_locale_, cur_locale, true);
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 to = l10n_util::GetDisplayNameForLocale(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to_locale_, cur_locale, true);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title_text_ = l10n_util::GetStringUTF16(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_OPTIONS_SETTINGS_SECTION_TITLE_LANGUAGE);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_text_ = l10n_util::GetStringFUTF16(
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_LOCALE_CHANGE_MESSAGE, from, to);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    revert_link_text_ = l10n_util::GetStringFUTF16(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_LOCALE_CHANGE_REVERT_MESSAGE, from);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocaleChangeGuard::Delegate::Close(bool by_user) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (by_user)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    master_->AcceptLocaleChange();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string LocaleChangeGuard::Delegate::id() const {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Arbitrary unique Id.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "8c386938-1e3f-11e0-ac7b-18a90520e2e5";
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
247