Chromium Code Reviews| Index: chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
| diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
| index 449b5eeb5400aa3a01190ef1375b150dd5435fc0..2a1bea3a6957fa693b0f5b658de6c0bdb3cd2133 100644 |
| --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
| +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc |
| @@ -5,11 +5,13 @@ |
| #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" |
| #include "base/callback.h" |
| +#include "base/chromeos/chromeos_version.h" |
| #include "base/command_line.h" |
| #include "base/debug/trace_event.h" |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/metrics/histogram.h" |
| +#include "base/prefs/pref_registry_simple.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/strings/string16.h" |
| #include "base/strings/string_util.h" |
| @@ -19,6 +21,7 @@ |
| #include "chrome/browser/browser_process_platform_part_chromeos.h" |
| #include "chrome/browser/browser_shutdown.h" |
| #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
| +#include "chrome/browser/chromeos/input_method/input_method_util.h" |
| #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" |
| #include "chrome/browser/chromeos/login/hwid_checker.h" |
| #include "chrome/browser/chromeos/login/login_display_host_impl.h" |
| @@ -103,6 +106,12 @@ void ClearDnsCache(IOThread* io_thread) { |
| io_thread->ClearHostCache(); |
| } |
| +static bool Contains(const std::vector<std::string>& container, |
| + const std::string& value) { |
| + return std::find(container.begin(), container.end(), value) != |
| + container.end(); |
| +} |
| + |
| } // namespace |
| namespace chromeos { |
| @@ -812,6 +821,10 @@ void SigninScreenHandler::RegisterMessages() { |
| &SigninScreenHandler::HandleUpdateOfflineLogin); |
| } |
| +void SigninScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { |
| + registry->RegisterDictionaryPref(prefs::kUsersLRUInputMethod); |
| +} |
| + |
| void SigninScreenHandler::HandleGetUsers() { |
| SendUserList(false); |
| } |
| @@ -968,6 +981,109 @@ void SigninScreenHandler::OnDnsCleared() { |
| ShowSigninScreenIfReady(); |
| } |
| +void SigninScreenHandler::SetUserInputMethodHWDefault() { |
| +#if defined(OS_CHROMEOS) |
|
Nikita (slow)
2013/07/11 09:13:54
No need for OS_CHROMEOS here as this class is alre
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + chromeos::input_method::InputMethodManager* manager = |
| + chromeos::input_method::InputMethodManager::Get(); |
| + manager->ChangeInputMethod( |
| + manager->GetInputMethodUtil()->GetHardwareInputMethodId()); |
| +#endif |
| +} |
| + |
| +void SigninScreenHandler::SetUserInputMethod(const std::string& username) { |
| +#if defined(OS_CHROMEOS) |
|
Nikita (slow)
2013/07/11 09:13:54
nit: same here.
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + // Update keyboard layout to least recently used by the user |
| + if (g_browser_process == NULL) |
|
Nikita (slow)
2013/07/11 09:13:54
nit: drop this check.
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + return; |
| + |
| + if (!base::chromeos::IsRunningOnChromeOS()) |
|
Nikita (slow)
2013/07/11 09:13:54
What about relying on stubs instead when not runni
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + return; |
| + |
| + PrefService* local_state = g_browser_process->local_state(); |
| + DCHECK(local_state); |
|
Nikita (slow)
2013/07/11 09:13:54
nit: Drop this DCHECK.
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + |
| + if (local_state == NULL) |
|
Nikita (slow)
2013/07/11 09:13:54
nit: Drop this.
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + return; |
| + |
| + chromeos::input_method::InputMethodManager* manager = |
| + chromeos::input_method::InputMethodManager::Get(); |
| + DCHECK(manager); |
|
Nikita (slow)
2013/07/11 09:13:54
nit: Drop this DCHECK.
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + |
| + bool succeed = false; |
| + do { |
|
Nikita (slow)
2013/07/11 09:13:54
You should delete this loop it is not really neede
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + const base::DictionaryValue* users_lru_input_methods = |
| + local_state->GetDictionary(prefs::kUsersLRUInputMethod); |
| + |
| + if (users_lru_input_methods == NULL) { |
| + DLOG(WARNING) << "SetUserInputMethod('" << username |
|
Nikita (slow)
2013/07/11 09:13:54
nit: I guess it is perfectly normal situation till
Alexander Alekseev
2013/07/12 20:10:49
Do all our users always have some latin input meth
|
| + << "'): no kUsersLRUInputMethod"; |
| + break; |
| + } |
| + |
| + std::string input_method; |
| + |
| + if (!users_lru_input_methods->GetStringWithoutPathExpansion( |
| + username, &input_method)) { |
| + DLOG(WARNING) << "SetUserInputMethod('" << username |
|
Nikita (slow)
2013/07/11 09:13:54
nit: Same here. This looks like a perfectly normal
Alexander Alekseev
2013/07/12 20:10:49
But it's debug log, isn't it? I think I'd better h
|
| + << "'): no input method for this user"; |
| + break; |
| + } |
| + |
| + if (manager == NULL) |
|
Nikita (slow)
2013/07/11 09:13:54
You don't have to check for manager not being NULL
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + break; |
| + |
| + const chromeos::input_method::InputMethodUtil* ime_util = |
| + manager->GetInputMethodUtil(); |
| + DCHECK(ime_util); |
|
Nikita (slow)
2013/07/11 09:13:54
nit: Drop DCHECK
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + |
| + if (ime_util == NULL) |
|
Nikita (slow)
2013/07/11 09:13:54
Same here.
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + return; |
| + |
| + if (input_method.empty()) |
| + break; |
| + |
| + if (!manager->IsLanguageFullLatinKeyboard( |
| + ime_util->GetLanguageCodeFromInputMethodId(input_method))) { |
| + LOG(WARNING) << "SetUserInputMethod('" << username |
|
Nikita (slow)
2013/07/11 09:13:54
nit: I propose dropping log message as well and ju
Alexander Alekseev
2013/07/12 20:10:49
It is probably dangerous to silently drop user pre
|
| + << "'): stored user LRU input method '" << input_method |
| + << "' is no longer Full Latin Keyboard Language." |
| + << " Use hardware default instead."; |
| + |
| + break; |
| + } |
| + |
| + if (!Contains(chromeos::input_method::InputMethodManager::Get() |
| + ->GetActiveInputMethodIds(), |
|
Nikita (slow)
2013/07/11 09:13:54
nit: -> should be on the previous line
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + input_method)) { |
| + if (!chromeos::input_method::InputMethodManager::Get()->EnableInputMethod( |
|
Nikita (slow)
2013/07/11 09:13:54
nit:
if (!chromeos::input_method::InputMethodMana
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + input_method)) { |
| + DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username |
| + << "'): user input method '" << input_method |
| + << "' is not enabled and enabling failed (ignored!)."; |
| + } |
| + } |
| + chromeos::input_method::InputMethodManager::Get()->ChangeInputMethod( |
|
Nikita (slow)
2013/07/11 09:13:54
nit: this looks more readable:
chromeos::input_me
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + input_method); |
| + |
| + succeed = true; |
| + } while (false); |
| + |
| + // This is also a case when LRU layout is set only for a few local users, |
| + // thus others need to be switched to default locale. |
| + // Otherwise they will end up using another user's locale to log in. |
| + if (!succeed) { |
| + DLOG(WARNING) |
|
Nikita (slow)
2013/07/11 09:13:54
nit: No need for DLOG(WARNING), perfectly normal s
Alexander Alekseev
2013/07/12 20:10:49
But it's debug log. Let's leave traces of rare eve
|
| + << "SetUserInputMethod('" << username |
| + << "'): failed to set user layout. Switching to default '" |
| + << (manager != NULL |
| + ? manager->GetInputMethodUtil()->GetHardwareInputMethodId() |
| + : "NULL") << "'"; |
| + |
| + SetUserInputMethodHWDefault(); |
| + } |
| +#endif |
| +} |
| + |
| void SigninScreenHandler::ShowSigninScreenIfReady() { |
| if (!dns_cleared_ || !cookies_cleared_ || !delegate_) |
| return; |
| @@ -989,6 +1105,10 @@ void SigninScreenHandler::ShowSigninScreenIfReady() { |
| else |
| delegate_->LoadWallpaper(email_); |
| + // Set Least Recently used input method for the user |
|
Mattias Nissler (ping if slow)
2013/07/11 10:05:49
nit: missing period.
Alexander Alekseev
2013/07/12 20:10:49
Done.
|
| + if (!email_.empty()) |
| + SetUserInputMethod(email_); |
| + |
| LoadAuthExtension(!gaia_silent_load_, false, false); |
| UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL); |
| @@ -1201,6 +1321,7 @@ void SigninScreenHandler::HandleShowAddUser(const base::ListValue* args) { |
| &SigninScreenHandler::ShowSigninScreenIfReady, |
| weak_factory_.GetWeakPtr())); |
| } |
| + SetUserInputMethodHWDefault(); |
| } |
| void SigninScreenHandler::HandleToggleEnrollmentScreen() { |