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 317f6ca80e9408ce7cde18758e5eca238b6daa44..dc9011884ba033f9a10e34c358bc2c0820321188 100644 |
--- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc |
+++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc |
@@ -8,7 +8,10 @@ |
#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" |
@@ -26,6 +29,7 @@ |
#include "chromeos/ime/extension_ime_util.h" |
#include "chromeos/network/network_handler.h" |
#include "chromeos/network/network_state_handler.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" |
@@ -41,22 +45,6 @@ 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 |
namespace chromeos { |
@@ -170,20 +158,55 @@ void NetworkScreenHandler::DeclareLocalizedValues( |
builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON); |
} |
+// static |
+void NetworkScreenHandler::OnLanguageListResolved( |
+ base::WeakPtr<NetworkScreenHandler> self, |
+ 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)); |
+ |
+ if (!self) |
+ return; |
+ |
+ self->language_list_.reset(new_language_list.release()); |
+ self->language_list_locale_ = new_language_list_locale; |
+ self->selected_language_code_ = new_selected_language; |
+ |
+ g_browser_process->local_state()->SetString(prefs::kApplicationLocale, |
+ self->selected_language_code_); |
+ self->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(); |
- dict->Set("languageList", |
- GetUILanguageList(NULL, selected_language).release()); |
+ 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()); |
+ } |
+ |
+ dict->Set("languageList", language_list.release()); |
dict->Set("inputMethodsList", |
GetAndActivateLoginKeyboardLayouts( |
application_locale, selected_input_method).release()); |
@@ -240,32 +263,20 @@ struct NetworkScreenHandlerOnLanguageChangedCallbackData { |
// static |
void NetworkScreenHandler::OnLanguageChangedCallback( |
scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> context, |
- const std::string& requested_locale, |
- const std::string& loaded_locale, |
- const bool success) { |
+ scoped_ptr<locale_util::LanguageSwitchResult> result) { |
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; |
+ if (!self->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, |
+ self->selected_language_code_); |
} |
- |
- 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_); |
+ self->ScheduleResolveLanguageList(result.Pass()); |
AccessibilityManager::Get()->OnLocaleChanged(); |
} |