| Index: chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
|
| diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
|
| index 4ffb56706bf83409bffd671118d0df9ef0aee76b..317f6ca80e9408ce7cde18758e5eca238b6daa44 100644
|
| --- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
|
| +++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
|
| @@ -8,10 +8,7 @@
|
| #include "base/bind_helpers.h"
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/prefs/pref_service.h"
|
| -#include "base/strings/string16.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| -#include "base/task_runner_util.h"
|
| -#include "base/threading/worker_pool.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
|
| @@ -29,8 +26,6 @@
|
| #include "chromeos/ime/extension_ime_util.h"
|
| #include "chromeos/network/network_handler.h"
|
| #include "chromeos/network/network_state_handler.h"
|
| -#include "components/user_manager/user_manager.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/gfx/rect.h"
|
| #include "ui/views/layout/fill_layout.h"
|
| @@ -45,6 +40,22 @@
|
| const char kJsApiNetworkOnLanguageChanged[] = "networkOnLanguageChanged";
|
| const char kJsApiNetworkOnInputMethodChanged[] = "networkOnInputMethodChanged";
|
| const char kJsApiNetworkOnTimezoneChanged[] = "networkOnTimezoneChanged";
|
| +
|
| +// For "UI Language" drop-down menu at OOBE screen we need to decide which
|
| +// entry to mark "selected". If user has just selected "requested_locale",
|
| +// but "loaded_locale" was actually loaded, we mark original user choice
|
| +// "selected" only if loaded_locale is a backup for "requested_locale".
|
| +std::string CalculateSelectedLanguage(const std::string& requested_locale,
|
| + const std::string& loaded_locale) {
|
| + std::string resolved_locale;
|
| + if (!l10n_util::CheckAndResolveLocale(requested_locale, &resolved_locale))
|
| + return loaded_locale;
|
| +
|
| + if (resolved_locale == loaded_locale)
|
| + return requested_locale;
|
| +
|
| + return loaded_locale;
|
| +}
|
|
|
| } // namespace
|
|
|
| @@ -159,77 +170,23 @@
|
| builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON);
|
| }
|
|
|
| -void NetworkScreenHandler::OnLanguageListResolved(
|
| - scoped_ptr<base::ListValue> new_language_list,
|
| - std::string new_language_list_locale,
|
| - std::string new_selected_language) {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| -
|
| - language_list_.reset(new_language_list.release());
|
| - language_list_locale_ = new_language_list_locale;
|
| - selected_language_code_ = new_selected_language;
|
| -
|
| - g_browser_process->local_state()->SetString(prefs::kApplicationLocale,
|
| - selected_language_code_);
|
| - ReloadLocalizedContent();
|
| -}
|
| -
|
| -void NetworkScreenHandler::ScheduleResolveLanguageList(
|
| - scoped_ptr<locale_util::LanguageSwitchResult> language_switch_result) {
|
| - UILanguageListResolvedCallback callback =
|
| - base::Bind(&NetworkScreenHandler::OnLanguageListResolved,
|
| - weak_ptr_factory_.GetWeakPtr());
|
| - ResolveUILanguageList(language_switch_result.Pass(), callback);
|
| -}
|
| -
|
| void NetworkScreenHandler::GetAdditionalParameters(
|
| base::DictionaryValue* dict) {
|
| const std::string application_locale =
|
| g_browser_process->GetApplicationLocale();
|
| + const std::string selected_language = selected_language_code_.empty() ?
|
| + application_locale : selected_language_code_;
|
| const std::string selected_input_method =
|
| input_method::InputMethodManager::Get()
|
| ->GetActiveIMEState()
|
| ->GetCurrentInputMethod()
|
| .id();
|
|
|
| - scoped_ptr<base::ListValue> language_list;
|
| - if (language_list_.get() && language_list_locale_ == application_locale) {
|
| - language_list.reset(language_list_->DeepCopy());
|
| - } else {
|
| - ScheduleResolveLanguageList(
|
| - scoped_ptr<locale_util::LanguageSwitchResult>());
|
| -
|
| - language_list.reset(GetMinimalUILanguageList().release());
|
| - }
|
| -
|
| - // GetAdditionalParameters() is called when OOBE language is updated.
|
| - // This happens in two diferent cases:
|
| - //
|
| - // 1) User selects new locale on OOBE screen. We need to sync active input
|
| - // methods with locale, so EnableLoginLayouts() is needed.
|
| - //
|
| - // 2) This is signin to public session. User has selected some locale & input
|
| - // method on "Public Session User POD". After "Login" button is pressed,
|
| - // new user session is created, locale & input method are changed (both
|
| - // asynchronously).
|
| - // But after public user session is started, "Terms of Service" dialog is
|
| - // shown. It is a part of OOBE UI screens, so it initiates reload of UI
|
| - // strings in new locale. It also happens asynchronously, that leads to race
|
| - // between "locale change", "input method change" and
|
| - // "EnableLoginLayouts()". This way EnableLoginLayouts() happens after user
|
| - // input method has been changed, resetting input method to hardware default.
|
| - //
|
| - // So we need to disable activation of login layouts if we are already in
|
| - // active user session.
|
| - //
|
| - const bool enable_layouts =
|
| - !user_manager::UserManager::Get()->IsUserLoggedIn();
|
| -
|
| - dict->Set("languageList", language_list.release());
|
| - dict->Set(
|
| - "inputMethodsList",
|
| - GetAndActivateLoginKeyboardLayouts(
|
| - application_locale, selected_input_method, enable_layouts).release());
|
| + dict->Set("languageList",
|
| + GetUILanguageList(NULL, selected_language).release());
|
| + dict->Set("inputMethodsList",
|
| + GetAndActivateLoginKeyboardLayouts(
|
| + application_locale, selected_input_method).release());
|
| dict->Set("timezoneList", GetTimezoneList());
|
| }
|
|
|
| @@ -239,10 +196,6 @@
|
| show_on_init_ = false;
|
| Show();
|
| }
|
| -
|
| - // Reload localized strings if they are already resolved.
|
| - if (language_list_.get())
|
| - ReloadLocalizedContent();
|
|
|
| timezone_subscription_ = CrosSettings::Get()->AddSettingsObserver(
|
| kSystemTimezone,
|
| @@ -273,18 +226,46 @@
|
| screen_->OnContinuePressed();
|
| }
|
|
|
| +struct NetworkScreenHandlerOnLanguageChangedCallbackData {
|
| + explicit NetworkScreenHandlerOnLanguageChangedCallbackData(
|
| + const base::WeakPtr<NetworkScreenHandler>& handler)
|
| + : handler(handler) {}
|
| +
|
| + base::WeakPtr<NetworkScreenHandler> handler;
|
| +
|
| + // Block UI while resource bundle is being reloaded.
|
| + chromeos::InputEventsBlocker input_events_blocker;
|
| +};
|
| +
|
| +// static
|
| void NetworkScreenHandler::OnLanguageChangedCallback(
|
| - const chromeos::InputEventsBlocker* /* input_events_blocker */,
|
| - const locale_util::LanguageSwitchResult& result) {
|
| - if (!selected_language_code_.empty()) {
|
| - // We still do not have device owner, so owner settings are not applied.
|
| - // But Guest session can be started before owner is created, so we need to
|
| - // save locale settings directly here.
|
| - g_browser_process->local_state()->SetString(prefs::kApplicationLocale,
|
| - selected_language_code_);
|
| - }
|
| - ScheduleResolveLanguageList(scoped_ptr<locale_util::LanguageSwitchResult>(
|
| - new locale_util::LanguageSwitchResult(result)));
|
| + scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> context,
|
| + const std::string& requested_locale,
|
| + const std::string& loaded_locale,
|
| + const bool success) {
|
| + if (!context || !context->handler)
|
| + return;
|
| +
|
| + NetworkScreenHandler* const self = context->handler.get();
|
| +
|
| + if (success) {
|
| + if (requested_locale == loaded_locale) {
|
| + self->selected_language_code_ = requested_locale;
|
| + } else {
|
| + self->selected_language_code_ =
|
| + CalculateSelectedLanguage(requested_locale, loaded_locale);
|
| + }
|
| + } else {
|
| + self->selected_language_code_ = loaded_locale;
|
| + }
|
| +
|
| + self->ReloadLocalizedContent();
|
| +
|
| + // We still do not have device owner, so owner settings are not applied.
|
| + // But Guest session can be started before owner is created, so we need to
|
| + // save locale settings directly here.
|
| + g_browser_process->local_state()->SetString(prefs::kApplicationLocale,
|
| + self->selected_language_code_);
|
|
|
| AccessibilityManager::Get()->OnLocaleChanged();
|
| }
|
| @@ -294,16 +275,18 @@
|
| if (app_locale == locale)
|
| return;
|
|
|
| - // Block UI while resource bundle is being reloaded.
|
| - // (InputEventsBlocker will live until callback is finished.)
|
| - locale_util::SwitchLanguageCallback callback(
|
| - base::Bind(&NetworkScreenHandler::OnLanguageChangedCallback,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - base::Owned(new chromeos::InputEventsBlocker)));
|
| + base::WeakPtr<NetworkScreenHandler> weak_self =
|
| + weak_ptr_factory_.GetWeakPtr();
|
| + scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> callback_data(
|
| + new NetworkScreenHandlerOnLanguageChangedCallbackData(weak_self));
|
| + scoped_ptr<locale_util::SwitchLanguageCallback> callback(
|
| + new locale_util::SwitchLanguageCallback(
|
| + base::Bind(&NetworkScreenHandler::OnLanguageChangedCallback,
|
| + base::Passed(callback_data.Pass()))));
|
| locale_util::SwitchLanguage(locale,
|
| true /* enableLocaleKeyboardLayouts */,
|
| true /* login_layouts_only */,
|
| - callback);
|
| + callback.Pass());
|
| }
|
|
|
| void NetworkScreenHandler::HandleOnInputMethodChanged(const std::string& id) {
|
|
|