| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 std::string GetNetworkName(const std::string& service_path) { | 168 std::string GetNetworkName(const std::string& service_path) { |
| 169 const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> | 169 const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> |
| 170 GetNetworkState(service_path); | 170 GetNetworkState(service_path); |
| 171 if (!network) | 171 if (!network) |
| 172 return std::string(); | 172 return std::string(); |
| 173 return network->name(); | 173 return network->name(); |
| 174 } | 174 } |
| 175 | 175 |
| 176 static bool SetUserInputMethodImpl( | 176 static bool SetUserInputMethodImpl( |
| 177 const std::string& username, | 177 const std::string& username, |
| 178 const std::string& user_input_method, | 178 chromeos::input_method::InputMethodManager* manager) { |
| 179 input_method::InputMethodManager::State* ime_state) { | 179 PrefService* const local_state = g_browser_process->local_state(); |
| 180 if (!chromeos::input_method::InputMethodManager::Get()->IsLoginKeyboard( | 180 |
| 181 user_input_method)) { | 181 const base::DictionaryValue* users_lru_input_methods = |
| 182 local_state->GetDictionary(prefs::kUsersLRUInputMethod); |
| 183 |
| 184 if (users_lru_input_methods == NULL) { |
| 185 DLOG(WARNING) << "SetUserInputMethod('" << username |
| 186 << "'): no kUsersLRUInputMethod"; |
| 187 return false; |
| 188 } |
| 189 |
| 190 std::string input_method; |
| 191 |
| 192 if (!users_lru_input_methods->GetStringWithoutPathExpansion(username, |
| 193 &input_method)) { |
| 194 DVLOG(0) << "SetUserInputMethod('" << username |
| 195 << "'): no input method for this user"; |
| 196 return false; |
| 197 } |
| 198 |
| 199 if (input_method.empty()) |
| 200 return false; |
| 201 |
| 202 if (!manager->IsLoginKeyboard(input_method)) { |
| 182 LOG(WARNING) << "SetUserInputMethod('" << username | 203 LOG(WARNING) << "SetUserInputMethod('" << username |
| 183 << "'): stored user LRU input method '" << user_input_method | 204 << "'): stored user LRU input method '" << input_method |
| 184 << "' is no longer Full Latin Keyboard Language" | 205 << "' is no longer Full Latin Keyboard Language" |
| 185 << " (entry dropped). Use hardware default instead."; | 206 << " (entry dropped). Use hardware default instead."; |
| 186 | 207 |
| 187 PrefService* const local_state = g_browser_process->local_state(); | |
| 188 DictionaryPrefUpdate updater(local_state, prefs::kUsersLRUInputMethod); | 208 DictionaryPrefUpdate updater(local_state, prefs::kUsersLRUInputMethod); |
| 189 | 209 |
| 190 base::DictionaryValue* const users_lru_input_methods = updater.Get(); | 210 base::DictionaryValue* const users_lru_input_methods = updater.Get(); |
| 191 if (users_lru_input_methods != NULL) { | 211 if (users_lru_input_methods != NULL) { |
| 192 users_lru_input_methods->SetStringWithoutPathExpansion(username, ""); | 212 users_lru_input_methods->SetStringWithoutPathExpansion(username, ""); |
| 193 } | 213 } |
| 194 return false; | 214 return false; |
| 195 } | 215 } |
| 196 | 216 |
| 197 if (!Contains(ime_state->GetActiveInputMethodIds(), user_input_method)) { | 217 if (!Contains(manager->GetActiveIMEState()->GetActiveInputMethodIds(), |
| 198 if (!ime_state->EnableInputMethod(user_input_method)) { | 218 input_method)) { |
| 219 if (!manager->GetActiveIMEState()->EnableInputMethod(input_method)) { |
| 199 DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username | 220 DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username |
| 200 << "'): user input method '" << user_input_method | 221 << "'): user input method '" << input_method |
| 201 << "' is not enabled and enabling failed (ignored!)."; | 222 << "' is not enabled and enabling failed (ignored!)."; |
| 202 } | 223 } |
| 203 } | 224 } |
| 204 ime_state->ChangeInputMethod(user_input_method, false /* show_message */); | 225 manager->GetActiveIMEState()->ChangeInputMethod(input_method, |
| 226 false /* show_message */); |
| 205 | 227 |
| 206 return true; | 228 return true; |
| 207 } | 229 } |
| 208 | 230 |
| 209 } // namespace | 231 } // namespace |
| 210 | 232 |
| 211 // LoginScreenContext implementation ------------------------------------------ | 233 // LoginScreenContext implementation ------------------------------------------ |
| 212 | 234 |
| 213 LoginScreenContext::LoginScreenContext() { | 235 LoginScreenContext::LoginScreenContext() { |
| 214 Init(); | 236 Init(); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 policy::ConsumerManagementService* consumer_management = | 307 policy::ConsumerManagementService* consumer_management = |
| 286 g_browser_process->platform_part()->browser_policy_connector_chromeos()-> | 308 g_browser_process->platform_part()->browser_policy_connector_chromeos()-> |
| 287 GetConsumerManagementService(); | 309 GetConsumerManagementService(); |
| 288 is_enrolling_consumer_management_ = | 310 is_enrolling_consumer_management_ = |
| 289 consumer_management && | 311 consumer_management && |
| 290 consumer_management->GetEnrollmentStage() == | 312 consumer_management->GetEnrollmentStage() == |
| 291 policy::ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED; | 313 policy::ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED; |
| 292 } | 314 } |
| 293 | 315 |
| 294 SigninScreenHandler::~SigninScreenHandler() { | 316 SigninScreenHandler::~SigninScreenHandler() { |
| 295 OobeUI* oobe_ui = GetOobeUI(); | |
| 296 if (oobe_ui) | |
| 297 oobe_ui->RemoveObserver(this); | |
| 298 chromeos::input_method::ImeKeyboard* keyboard = | 317 chromeos::input_method::ImeKeyboard* keyboard = |
| 299 chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard(); | 318 chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard(); |
| 300 if (keyboard) | 319 if (keyboard) |
| 301 keyboard->RemoveObserver(this); | 320 keyboard->RemoveObserver(this); |
| 302 weak_factory_.InvalidateWeakPtrs(); | 321 weak_factory_.InvalidateWeakPtrs(); |
| 303 if (delegate_) | 322 if (delegate_) |
| 304 delegate_->SetWebUIHandler(NULL); | 323 delegate_->SetWebUIHandler(NULL); |
| 305 network_state_informer_->RemoveObserver(this); | 324 network_state_informer_->RemoveObserver(this); |
| 306 if (max_mode_delegate_) { | 325 if (max_mode_delegate_) { |
| 307 max_mode_delegate_->RemoveObserver(this); | 326 max_mode_delegate_->RemoveObserver(this); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 void SigninScreenHandler::OnNetworkReady() { | 471 void SigninScreenHandler::OnNetworkReady() { |
| 453 VLOG(1) << "OnNetworkReady() call."; | 472 VLOG(1) << "OnNetworkReady() call."; |
| 454 DCHECK(gaia_screen_handler_); | 473 DCHECK(gaia_screen_handler_); |
| 455 gaia_screen_handler_->MaybePreloadAuthExtension(); | 474 gaia_screen_handler_->MaybePreloadAuthExtension(); |
| 456 } | 475 } |
| 457 | 476 |
| 458 void SigninScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) { | 477 void SigninScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) { |
| 459 UpdateStateInternal(reason, false); | 478 UpdateStateInternal(reason, false); |
| 460 } | 479 } |
| 461 | 480 |
| 462 void SigninScreenHandler::SetFocusPODCallbackForTesting( | |
| 463 base::Closure callback) { | |
| 464 test_focus_pod_callback_ = callback; | |
| 465 } | |
| 466 | |
| 467 // SigninScreenHandler, private: ----------------------------------------------- | 481 // SigninScreenHandler, private: ----------------------------------------------- |
| 468 | 482 |
| 469 void SigninScreenHandler::ShowImpl() { | 483 void SigninScreenHandler::ShowImpl() { |
| 470 if (!page_is_ready()) { | 484 if (!page_is_ready()) { |
| 471 show_on_init_ = true; | 485 show_on_init_ = true; |
| 472 return; | 486 return; |
| 473 } | 487 } |
| 474 | 488 |
| 475 if (!ime_state_.get()) | |
| 476 ime_state_ = input_method::InputMethodManager::Get()->GetActiveIMEState(); | |
| 477 | |
| 478 GetOobeUI()->AddObserver(this); | |
| 479 | |
| 480 if (oobe_ui_ || is_enrolling_consumer_management_) { | 489 if (oobe_ui_ || is_enrolling_consumer_management_) { |
| 481 // Shows new user sign-in for OOBE. | 490 // Shows new user sign-in for OOBE. |
| 482 OnShowAddUser(); | 491 OnShowAddUser(); |
| 483 } else { | 492 } else { |
| 484 // Populates account picker. Animation is turned off for now until we | 493 // Populates account picker. Animation is turned off for now until we |
| 485 // figure out how to make it fast enough. | 494 // figure out how to make it fast enough. |
| 486 delegate_->HandleGetUsers(); | 495 delegate_->HandleGetUsers(); |
| 487 | 496 |
| 488 // Reset Caps Lock state when login screen is shown. | 497 // Reset Caps Lock state when login screen is shown. |
| 489 input_method::InputMethodManager::Get() | 498 input_method::InputMethodManager::Get() |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 | 787 |
| 779 // This message is sent by the kiosk app menu, but is handled here | 788 // This message is sent by the kiosk app menu, but is handled here |
| 780 // so we can tell the delegate to launch the app. | 789 // so we can tell the delegate to launch the app. |
| 781 AddCallback("launchKioskApp", &SigninScreenHandler::HandleLaunchKioskApp); | 790 AddCallback("launchKioskApp", &SigninScreenHandler::HandleLaunchKioskApp); |
| 782 } | 791 } |
| 783 | 792 |
| 784 void SigninScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { | 793 void SigninScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { |
| 785 registry->RegisterDictionaryPref(prefs::kUsersLRUInputMethod); | 794 registry->RegisterDictionaryPref(prefs::kUsersLRUInputMethod); |
| 786 } | 795 } |
| 787 | 796 |
| 788 void SigninScreenHandler::OnCurrentScreenChanged(OobeUI::Screen current_screen, | |
| 789 OobeUI::Screen new_screen) { | |
| 790 if (new_screen == OobeUI::SCREEN_ACCOUNT_PICKER) { | |
| 791 // Restore active IME state if returning to user pod row screen. | |
| 792 input_method::InputMethodManager::Get()->SetState(ime_state_); | |
| 793 } | |
| 794 } | |
| 795 | |
| 796 std::string SigninScreenHandler::GetUserLRUInputMethod( | |
| 797 const std::string& username) const { | |
| 798 PrefService* const local_state = g_browser_process->local_state(); | |
| 799 const base::DictionaryValue* users_lru_input_methods = | |
| 800 local_state->GetDictionary(prefs::kUsersLRUInputMethod); | |
| 801 | |
| 802 if (users_lru_input_methods == NULL) { | |
| 803 DLOG(WARNING) << "GetUserLRUInputMethod('" << username | |
| 804 << "'): no kUsersLRUInputMethod"; | |
| 805 return std::string(); | |
| 806 } | |
| 807 | |
| 808 std::string input_method; | |
| 809 | |
| 810 if (!users_lru_input_methods->GetStringWithoutPathExpansion(username, | |
| 811 &input_method)) { | |
| 812 DVLOG(0) << "GetUserLRUInputMethod('" << username | |
| 813 << "'): no input method for this user"; | |
| 814 return std::string(); | |
| 815 } | |
| 816 | |
| 817 return input_method; | |
| 818 } | |
| 819 | |
| 820 void SigninScreenHandler::HandleGetUsers() { | 797 void SigninScreenHandler::HandleGetUsers() { |
| 821 if (delegate_) | 798 if (delegate_) |
| 822 delegate_->HandleGetUsers(); | 799 delegate_->HandleGetUsers(); |
| 823 } | 800 } |
| 824 | 801 |
| 825 void SigninScreenHandler::ClearAndEnablePassword() { | 802 void SigninScreenHandler::ClearAndEnablePassword() { |
| 826 core_oobe_actor_->ResetSignInUI(false); | 803 core_oobe_actor_->ResetSignInUI(false); |
| 827 } | 804 } |
| 828 | 805 |
| 829 void SigninScreenHandler::ClearUserPodPassword() { | 806 void SigninScreenHandler::ClearUserPodPassword() { |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 | 993 |
| 1017 bool SigninScreenHandler::ShouldLoadGaia() const { | 994 bool SigninScreenHandler::ShouldLoadGaia() const { |
| 1018 // Fetching of the extension is not started before account picker page is | 995 // Fetching of the extension is not started before account picker page is |
| 1019 // loaded because it can affect the loading speed. | 996 // loaded because it can affect the loading speed. |
| 1020 // Do not load the extension for the screen locker, see crosbug.com/25018. | 997 // Do not load the extension for the screen locker, see crosbug.com/25018. |
| 1021 return !ScreenLocker::default_screen_locker() && | 998 return !ScreenLocker::default_screen_locker() && |
| 1022 is_account_picker_showing_first_time_; | 999 is_account_picker_showing_first_time_; |
| 1023 } | 1000 } |
| 1024 | 1001 |
| 1025 // Update keyboard layout to least recently used by the user. | 1002 // Update keyboard layout to least recently used by the user. |
| 1026 void SigninScreenHandler::SetUserInputMethod( | 1003 void SigninScreenHandler::SetUserInputMethod(const std::string& username) { |
| 1027 const std::string& username, | |
| 1028 input_method::InputMethodManager::State* ime_state) { | |
| 1029 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); | 1004 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); |
| 1030 if (user_manager->IsUserLoggedIn()) { | 1005 if (user_manager->IsUserLoggedIn()) { |
| 1031 // We are on sign-in screen inside user session (adding new user to | 1006 // We are on sign-in screen inside user session (adding new user to |
| 1032 // the session or on lock screen), don't switch input methods in this case. | 1007 // the session or on lock screen), don't switch input methods in this case. |
| 1033 // TODO(dpolukhin): adding user and sign-in should be consistent | 1008 // TODO(dpolukhin): adding user and sign-in should be consistent |
| 1034 // crbug.com/292774 | 1009 // crbug.com/292774 |
| 1035 return; | 1010 return; |
| 1036 } | 1011 } |
| 1037 | 1012 |
| 1038 bool succeed = false; | 1013 chromeos::input_method::InputMethodManager* const manager = |
| 1014 chromeos::input_method::InputMethodManager::Get(); |
| 1039 | 1015 |
| 1040 const std::string input_method = GetUserLRUInputMethod(username); | 1016 const bool succeed = SetUserInputMethodImpl(username, manager); |
| 1041 | |
| 1042 if (!input_method.empty()) | |
| 1043 succeed = SetUserInputMethodImpl(username, input_method, ime_state); | |
| 1044 | 1017 |
| 1045 // This is also a case when LRU layout is set only for a few local users, | 1018 // This is also a case when LRU layout is set only for a few local users, |
| 1046 // thus others need to be switched to default locale. | 1019 // thus others need to be switched to default locale. |
| 1047 // Otherwise they will end up using another user's locale to log in. | 1020 // Otherwise they will end up using another user's locale to log in. |
| 1048 if (!succeed) { | 1021 if (!succeed) { |
| 1049 DVLOG(0) << "SetUserInputMethod('" << username | 1022 DVLOG(0) << "SetUserInputMethod('" << username |
| 1050 << "'): failed to set user layout. Switching to default."; | 1023 << "'): failed to set user layout. Switching to default."; |
| 1051 | 1024 |
| 1052 ime_state->SetInputMethodLoginDefault(); | 1025 manager->GetActiveIMEState()->SetInputMethodLoginDefault(); |
| 1053 } | 1026 } |
| 1054 } | 1027 } |
| 1055 | 1028 |
| 1056 | 1029 |
| 1057 void SigninScreenHandler::UserSettingsChanged() { | 1030 void SigninScreenHandler::UserSettingsChanged() { |
| 1058 DCHECK(gaia_screen_handler_); | 1031 DCHECK(gaia_screen_handler_); |
| 1059 GaiaContext context; | 1032 GaiaContext context; |
| 1060 if (delegate_) | 1033 if (delegate_) |
| 1061 context.has_users = !delegate_->GetUsers().empty(); | 1034 context.has_users = !delegate_->GetUsers().empty(); |
| 1062 gaia_screen_handler_->UpdateGaia(context); | 1035 gaia_screen_handler_->UpdateGaia(context); |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1345 | 1318 |
| 1346 void SigninScreenHandler::HandleShowLoadingTimeoutError() { | 1319 void SigninScreenHandler::HandleShowLoadingTimeoutError() { |
| 1347 UpdateState(ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT); | 1320 UpdateState(ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT); |
| 1348 } | 1321 } |
| 1349 | 1322 |
| 1350 void SigninScreenHandler::HandleUpdateOfflineLogin(bool offline_login_active) { | 1323 void SigninScreenHandler::HandleUpdateOfflineLogin(bool offline_login_active) { |
| 1351 offline_login_active_ = offline_login_active; | 1324 offline_login_active_ = offline_login_active; |
| 1352 } | 1325 } |
| 1353 | 1326 |
| 1354 void SigninScreenHandler::HandleFocusPod(const std::string& user_id) { | 1327 void SigninScreenHandler::HandleFocusPod(const std::string& user_id) { |
| 1355 SetUserInputMethod(user_id, ime_state_.get()); | 1328 SetUserInputMethod(user_id); |
| 1356 #if !defined(USE_ATHENA) | 1329 #if !defined(USE_ATHENA) |
| 1357 // TODO(dpolukhin): crbug.com/408734. | 1330 // TODO(dpolukhin): crbug.com/408734. |
| 1358 WallpaperManager::Get()->SetUserWallpaperDelayed(user_id); | 1331 WallpaperManager::Get()->SetUserWallpaperDelayed(user_id); |
| 1359 #endif | 1332 #endif |
| 1360 ScreenlockBridge::Get()->SetFocusedUser(user_id); | 1333 ScreenlockBridge::Get()->SetFocusedUser(user_id); |
| 1361 if (!test_focus_pod_callback_.is_null()) | |
| 1362 test_focus_pod_callback_.Run(); | |
| 1363 } | 1334 } |
| 1364 | 1335 |
| 1365 void SigninScreenHandler::HandleHardlockPod(const std::string& user_id) { | 1336 void SigninScreenHandler::HandleHardlockPod(const std::string& user_id) { |
| 1366 SetAuthType(user_id, | 1337 SetAuthType(user_id, |
| 1367 ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD, | 1338 ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD, |
| 1368 base::string16()); | 1339 base::string16()); |
| 1369 HideUserPodCustomIcon(user_id); | 1340 HideUserPodCustomIcon(user_id); |
| 1370 } | 1341 } |
| 1371 | 1342 |
| 1372 void SigninScreenHandler::HandleRetrieveAuthenticatedUserEmail( | 1343 void SigninScreenHandler::HandleRetrieveAuthenticatedUserEmail( |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1453 return true; | 1424 return true; |
| 1454 } | 1425 } |
| 1455 | 1426 |
| 1456 void SigninScreenHandler::CancelPasswordChangedFlowInternal() { | 1427 void SigninScreenHandler::CancelPasswordChangedFlowInternal() { |
| 1457 if (delegate_) { | 1428 if (delegate_) { |
| 1458 ShowImpl(); | 1429 ShowImpl(); |
| 1459 delegate_->CancelPasswordChangedFlow(); | 1430 delegate_->CancelPasswordChangedFlow(); |
| 1460 } | 1431 } |
| 1461 } | 1432 } |
| 1462 | 1433 |
| 1463 OobeUI* SigninScreenHandler::GetOobeUI() const { | |
| 1464 return static_cast<OobeUI*>(web_ui()->GetController()); | |
| 1465 } | |
| 1466 | |
| 1467 OobeUI::Screen SigninScreenHandler::GetCurrentScreen() const { | 1434 OobeUI::Screen SigninScreenHandler::GetCurrentScreen() const { |
| 1468 OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN; | 1435 OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN; |
| 1469 OobeUI* oobe_ui = GetOobeUI(); | 1436 OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController()); |
| 1470 if (oobe_ui) | 1437 if (oobe_ui) |
| 1471 screen = oobe_ui->current_screen(); | 1438 screen = oobe_ui->current_screen(); |
| 1472 return screen; | 1439 return screen; |
| 1473 } | 1440 } |
| 1474 | 1441 |
| 1475 bool SigninScreenHandler::IsGaiaVisible() const { | 1442 bool SigninScreenHandler::IsGaiaVisible() const { |
| 1476 return IsSigninScreen(GetCurrentScreen()) && | 1443 return IsSigninScreen(GetCurrentScreen()) && |
| 1477 ui_state_ == UI_STATE_GAIA_SIGNIN; | 1444 ui_state_ == UI_STATE_GAIA_SIGNIN; |
| 1478 } | 1445 } |
| 1479 | 1446 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1550 return gaia_screen_handler_->frame_error(); | 1517 return gaia_screen_handler_->frame_error(); |
| 1551 } | 1518 } |
| 1552 | 1519 |
| 1553 void SigninScreenHandler::OnCapsLockChanged(bool enabled) { | 1520 void SigninScreenHandler::OnCapsLockChanged(bool enabled) { |
| 1554 caps_lock_enabled_ = enabled; | 1521 caps_lock_enabled_ = enabled; |
| 1555 if (page_is_ready()) | 1522 if (page_is_ready()) |
| 1556 CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_); | 1523 CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_); |
| 1557 } | 1524 } |
| 1558 | 1525 |
| 1559 } // namespace chromeos | 1526 } // namespace chromeos |
| OLD | NEW |