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

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

Issue 2652793003: Add login screen locale and input method device policies (Closed)
Patch Set: Addressed comments. Created 3 years, 10 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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <vector> 10 #include <vector>
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username 224 DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username
225 << "'): user input method '" << user_input_method 225 << "'): user input method '" << user_input_method
226 << "' is not enabled and enabling failed (ignored!)."; 226 << "' is not enabled and enabling failed (ignored!).";
227 } 227 }
228 } 228 }
229 ime_state->ChangeInputMethod(user_input_method, false /* show_message */); 229 ime_state->ChangeInputMethod(user_input_method, false /* show_message */);
230 230
231 return true; 231 return true;
232 } 232 }
233 233
234 void EnforcePolicyInputMethods(std::string user_input_method) {
235 chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get();
236 const base::ListValue* login_screen_input_methods = nullptr;
237 if (!cros_settings->GetList(chromeos::kDeviceLoginScreenInputMethods,
238 &login_screen_input_methods))
239 return;
240
241 std::vector<std::string> allowed_input_methods;
242
243 // Add user's input method first so it is pre-selected.
244 if (!user_input_method.empty()) {
245 allowed_input_methods.push_back(user_input_method);
246 }
247
248 std::string input_method;
249 for (const auto& input_method_entry : *login_screen_input_methods) {
250 if (input_method_entry->GetAsString(&input_method)) {
251 allowed_input_methods.push_back(input_method);
252 }
253 }
254 chromeos::input_method::InputMethodManager* imm =
255 chromeos::input_method::InputMethodManager::Get();
256 imm->GetActiveIMEState()->SetAllowedKeyboardLayoutInputMethods(
257 allowed_input_methods);
258 }
259
260 void StopEnforcingPolicyInputMethods() {
261 // Empty means all input methods are allowed
262 std::vector<std::string> allowed_input_methods;
263 chromeos::input_method::InputMethodManager* imm =
264 chromeos::input_method::InputMethodManager::Get();
265 imm->GetActiveIMEState()->SetAllowedKeyboardLayoutInputMethods(
266 allowed_input_methods);
267 }
268
234 } // namespace 269 } // namespace
235 270
236 // LoginScreenContext implementation ------------------------------------------ 271 // LoginScreenContext implementation ------------------------------------------
237 272
238 LoginScreenContext::LoginScreenContext() { 273 LoginScreenContext::LoginScreenContext() {
239 Init(); 274 Init();
240 } 275 }
241 276
242 LoginScreenContext::LoginScreenContext(const base::ListValue* args) { 277 LoginScreenContext::LoginScreenContext(const base::ListValue* args) {
243 Init(); 278 Init();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 chrome::NOTIFICATION_AUTH_CANCELLED, 322 chrome::NOTIFICATION_AUTH_CANCELLED,
288 content::NotificationService::AllSources()); 323 content::NotificationService::AllSources());
289 324
290 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver( 325 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
291 this); 326 this);
292 327
293 chromeos::input_method::ImeKeyboard* keyboard = 328 chromeos::input_method::ImeKeyboard* keyboard =
294 chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard(); 329 chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard();
295 if (keyboard) 330 if (keyboard)
296 keyboard->AddObserver(this); 331 keyboard->AddObserver(this);
332 OnAllowedInputMethodsChanged();
333 allowed_input_methods_subscription_ =
334 chromeos::CrosSettings::Get()->AddSettingsObserver(
335 chromeos::kDeviceLoginScreenInputMethods,
336 base::Bind(&SigninScreenHandler::OnAllowedInputMethodsChanged,
337 base::Unretained(this)));
297 338
298 content::ServiceManagerConnection::GetForProcess() 339 content::ServiceManagerConnection::GetForProcess()
299 ->GetConnector() 340 ->GetConnector()
300 ->BindInterface(ash_util::GetAshServiceName(), &touch_view_manager_ptr_); 341 ->BindInterface(ash_util::GetAshServiceName(), &touch_view_manager_ptr_);
301 touch_view_manager_ptr_->AddObserver( 342 touch_view_manager_ptr_->AddObserver(
302 touch_view_binding_.CreateInterfacePtrAndBind()); 343 touch_view_binding_.CreateInterfacePtrAndBind());
303 } 344 }
304 345
305 SigninScreenHandler::~SigninScreenHandler() { 346 SigninScreenHandler::~SigninScreenHandler() {
306 OobeUI* oobe_ui = GetOobeUI(); 347 OobeUI* oobe_ui = GetOobeUI();
307 if (oobe_ui && oobe_ui_observer_added_) 348 if (oobe_ui && oobe_ui_observer_added_)
308 oobe_ui->RemoveObserver(this); 349 oobe_ui->RemoveObserver(this);
309 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver( 350 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(
310 this); 351 this);
311 chromeos::input_method::ImeKeyboard* keyboard = 352 chromeos::input_method::ImeKeyboard* keyboard =
312 chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard(); 353 chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard();
313 if (keyboard) 354 if (keyboard)
314 keyboard->RemoveObserver(this); 355 keyboard->RemoveObserver(this);
356 StopEnforcingPolicyInputMethods();
315 weak_factory_.InvalidateWeakPtrs(); 357 weak_factory_.InvalidateWeakPtrs();
316 if (delegate_) 358 if (delegate_)
317 delegate_->SetWebUIHandler(nullptr); 359 delegate_->SetWebUIHandler(nullptr);
318 network_state_informer_->RemoveObserver(this); 360 network_state_informer_->RemoveObserver(this);
319 proximity_auth::ScreenlockBridge::Get()->SetLockHandler(nullptr); 361 proximity_auth::ScreenlockBridge::Get()->SetLockHandler(nullptr);
320 proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(EmptyAccountId()); 362 proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(EmptyAccountId());
321 } 363 }
322 364
323 // static 365 // static
324 std::string SigninScreenHandler::GetUserLRUInputMethod( 366 std::string SigninScreenHandler::GetUserLRUInputMethod(
(...skipping 22 matching lines...) Expand all
347 389
348 // static 390 // static
349 // Update keyboard layout to least recently used by the user. 391 // Update keyboard layout to least recently used by the user.
350 void SigninScreenHandler::SetUserInputMethod( 392 void SigninScreenHandler::SetUserInputMethod(
351 const std::string& username, 393 const std::string& username,
352 input_method::InputMethodManager::State* ime_state) { 394 input_method::InputMethodManager::State* ime_state) {
353 bool succeed = false; 395 bool succeed = false;
354 396
355 const std::string input_method = GetUserLRUInputMethod(username); 397 const std::string input_method = GetUserLRUInputMethod(username);
356 398
399 EnforcePolicyInputMethods(input_method);
400
357 if (!input_method.empty()) 401 if (!input_method.empty())
358 succeed = SetUserInputMethodImpl(username, input_method, ime_state); 402 succeed = SetUserInputMethodImpl(username, input_method, ime_state);
359 403
360 // This is also a case when LRU layout is set only for a few local users, 404 // This is also a case when LRU layout is set only for a few local users,
361 // thus others need to be switched to default locale. 405 // thus others need to be switched to default locale.
362 // Otherwise they will end up using another user's locale to log in. 406 // Otherwise they will end up using another user's locale to log in.
363 if (!succeed) { 407 if (!succeed) {
364 DVLOG(0) << "SetUserInputMethod('" << username 408 DVLOG(0) << "SetUserInputMethod('" << username
365 << "'): failed to set user layout. Switching to default."; 409 << "'): failed to set user layout. Switching to default.";
366 410
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 AddCallback("cancelUserAdding", &SigninScreenHandler::HandleCancelUserAdding); 605 AddCallback("cancelUserAdding", &SigninScreenHandler::HandleCancelUserAdding);
562 AddCallback("migrateUserData", &SigninScreenHandler::HandleMigrateUserData); 606 AddCallback("migrateUserData", &SigninScreenHandler::HandleMigrateUserData);
563 AddCallback("resyncUserData", &SigninScreenHandler::HandleResyncUserData); 607 AddCallback("resyncUserData", &SigninScreenHandler::HandleResyncUserData);
564 AddCallback("loginUIStateChanged", 608 AddCallback("loginUIStateChanged",
565 &SigninScreenHandler::HandleLoginUIStateChanged); 609 &SigninScreenHandler::HandleLoginUIStateChanged);
566 AddCallback("unlockOnLoginSuccess", 610 AddCallback("unlockOnLoginSuccess",
567 &SigninScreenHandler::HandleUnlockOnLoginSuccess); 611 &SigninScreenHandler::HandleUnlockOnLoginSuccess);
568 AddCallback("showLoadingTimeoutError", 612 AddCallback("showLoadingTimeoutError",
569 &SigninScreenHandler::HandleShowLoadingTimeoutError); 613 &SigninScreenHandler::HandleShowLoadingTimeoutError);
570 AddCallback("focusPod", &SigninScreenHandler::HandleFocusPod); 614 AddCallback("focusPod", &SigninScreenHandler::HandleFocusPod);
615 AddCallback("noPodFocused", &SigninScreenHandler::HandleNoPodFocused);
571 AddCallback("getPublicSessionKeyboardLayouts", 616 AddCallback("getPublicSessionKeyboardLayouts",
572 &SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts); 617 &SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts);
573 AddCallback("getTouchViewState", 618 AddCallback("getTouchViewState",
574 &SigninScreenHandler::HandleGetTouchViewState); 619 &SigninScreenHandler::HandleGetTouchViewState);
575 AddCallback("logRemoveUserWarningShown", 620 AddCallback("logRemoveUserWarningShown",
576 &SigninScreenHandler::HandleLogRemoveUserWarningShown); 621 &SigninScreenHandler::HandleLogRemoveUserWarningShown);
577 AddCallback("firstIncorrectPasswordAttempt", 622 AddCallback("firstIncorrectPasswordAttempt",
578 &SigninScreenHandler::HandleFirstIncorrectPasswordAttempt); 623 &SigninScreenHandler::HandleFirstIncorrectPasswordAttempt);
579 AddCallback("maxIncorrectPasswordAttempts", 624 AddCallback("maxIncorrectPasswordAttempts",
580 &SigninScreenHandler::HandleMaxIncorrectPasswordAttempts); 625 &SigninScreenHandler::HandleMaxIncorrectPasswordAttempts);
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 UpdateState(NetworkError::ERROR_REASON_LOADING_TIMEOUT); 1425 UpdateState(NetworkError::ERROR_REASON_LOADING_TIMEOUT);
1381 } 1426 }
1382 1427
1383 void SigninScreenHandler::HandleFocusPod(const AccountId& account_id) { 1428 void SigninScreenHandler::HandleFocusPod(const AccountId& account_id) {
1384 proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(account_id); 1429 proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(account_id);
1385 if (delegate_) 1430 if (delegate_)
1386 delegate_->CheckUserStatus(account_id); 1431 delegate_->CheckUserStatus(account_id);
1387 if (!test_focus_pod_callback_.is_null()) 1432 if (!test_focus_pod_callback_.is_null())
1388 test_focus_pod_callback_.Run(); 1433 test_focus_pod_callback_.Run();
1389 1434
1435 focused_pod_account_id_ = base::MakeUnique<AccountId>(account_id);
1436
1390 const user_manager::User* user = 1437 const user_manager::User* user =
1391 user_manager::UserManager::Get()->FindUser(account_id); 1438 user_manager::UserManager::Get()->FindUser(account_id);
1392 // |user| may be nullptr in kiosk mode or unit tests. 1439 // |user| may be nullptr in kiosk mode or unit tests.
1393 if (user && user->is_logged_in() && !user->is_active()) { 1440 if (user && user->is_logged_in() && !user->is_active()) {
1394 ash::WmShell::Get()->GetSessionStateDelegate()->SwitchActiveUser( 1441 ash::WmShell::Get()->GetSessionStateDelegate()->SwitchActiveUser(
1395 account_id); 1442 account_id);
1396 } else { 1443 } else {
1397 SetUserInputMethod(account_id.GetUserEmail(), ime_state_.get()); 1444 SetUserInputMethod(account_id.GetUserEmail(), ime_state_.get());
1398 WallpaperManager::Get()->SetUserWallpaperDelayed(account_id); 1445 WallpaperManager::Get()->SetUserWallpaperDelayed(account_id);
1399 1446
1400 bool use_24hour_clock = false; 1447 bool use_24hour_clock = false;
1401 if (user_manager::known_user::GetBooleanPref( 1448 if (user_manager::known_user::GetBooleanPref(
1402 account_id, prefs::kUse24HourClock, &use_24hour_clock)) { 1449 account_id, prefs::kUse24HourClock, &use_24hour_clock)) {
1403 g_browser_process->platform_part() 1450 g_browser_process->platform_part()
1404 ->GetSystemClock() 1451 ->GetSystemClock()
1405 ->SetLastFocusedPodHourClockType( 1452 ->SetLastFocusedPodHourClockType(
1406 use_24hour_clock ? base::k24HourClock : base::k12HourClock); 1453 use_24hour_clock ? base::k24HourClock : base::k12HourClock);
1407 } 1454 }
1408 } 1455 }
1409 } 1456 }
1410 1457
1458 void SigninScreenHandler::HandleNoPodFocused() {
1459 focused_pod_account_id_.reset();
1460 EnforcePolicyInputMethods(std::string());
1461 }
1462
1411 void SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts( 1463 void SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts(
1412 const AccountId& account_id, 1464 const AccountId& account_id,
1413 const std::string& locale) { 1465 const std::string& locale) {
1414 GetKeyboardLayoutsForLocale( 1466 GetKeyboardLayoutsForLocale(
1415 base::Bind(&SigninScreenHandler::SendPublicSessionKeyboardLayouts, 1467 base::Bind(&SigninScreenHandler::SendPublicSessionKeyboardLayouts,
1416 weak_factory_.GetWeakPtr(), account_id, locale), 1468 weak_factory_.GetWeakPtr(), account_id, locale),
1417 locale); 1469 locale);
1418 } 1470 }
1419 1471
1420 void SigninScreenHandler::SendPublicSessionKeyboardLayouts( 1472 void SigninScreenHandler::SendPublicSessionKeyboardLayouts(
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_); 1600 CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_);
1549 } 1601 }
1550 1602
1551 void SigninScreenHandler::OnFeedbackFinished() { 1603 void SigninScreenHandler::OnFeedbackFinished() {
1552 CallJS("login.UnrecoverableCryptohomeErrorScreen.resumeAfterFeedbackUI"); 1604 CallJS("login.UnrecoverableCryptohomeErrorScreen.resumeAfterFeedbackUI");
1553 1605
1554 // Recreate user's cryptohome after the feedback is attempted. 1606 // Recreate user's cryptohome after the feedback is attempted.
1555 HandleResyncUserData(); 1607 HandleResyncUserData();
1556 } 1608 }
1557 1609
1610 void SigninScreenHandler::OnAllowedInputMethodsChanged() {
1611 if (focused_pod_account_id_) {
1612 std::string user_input_method =
1613 GetUserLRUInputMethod(focused_pod_account_id_->GetUserEmail());
1614 EnforcePolicyInputMethods(user_input_method);
1615 } else {
1616 EnforcePolicyInputMethods(std::string());
1617 }
1618 }
1619
1558 } // namespace chromeos 1620 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698