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

Side by Side Diff: chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc

Issue 18856014: We should switch the keyboard layout to the layout the user set according to (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Diff versus master. Created 7 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" 5 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/chromeos/chromeos_version.h"
8 #include "base/command_line.h" 9 #include "base/command_line.h"
9 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
10 #include "base/logging.h" 11 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
12 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/prefs/pref_registry_simple.h"
13 #include "base/prefs/pref_service.h" 15 #include "base/prefs/pref_service.h"
14 #include "base/strings/string16.h" 16 #include "base/strings/string16.h"
15 #include "base/strings/string_util.h" 17 #include "base/strings/string_util.h"
16 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
17 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
18 #include "chrome/browser/browser_process.h" 20 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/browser_process_platform_part_chromeos.h" 21 #include "chrome/browser/browser_process_platform_part_chromeos.h"
20 #include "chrome/browser/browser_shutdown.h" 22 #include "chrome/browser/browser_shutdown.h"
21 #include "chrome/browser/chrome_notification_types.h" 23 #include "chrome/browser/chrome_notification_types.h"
22 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" 24 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
25 #include "chrome/browser/chromeos/input_method/input_method_util.h"
23 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" 26 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h"
24 #include "chrome/browser/chromeos/login/hwid_checker.h" 27 #include "chrome/browser/chromeos/login/hwid_checker.h"
25 #include "chrome/browser/chromeos/login/login_display_host_impl.h" 28 #include "chrome/browser/chromeos/login/login_display_host_impl.h"
26 #include "chrome/browser/chromeos/login/screen_locker.h" 29 #include "chrome/browser/chromeos/login/screen_locker.h"
27 #include "chrome/browser/chromeos/login/user.h" 30 #include "chrome/browser/chromeos/login/user.h"
28 #include "chrome/browser/chromeos/login/webui_login_display.h" 31 #include "chrome/browser/chromeos/login/webui_login_display.h"
29 #include "chrome/browser/chromeos/login/wizard_controller.h" 32 #include "chrome/browser/chromeos/login/wizard_controller.h"
30 #include "chrome/browser/chromeos/net/network_portal_detector.h" 33 #include "chrome/browser/chromeos/net/network_portal_detector.h"
31 #include "chrome/browser/chromeos/profiles/profile_helper.h" 34 #include "chrome/browser/chromeos/profiles/profile_helper.h"
32 #include "chrome/browser/chromeos/settings/cros_settings.h" 35 #include "chrome/browser/chromeos/settings/cros_settings.h"
33 #include "chrome/browser/io_thread.h" 36 #include "chrome/browser/io_thread.h"
34 #include "chrome/browser/policy/browser_policy_connector.h" 37 #include "chrome/browser/policy/browser_policy_connector.h"
38 #include "chrome/browser/prefs/scoped_user_pref_update.h"
35 #include "chrome/browser/profiles/profile.h" 39 #include "chrome/browser/profiles/profile.h"
36 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" 40 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
37 #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" 41 #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h"
38 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" 42 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
39 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 43 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
40 #include "chrome/common/chrome_switches.h" 44 #include "chrome/common/chrome_switches.h"
41 #include "chrome/common/pref_names.h" 45 #include "chrome/common/pref_names.h"
42 #include "chrome/common/url_constants.h" 46 #include "chrome/common/url_constants.h"
43 #include "chromeos/chromeos_switches.h" 47 #include "chromeos/chromeos_switches.h"
44 #include "chromeos/dbus/dbus_thread_manager.h" 48 #include "chromeos/dbus/dbus_thread_manager.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 // The Task posted to PostTaskAndReply in StartClearingDnsCache on the IO 100 // The Task posted to PostTaskAndReply in StartClearingDnsCache on the IO
97 // thread. 101 // thread.
98 void ClearDnsCache(IOThread* io_thread) { 102 void ClearDnsCache(IOThread* io_thread) {
99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
100 if (browser_shutdown::IsTryingToQuit()) 104 if (browser_shutdown::IsTryingToQuit())
101 return; 105 return;
102 106
103 io_thread->ClearHostCache(); 107 io_thread->ClearHostCache();
104 } 108 }
105 109
110 static bool Contains(const std::vector<std::string>& container,
111 const std::string& value) {
112 return std::find(container.begin(), container.end(), value) !=
113 container.end();
114 }
115
106 } // namespace 116 } // namespace
107 117
108 namespace chromeos { 118 namespace chromeos {
109 119
110 namespace { 120 namespace {
111 121
112 const char kNetworkStateOffline[] = "offline"; 122 const char kNetworkStateOffline[] = "offline";
113 const char kNetworkStateOnline[] = "online"; 123 const char kNetworkStateOnline[] = "online";
114 const char kNetworkStateCaptivePortal[] = "behind captive portal"; 124 const char kNetworkStateCaptivePortal[] = "behind captive portal";
115 const char kNetworkStateConnecting[] = "connecting"; 125 const char kNetworkStateConnecting[] = "connecting";
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED: 315 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED:
306 if (network->connection_state() != flimflam::kStateOnline) 316 if (network->connection_state() != flimflam::kStateOnline)
307 RecordDiscrepancyWithShill(network, state.status); 317 RecordDiscrepancyWithShill(network, state.status);
308 break; 318 break;
309 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT: 319 case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT:
310 NOTREACHED(); 320 NOTREACHED();
311 break; 321 break;
312 } 322 }
313 } 323 }
314 324
325 static bool SetUserInputMethodImpl(
326 const std::string& username,
327 chromeos::input_method::InputMethodManager* manager) {
328 PrefService* const local_state = g_browser_process->local_state();
329
330 const base::DictionaryValue* users_lru_input_methods =
331 local_state->GetDictionary(prefs::kUsersLRUInputMethod);
332
333 if (users_lru_input_methods == NULL) {
334 DLOG(WARNING) << "SetUserInputMethod('" << username
335 << "'): no kUsersLRUInputMethod";
336 return false;
337 }
338
339 std::string input_method;
340
341 if (!users_lru_input_methods->GetStringWithoutPathExpansion(username,
342 &input_method)) {
343 DLOG(INFO) << "SetUserInputMethod('" << username
344 << "'): no input method for this user";
345 return false;
346 }
347
348 if (input_method.empty())
349 return false;
350
351 if (!manager->IsFullLatinKeyboard(input_method)) {
352 LOG(WARNING) << "SetUserInputMethod('" << username
353 << "'): stored user LRU input method '" << input_method
354 << "' is no longer Full Latin Keyboard Language"
355 << " (entry dropped). Use hardware default instead.";
356
357 DictionaryPrefUpdate updater(local_state, prefs::kUsersLRUInputMethod);
358
359 base::DictionaryValue* const users_lru_input_methods = updater.Get();
360 if (users_lru_input_methods != NULL) {
361 users_lru_input_methods->SetStringWithoutPathExpansion(username, "");
362 }
363 return false;
364 }
365
366 if (!Contains(manager->GetActiveInputMethodIds(), input_method)) {
367 if (!manager->EnableInputMethod(input_method)) {
368 DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username
369 << "'): user input method '" << input_method
370 << "' is not enabled and enabling failed (ignored!).";
371 }
372 }
373 manager->ChangeInputMethod(input_method);
374
375 return true;
376 }
377
315 } // namespace 378 } // namespace
316 379
317 // SigninScreenHandler implementation ------------------------------------------ 380 // SigninScreenHandler implementation ------------------------------------------
318 381
319 SigninScreenHandler::SigninScreenHandler( 382 SigninScreenHandler::SigninScreenHandler(
320 const scoped_refptr<NetworkStateInformer>& network_state_informer, 383 const scoped_refptr<NetworkStateInformer>& network_state_informer,
321 ErrorScreenActor* error_screen_actor) 384 ErrorScreenActor* error_screen_actor)
322 : ui_state_(UI_STATE_UNKNOWN), 385 : ui_state_(UI_STATE_UNKNOWN),
323 frame_state_(FRAME_STATE_UNKNOWN), 386 frame_state_(FRAME_STATE_UNKNOWN),
324 frame_error_(net::OK), 387 frame_error_(net::OK),
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 AddCallback("unlockOnLoginSuccess", 870 AddCallback("unlockOnLoginSuccess",
808 &SigninScreenHandler::HandleUnlockOnLoginSuccess); 871 &SigninScreenHandler::HandleUnlockOnLoginSuccess);
809 AddCallback("frameLoadingCompleted", 872 AddCallback("frameLoadingCompleted",
810 &SigninScreenHandler::HandleFrameLoadingCompleted); 873 &SigninScreenHandler::HandleFrameLoadingCompleted);
811 AddCallback("showLoadingTimeoutError", 874 AddCallback("showLoadingTimeoutError",
812 &SigninScreenHandler::HandleShowLoadingTimeoutError); 875 &SigninScreenHandler::HandleShowLoadingTimeoutError);
813 AddCallback("updateOfflineLogin", 876 AddCallback("updateOfflineLogin",
814 &SigninScreenHandler::HandleUpdateOfflineLogin); 877 &SigninScreenHandler::HandleUpdateOfflineLogin);
815 } 878 }
816 879
880 void SigninScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) {
881 registry->RegisterDictionaryPref(prefs::kUsersLRUInputMethod);
882 }
883
817 void SigninScreenHandler::HandleGetUsers() { 884 void SigninScreenHandler::HandleGetUsers() {
818 SendUserList(false); 885 SendUserList(false);
819 } 886 }
820 887
821 void SigninScreenHandler::ClearAndEnablePassword() { 888 void SigninScreenHandler::ClearAndEnablePassword() {
822 CallJS("cr.ui.Oobe.resetSigninUI", false); 889 CallJS("cr.ui.Oobe.resetSigninUI", false);
823 } 890 }
824 891
825 void SigninScreenHandler::ClearUserPodPassword() { 892 void SigninScreenHandler::ClearUserPodPassword() {
826 CallJS("cr.ui.Oobe.clearUserPodPassword"); 893 CallJS("cr.ui.Oobe.clearUserPodPassword");
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 } 1030 }
964 } 1031 }
965 1032
966 void SigninScreenHandler::OnDnsCleared() { 1033 void SigninScreenHandler::OnDnsCleared() {
967 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1034 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
968 dns_clear_task_running_ = false; 1035 dns_clear_task_running_ = false;
969 dns_cleared_ = true; 1036 dns_cleared_ = true;
970 ShowSigninScreenIfReady(); 1037 ShowSigninScreenIfReady();
971 } 1038 }
972 1039
1040 void SigninScreenHandler::SetUserInputMethodHWDefault() {
1041 chromeos::input_method::InputMethodManager* manager =
1042 chromeos::input_method::InputMethodManager::Get();
1043 manager->ChangeInputMethod(
1044 manager->GetInputMethodUtil()->GetHardwareInputMethodId());
1045 }
1046
1047 // Update keyboard layout to least recently used by the user.
1048 void SigninScreenHandler::SetUserInputMethod(const std::string& username) {
1049 chromeos::input_method::InputMethodManager* const manager =
1050 chromeos::input_method::InputMethodManager::Get();
1051
1052 const chromeos::input_method::InputMethodUtil& ime_util =
1053 *manager->GetInputMethodUtil();
1054
1055 const bool succeed = SetUserInputMethodImpl(username, manager);
1056
1057 // This is also a case when LRU layout is set only for a few local users,
1058 // thus others need to be switched to default locale.
1059 // Otherwise they will end up using another user's locale to log in.
1060 if (!succeed) {
1061 DLOG(INFO) << "SetUserInputMethod('" << username
1062 << "'): failed to set user layout. Switching to default '"
1063 << ime_util.GetHardwareInputMethodId() << "'";
1064
1065 SetUserInputMethodHWDefault();
1066 }
1067 }
1068
973 void SigninScreenHandler::ShowSigninScreenIfReady() { 1069 void SigninScreenHandler::ShowSigninScreenIfReady() {
974 if (!dns_cleared_ || !cookies_cleared_ || !delegate_) 1070 if (!dns_cleared_ || !cookies_cleared_ || !delegate_)
975 return; 1071 return;
976 1072
977 std::string active_network = 1073 std::string active_network =
978 network_state_informer_->active_network_service_path(); 1074 network_state_informer_->active_network_service_path();
979 if (gaia_silent_load_ && 1075 if (gaia_silent_load_ &&
980 (!network_state_informer_->is_online() || 1076 (!network_state_informer_->is_online() ||
981 gaia_silent_load_network_ != active_network)) { 1077 gaia_silent_load_network_ != active_network)) {
982 // Network has changed. Force Gaia reload. 1078 // Network has changed. Force Gaia reload.
983 gaia_silent_load_ = false; 1079 gaia_silent_load_ = false;
984 // Gaia page will be realoded, so focus isn't stolen anymore. 1080 // Gaia page will be realoded, so focus isn't stolen anymore.
985 focus_stolen_ = false; 1081 focus_stolen_ = false;
986 } 1082 }
987 1083
988 // Note that LoadAuthExtension clears |email_|. 1084 // Note that LoadAuthExtension clears |email_|.
989 if (email_.empty()) 1085 if (email_.empty())
990 delegate_->LoadSigninWallpaper(); 1086 delegate_->LoadSigninWallpaper();
991 else 1087 else
992 delegate_->LoadWallpaper(email_); 1088 delegate_->LoadWallpaper(email_);
993 1089
1090 // Set Least Recently Used input method for the user.
1091 if (!email_.empty())
1092 SetUserInputMethod(email_);
1093
994 LoadAuthExtension(!gaia_silent_load_, false, false); 1094 LoadAuthExtension(!gaia_silent_load_, false, false);
995 UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL); 1095 UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL);
996 1096
997 if (gaia_silent_load_) { 1097 if (gaia_silent_load_) {
998 // The variable is assigned to false because silently loaded Gaia page was 1098 // The variable is assigned to false because silently loaded Gaia page was
999 // used. 1099 // used.
1000 gaia_silent_load_ = false; 1100 gaia_silent_load_ = false;
1001 if (focus_stolen_) 1101 if (focus_stolen_)
1002 HandleLoginWebuiReady(); 1102 HandleLoginWebuiReady();
1003 } 1103 }
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 if (gaia_silent_load_ && email_.empty()) { 1295 if (gaia_silent_load_ && email_.empty()) {
1196 dns_cleared_ = true; 1296 dns_cleared_ = true;
1197 cookies_cleared_ = true; 1297 cookies_cleared_ = true;
1198 ShowSigninScreenIfReady(); 1298 ShowSigninScreenIfReady();
1199 } else { 1299 } else {
1200 StartClearingDnsCache(); 1300 StartClearingDnsCache();
1201 StartClearingCookies(base::Bind( 1301 StartClearingCookies(base::Bind(
1202 &SigninScreenHandler::ShowSigninScreenIfReady, 1302 &SigninScreenHandler::ShowSigninScreenIfReady,
1203 weak_factory_.GetWeakPtr())); 1303 weak_factory_.GetWeakPtr()));
1204 } 1304 }
1305 SetUserInputMethodHWDefault();
1205 } 1306 }
1206 1307
1207 void SigninScreenHandler::HandleToggleEnrollmentScreen() { 1308 void SigninScreenHandler::HandleToggleEnrollmentScreen() {
1208 if (delegate_) 1309 if (delegate_)
1209 delegate_->ShowEnterpriseEnrollmentScreen(); 1310 delegate_->ShowEnterpriseEnrollmentScreen();
1210 } 1311 }
1211 1312
1212 void SigninScreenHandler::HandleToggleKioskEnableScreen() { 1313 void SigninScreenHandler::HandleToggleKioskEnableScreen() {
1213 if (delegate_ && 1314 if (delegate_ &&
1214 !g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) { 1315 !g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) {
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 rvh->ExecuteJavascriptInWebFrame( 1771 rvh->ExecuteJavascriptInWebFrame(
1671 ASCIIToUTF16("//iframe[@id='signin-frame']\n//iframe"), 1772 ASCIIToUTF16("//iframe[@id='signin-frame']\n//iframe"),
1672 ASCIIToUTF16(code)); 1773 ASCIIToUTF16(code));
1673 1774
1674 // Test properties are cleared in HandleCompleteLogin because the form 1775 // Test properties are cleared in HandleCompleteLogin because the form
1675 // submission might fail and login will not be attempted after reloading 1776 // submission might fail and login will not be attempted after reloading
1676 // if they are cleared here. 1777 // if they are cleared here.
1677 } 1778 }
1678 1779
1679 } // namespace chromeos 1780 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h ('k') | chrome/chrome_browser_chromeos.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698