Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Unified Diff: chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc

Issue 620563002: ChromeOS NetworkScreenHandler should not call CheckAndResolveLocale on UI thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..5e45da7bc2226136a63e3848df504fae636e266e 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"
@@ -57,6 +61,32 @@ std::string CalculateSelectedLanguage(const std::string& requested_locale,
return loaded_locale;
}
+void ResolveLanguageListOnBlockingPool(const std::string& requested_locale,
dzhioev (left Google) 2014/10/01 15:08:08 Pass LanguageSwitchResult instead of first three p
Alexander Alekseev 2014/10/02 13:12:07 Done.
+ const std::string& loaded_locale,
+ bool success,
+ scoped_ptr<base::ListValue>* list,
+ std::string* list_locale,
+ std::string* selected_language) {
+ DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
+
+ if (success) {
+ if (requested_locale == loaded_locale) {
+ *selected_language = requested_locale;
+ } else {
+ *selected_language =
+ CalculateSelectedLanguage(requested_locale, loaded_locale);
+ }
+ } else {
+ *selected_language = loaded_locale;
+ }
+ const std::string selected_code =
+ selected_language->empty() ? g_browser_process->GetApplicationLocale()
+ : *selected_language;
+
+ *list_locale = loaded_locale;
+ list->reset(chromeos::GetUILanguageList(NULL, selected_code).release());
+}
+
} // namespace
namespace chromeos {
@@ -170,20 +200,76 @@ void NetworkScreenHandler::DeclareLocalizedValues(
builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON);
}
+void NetworkScreenHandler::OnLanguageListResolved(
+ scoped_ptr<scoped_ptr<base::ListValue>> new_language_list,
+ scoped_ptr<std::string> new_language_list_locale,
+ scoped_ptr<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() {
dzhioev (left Google) 2014/10/01 15:08:08 Add |callback| param and move to l10n_util.
Alexander Alekseev 2014/10/02 13:12:07 Done.
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+
+ scoped_ptr<scoped_ptr<base::ListValue>> new_language_list(
+ new scoped_ptr<base::ListValue>());
+ scoped_ptr<std::string> new_language_list_locale(new std::string);
+ scoped_ptr<std::string> new_selected_language(new std::string);
+ content::BrowserThread::GetBlockingPool()->PostTaskAndReply(
+ FROM_HERE,
+ base::Bind(&ResolveLanguageListOnBlockingPool,
+ language_switch_result_.requested_locale,
+ language_switch_result_.loaded_locale,
+ language_switch_result_.success,
+ base::Unretained(new_language_list.get()),
+ base::Unretained(new_language_list_locale.get()),
+ base::Unretained(new_selected_language.get())),
+ base::Bind(&NetworkScreenHandler::OnLanguageListResolved,
+ weak_ptr_factory_.GetWeakPtr(),
+ base::Passed(new_language_list.Pass()),
+ base::Passed(new_language_list_locale.Pass()),
+ base::Passed(new_selected_language.Pass())));
+}
+
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();
+
+ base::string16 language_native_display_name =
+ l10n_util::GetDisplayNameForLocale(
+ application_locale, application_locale, true);
+
+ language_list.reset(new base::ListValue());
+ const bool markup_removal = base::i18n::UnadjustStringForLocaleDirection(
+ &language_native_display_name);
+ DCHECK(markup_removal);
+ language_list->Append(CreateLanguageEntry(
+ application_locale,
+ language_native_display_name,
+ GetLanguageDirectionality(language_native_display_name),
+ language_native_display_name));
dzhioev (left Google) 2014/10/01 15:08:08 You forgot to add 'title', 'value', and 'selected'
Alexander Alekseev 2014/10/02 13:12:07 Done.
+ }
+
+ dict->Set("languageList", language_list.release());
dict->Set("inputMethodsList",
GetAndActivateLoginKeyboardLayouts(
application_locale, selected_input_method).release());
@@ -247,25 +333,19 @@ void NetworkScreenHandler::OnLanguageChangedCallback(
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->language_switch_result_.requested_locale = requested_locale;
+ self->language_switch_result_.loaded_locale = loaded_locale;
+ self->language_switch_result_.success = success;
+
+ 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();
AccessibilityManager::Get()->OnLocaleChanged();
}

Powered by Google App Engine
This is Rietveld 408576698