Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/chromeos/app_mode/kiosk_app_manager.h" | 23 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
| 24 #include "chrome/browser/chromeos/input_method/input_method_util.h" | |
| 22 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" | 25 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" |
| 23 #include "chrome/browser/chromeos/login/hwid_checker.h" | 26 #include "chrome/browser/chromeos/login/hwid_checker.h" |
| 24 #include "chrome/browser/chromeos/login/login_display_host_impl.h" | 27 #include "chrome/browser/chromeos/login/login_display_host_impl.h" |
| 25 #include "chrome/browser/chromeos/login/screen_locker.h" | 28 #include "chrome/browser/chromeos/login/screen_locker.h" |
| 26 #include "chrome/browser/chromeos/login/user.h" | 29 #include "chrome/browser/chromeos/login/user.h" |
| 27 #include "chrome/browser/chromeos/login/webui_login_display.h" | 30 #include "chrome/browser/chromeos/login/webui_login_display.h" |
| 28 #include "chrome/browser/chromeos/login/wizard_controller.h" | 31 #include "chrome/browser/chromeos/login/wizard_controller.h" |
| 29 #include "chrome/browser/chromeos/net/network_portal_detector.h" | 32 #include "chrome/browser/chromeos/net/network_portal_detector.h" |
| 30 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 33 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 31 #include "chrome/browser/chromeos/settings/cros_settings.h" | 34 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 32 #include "chrome/browser/io_thread.h" | 35 #include "chrome/browser/io_thread.h" |
| 33 #include "chrome/browser/policy/browser_policy_connector.h" | 36 #include "chrome/browser/policy/browser_policy_connector.h" |
| 37 #include "chrome/browser/prefs/scoped_user_pref_update.h" | |
| 34 #include "chrome/browser/profiles/profile.h" | 38 #include "chrome/browser/profiles/profile.h" |
| 35 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" | 39 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" |
| 36 #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" | 40 #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" |
| 37 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" | 41 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" |
| 38 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" | 42 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" |
| 39 #include "chrome/common/chrome_notification_types.h" | 43 #include "chrome/common/chrome_notification_types.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" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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, | |
|
Nikita (slow)
2013/07/15 12:56:38
nit: no need to mark function static. Usually such
Alexander Alekseev
2013/07/22 14:24:21
Both gcc/clang do not warn on unused non-static fu
| |
| 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 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 805 AddCallback("unlockOnLoginSuccess", | 815 AddCallback("unlockOnLoginSuccess", |
| 806 &SigninScreenHandler::HandleUnlockOnLoginSuccess); | 816 &SigninScreenHandler::HandleUnlockOnLoginSuccess); |
| 807 AddCallback("frameLoadingCompleted", | 817 AddCallback("frameLoadingCompleted", |
| 808 &SigninScreenHandler::HandleFrameLoadingCompleted); | 818 &SigninScreenHandler::HandleFrameLoadingCompleted); |
| 809 AddCallback("showLoadingTimeoutError", | 819 AddCallback("showLoadingTimeoutError", |
| 810 &SigninScreenHandler::HandleShowLoadingTimeoutError); | 820 &SigninScreenHandler::HandleShowLoadingTimeoutError); |
| 811 AddCallback("updateOfflineLogin", | 821 AddCallback("updateOfflineLogin", |
| 812 &SigninScreenHandler::HandleUpdateOfflineLogin); | 822 &SigninScreenHandler::HandleUpdateOfflineLogin); |
| 813 } | 823 } |
| 814 | 824 |
| 825 void SigninScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { | |
| 826 registry->RegisterDictionaryPref(prefs::kUsersLRUInputMethod); | |
| 827 } | |
| 828 | |
| 815 void SigninScreenHandler::HandleGetUsers() { | 829 void SigninScreenHandler::HandleGetUsers() { |
| 816 SendUserList(false); | 830 SendUserList(false); |
| 817 } | 831 } |
| 818 | 832 |
| 819 void SigninScreenHandler::ClearAndEnablePassword() { | 833 void SigninScreenHandler::ClearAndEnablePassword() { |
| 820 CallJS("cr.ui.Oobe.resetSigninUI", false); | 834 CallJS("cr.ui.Oobe.resetSigninUI", false); |
| 821 } | 835 } |
| 822 | 836 |
| 823 void SigninScreenHandler::ClearUserPodPassword() { | 837 void SigninScreenHandler::ClearUserPodPassword() { |
| 824 CallJS("cr.ui.Oobe.clearUserPodPassword"); | 838 CallJS("cr.ui.Oobe.clearUserPodPassword"); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 961 } | 975 } |
| 962 } | 976 } |
| 963 | 977 |
| 964 void SigninScreenHandler::OnDnsCleared() { | 978 void SigninScreenHandler::OnDnsCleared() { |
| 965 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 979 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 966 dns_clear_task_running_ = false; | 980 dns_clear_task_running_ = false; |
| 967 dns_cleared_ = true; | 981 dns_cleared_ = true; |
| 968 ShowSigninScreenIfReady(); | 982 ShowSigninScreenIfReady(); |
| 969 } | 983 } |
| 970 | 984 |
| 985 void SigninScreenHandler::SetUserInputMethodHWDefault() { | |
| 986 chromeos::input_method::InputMethodManager* manager = | |
| 987 chromeos::input_method::InputMethodManager::Get(); | |
| 988 manager->ChangeInputMethod( | |
| 989 manager->GetInputMethodUtil()->GetHardwareInputMethodId()); | |
| 990 } | |
| 991 | |
| 992 static bool SetUserInputMethodImpl( | |
|
Nikita (slow)
2013/07/15 12:56:38
Please move this helper method to unnamed namespac
Alexander Alekseev
2013/07/22 14:24:21
Moved to unnamed namespace and left it static, bec
| |
| 993 const std::string& username, | |
| 994 chromeos::input_method::InputMethodManager* manager) { | |
| 995 PrefService* const local_state = g_browser_process->local_state(); | |
| 996 | |
| 997 const base::DictionaryValue* users_lru_input_methods = | |
| 998 local_state->GetDictionary(prefs::kUsersLRUInputMethod); | |
| 999 | |
| 1000 if (users_lru_input_methods == NULL) { | |
| 1001 DLOG(WARNING) << "SetUserInputMethod('" << username | |
| 1002 << "'): no kUsersLRUInputMethod"; | |
| 1003 return false; | |
| 1004 } | |
| 1005 | |
| 1006 std::string input_method; | |
| 1007 | |
| 1008 if (!users_lru_input_methods->GetStringWithoutPathExpansion(username, | |
| 1009 &input_method)) { | |
| 1010 DLOG(INFO) << "SetUserInputMethod('" << username | |
| 1011 << "'): no input method for this user"; | |
| 1012 return false; | |
| 1013 } | |
| 1014 | |
| 1015 if (input_method.empty()) | |
| 1016 return false; | |
| 1017 | |
| 1018 if (!manager->IsFullLatinKeyboard(input_method)) { | |
| 1019 LOG(WARNING) << "SetUserInputMethod('" << username | |
| 1020 << "'): stored user LRU input method '" << input_method | |
| 1021 << "' is no longer Full Latin Keyboard Language" | |
| 1022 << " (entry dropped). Use hardware default instead."; | |
| 1023 | |
| 1024 DictionaryPrefUpdate updater(local_state, prefs::kUsersLRUInputMethod); | |
| 1025 | |
| 1026 base::DictionaryValue* const users_lru_input_methods = updater.Get(); | |
| 1027 if (users_lru_input_methods != NULL) { | |
| 1028 users_lru_input_methods->SetStringWithoutPathExpansion(username, ""); | |
| 1029 } | |
| 1030 return false; | |
| 1031 } | |
| 1032 | |
| 1033 if (!Contains(manager->GetActiveInputMethodIds(), input_method)) { | |
| 1034 if (!manager->EnableInputMethod(input_method)) { | |
| 1035 DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username | |
| 1036 << "'): user input method '" << input_method | |
| 1037 << "' is not enabled and enabling failed (ignored!)."; | |
| 1038 } | |
| 1039 } | |
| 1040 manager->ChangeInputMethod(input_method); | |
| 1041 | |
| 1042 return true; | |
| 1043 } | |
| 1044 | |
| 1045 // Update keyboard layout to least recently used by the user. | |
| 1046 void SigninScreenHandler::SetUserInputMethod(const std::string& username) { | |
| 1047 chromeos::input_method::InputMethodManager* const manager = | |
| 1048 chromeos::input_method::InputMethodManager::Get(); | |
| 1049 | |
| 1050 const chromeos::input_method::InputMethodUtil& ime_util = | |
| 1051 *manager->GetInputMethodUtil(); | |
| 1052 | |
| 1053 const bool succeed = SetUserInputMethodImpl(username, manager); | |
| 1054 | |
| 1055 // This is also a case when LRU layout is set only for a few local users, | |
| 1056 // thus others need to be switched to default locale. | |
| 1057 // Otherwise they will end up using another user's locale to log in. | |
| 1058 if (!succeed) { | |
| 1059 DLOG(INFO) << "SetUserInputMethod('" << username | |
| 1060 << "'): failed to set user layout. Switching to default '" | |
| 1061 << ime_util.GetHardwareInputMethodId() << "'"; | |
| 1062 | |
| 1063 SetUserInputMethodHWDefault(); | |
| 1064 } | |
| 1065 } | |
| 1066 | |
| 971 void SigninScreenHandler::ShowSigninScreenIfReady() { | 1067 void SigninScreenHandler::ShowSigninScreenIfReady() { |
| 972 if (!dns_cleared_ || !cookies_cleared_ || !delegate_) | 1068 if (!dns_cleared_ || !cookies_cleared_ || !delegate_) |
| 973 return; | 1069 return; |
| 974 | 1070 |
| 975 std::string active_network = | 1071 std::string active_network = |
| 976 network_state_informer_->active_network_service_path(); | 1072 network_state_informer_->active_network_service_path(); |
| 977 if (gaia_silent_load_ && | 1073 if (gaia_silent_load_ && |
| 978 (!network_state_informer_->is_online() || | 1074 (!network_state_informer_->is_online() || |
| 979 gaia_silent_load_network_ != active_network)) { | 1075 gaia_silent_load_network_ != active_network)) { |
| 980 // Network has changed. Force Gaia reload. | 1076 // Network has changed. Force Gaia reload. |
| 981 gaia_silent_load_ = false; | 1077 gaia_silent_load_ = false; |
| 982 // Gaia page will be realoded, so focus isn't stolen anymore. | 1078 // Gaia page will be realoded, so focus isn't stolen anymore. |
| 983 focus_stolen_ = false; | 1079 focus_stolen_ = false; |
| 984 } | 1080 } |
| 985 | 1081 |
| 986 // Note that LoadAuthExtension clears |email_|. | 1082 // Note that LoadAuthExtension clears |email_|. |
| 987 if (email_.empty()) | 1083 if (email_.empty()) |
| 988 delegate_->LoadSigninWallpaper(); | 1084 delegate_->LoadSigninWallpaper(); |
| 989 else | 1085 else |
| 990 delegate_->LoadWallpaper(email_); | 1086 delegate_->LoadWallpaper(email_); |
| 991 | 1087 |
| 1088 // Set Least Recently Used input method for the user. | |
| 1089 if (!email_.empty()) | |
| 1090 SetUserInputMethod(email_); | |
| 1091 | |
| 992 LoadAuthExtension(!gaia_silent_load_, false, false); | 1092 LoadAuthExtension(!gaia_silent_load_, false, false); |
| 993 UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL); | 1093 UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL); |
| 994 | 1094 |
| 995 if (gaia_silent_load_) { | 1095 if (gaia_silent_load_) { |
| 996 // The variable is assigned to false because silently loaded Gaia page was | 1096 // The variable is assigned to false because silently loaded Gaia page was |
| 997 // used. | 1097 // used. |
| 998 gaia_silent_load_ = false; | 1098 gaia_silent_load_ = false; |
| 999 if (focus_stolen_) | 1099 if (focus_stolen_) |
| 1000 HandleLoginWebuiReady(); | 1100 HandleLoginWebuiReady(); |
| 1001 } | 1101 } |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1194 if (gaia_silent_load_ && email_.empty()) { | 1294 if (gaia_silent_load_ && email_.empty()) { |
| 1195 dns_cleared_ = true; | 1295 dns_cleared_ = true; |
| 1196 cookies_cleared_ = true; | 1296 cookies_cleared_ = true; |
| 1197 ShowSigninScreenIfReady(); | 1297 ShowSigninScreenIfReady(); |
| 1198 } else { | 1298 } else { |
| 1199 StartClearingDnsCache(); | 1299 StartClearingDnsCache(); |
| 1200 StartClearingCookies(base::Bind( | 1300 StartClearingCookies(base::Bind( |
| 1201 &SigninScreenHandler::ShowSigninScreenIfReady, | 1301 &SigninScreenHandler::ShowSigninScreenIfReady, |
| 1202 weak_factory_.GetWeakPtr())); | 1302 weak_factory_.GetWeakPtr())); |
| 1203 } | 1303 } |
| 1304 SetUserInputMethodHWDefault(); | |
| 1204 } | 1305 } |
| 1205 | 1306 |
| 1206 void SigninScreenHandler::HandleToggleEnrollmentScreen() { | 1307 void SigninScreenHandler::HandleToggleEnrollmentScreen() { |
| 1207 if (delegate_) | 1308 if (delegate_) |
| 1208 delegate_->ShowEnterpriseEnrollmentScreen(); | 1309 delegate_->ShowEnterpriseEnrollmentScreen(); |
| 1209 } | 1310 } |
| 1210 | 1311 |
| 1211 void SigninScreenHandler::HandleToggleKioskEnableScreen() { | 1312 void SigninScreenHandler::HandleToggleKioskEnableScreen() { |
| 1212 if (delegate_ && | 1313 if (delegate_ && |
| 1213 !g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) { | 1314 !g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) { |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1674 rvh->ExecuteJavascriptInWebFrame( | 1775 rvh->ExecuteJavascriptInWebFrame( |
| 1675 ASCIIToUTF16("//iframe[@id='signin-frame']\n//iframe"), | 1776 ASCIIToUTF16("//iframe[@id='signin-frame']\n//iframe"), |
| 1676 ASCIIToUTF16(code)); | 1777 ASCIIToUTF16(code)); |
| 1677 | 1778 |
| 1678 // Test properties are cleared in HandleCompleteLogin because the form | 1779 // Test properties are cleared in HandleCompleteLogin because the form |
| 1679 // submission might fail and login will not be attempted after reloading | 1780 // submission might fail and login will not be attempted after reloading |
| 1680 // if they are cleared here. | 1781 // if they are cleared here. |
| 1681 } | 1782 } |
| 1682 | 1783 |
| 1683 } // namespace chromeos | 1784 } // namespace chromeos |
| OLD | NEW |