| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/chromeos/login/lock/screen_locker.h" | 5 #include "chrome/browser/chromeos/login/lock/screen_locker.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "ash/ash_switches.h" | 10 #include "ash/ash_switches.h" |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 DCHECK(g_screen_lock_observer); | 358 DCHECK(g_screen_lock_observer); |
| 359 if (UserAddingScreen::Get()->IsRunning()) { | 359 if (UserAddingScreen::Get()->IsRunning()) { |
| 360 VLOG(1) << "Waiting for user adding screen to stop"; | 360 VLOG(1) << "Waiting for user adding screen to stop"; |
| 361 UserAddingScreen::Get()->AddObserver(g_screen_lock_observer); | 361 UserAddingScreen::Get()->AddObserver(g_screen_lock_observer); |
| 362 UserAddingScreen::Get()->Cancel(); | 362 UserAddingScreen::Get()->Cancel(); |
| 363 return; | 363 return; |
| 364 } | 364 } |
| 365 if (g_screen_lock_observer->session_started() && | 365 if (g_screen_lock_observer->session_started() && |
| 366 user_manager::UserManager::Get()->CanCurrentUserLock()) { | 366 user_manager::UserManager::Get()->CanCurrentUserLock()) { |
| 367 ScreenLocker::Show(); | 367 ScreenLocker::Show(); |
| 368 #if !defined(USE_ATHENA) |
| 369 // TOOD(dpolukhin): crbug.com/413926. |
| 368 ash::Shell::GetInstance()->lock_state_controller()->OnStartingLock(); | 370 ash::Shell::GetInstance()->lock_state_controller()->OnStartingLock(); |
| 371 #endif |
| 369 } else { | 372 } else { |
| 370 // If the current user's session cannot be locked or the user has not | 373 // If the current user's session cannot be locked or the user has not |
| 371 // completed all sign-in steps yet, log out instead. The latter is done to | 374 // completed all sign-in steps yet, log out instead. The latter is done to |
| 372 // avoid complications with displaying the lock screen over the login | 375 // avoid complications with displaying the lock screen over the login |
| 373 // screen while remaining secure in the case the user walks away during | 376 // screen while remaining secure in the case the user walks away during |
| 374 // the sign-in steps. See crbug.com/112225 and crbug.com/110933. | 377 // the sign-in steps. See crbug.com/112225 and crbug.com/110933. |
| 375 VLOG(1) << "Calling session manager's StopSession D-Bus method"; | 378 VLOG(1) << "Calling session manager's StopSession D-Bus method"; |
| 376 DBusThreadManager::Get()->GetSessionManagerClient()->StopSession(); | 379 DBusThreadManager::Get()->GetSessionManagerClient()->StopSession(); |
| 377 } | 380 } |
| 378 } | 381 } |
| 379 | 382 |
| 380 // static | 383 // static |
| 381 void ScreenLocker::Show() { | 384 void ScreenLocker::Show() { |
| 382 #if defined(USE_ATHENA) | |
| 383 // crbug.com/413926 | |
| 384 return; | |
| 385 #endif | |
| 386 | |
| 387 content::RecordAction(UserMetricsAction("ScreenLocker_Show")); | 385 content::RecordAction(UserMetricsAction("ScreenLocker_Show")); |
| 388 DCHECK(base::MessageLoopForUI::IsCurrent()); | 386 DCHECK(base::MessageLoopForUI::IsCurrent()); |
| 389 | 387 |
| 390 // Check whether the currently logged in user is a guest account and if so, | 388 // Check whether the currently logged in user is a guest account and if so, |
| 391 // refuse to lock the screen (crosbug.com/23764). | 389 // refuse to lock the screen (crosbug.com/23764). |
| 392 // For a demo user, we should never show the lock screen (crosbug.com/27647). | 390 // For a demo user, we should never show the lock screen (crosbug.com/27647). |
| 393 if (user_manager::UserManager::Get()->IsLoggedInAsGuest() || | 391 if (user_manager::UserManager::Get()->IsLoggedInAsGuest() || |
| 394 user_manager::UserManager::Get()->IsLoggedInAsDemoUser()) { | 392 user_manager::UserManager::Get()->IsLoggedInAsDemoUser()) { |
| 395 VLOG(1) << "Refusing to lock screen for guest/demo account"; | 393 VLOG(1) << "Refusing to lock screen for guest/demo account"; |
| 396 return; | 394 return; |
| 397 } | 395 } |
| 398 | 396 |
| 397 #if !defined(USE_ATHENA) |
| 399 // If the active window is fullscreen, exit fullscreen to avoid the web page | 398 // If the active window is fullscreen, exit fullscreen to avoid the web page |
| 400 // or app mimicking the lock screen. Do not exit fullscreen if the shelf is | 399 // or app mimicking the lock screen. Do not exit fullscreen if the shelf is |
| 401 // visible while in fullscreen because the shelf makes it harder for a web | 400 // visible while in fullscreen because the shelf makes it harder for a web |
| 402 // page or app to mimick the lock screen. | 401 // page or app to mimick the lock screen. |
| 403 ash::wm::WindowState* active_window_state = ash::wm::GetActiveWindowState(); | 402 ash::wm::WindowState* active_window_state = ash::wm::GetActiveWindowState(); |
| 404 if (active_window_state && | 403 if (active_window_state && |
| 405 active_window_state->IsFullscreen() && | 404 active_window_state->IsFullscreen() && |
| 406 active_window_state->hide_shelf_when_fullscreen()) { | 405 active_window_state->hide_shelf_when_fullscreen()) { |
| 407 const ash::wm::WMEvent event(ash::wm::WM_EVENT_TOGGLE_FULLSCREEN); | 406 const ash::wm::WMEvent event(ash::wm::WM_EVENT_TOGGLE_FULLSCREEN); |
| 408 active_window_state->OnWMEvent(&event); | 407 active_window_state->OnWMEvent(&event); |
| 409 } | 408 } |
| 409 #endif |
| 410 | 410 |
| 411 if (!screen_locker_) { | 411 if (!screen_locker_) { |
| 412 ScreenLocker* locker = | 412 ScreenLocker* locker = |
| 413 new ScreenLocker(user_manager::UserManager::Get()->GetUnlockUsers()); | 413 new ScreenLocker(user_manager::UserManager::Get()->GetUnlockUsers()); |
| 414 VLOG(1) << "Created ScreenLocker " << locker; | 414 VLOG(1) << "Created ScreenLocker " << locker; |
| 415 locker->Init(); | 415 locker->Init(); |
| 416 } else { | 416 } else { |
| 417 VLOG(1) << "ScreenLocker " << screen_locker_ << " already exists; " | 417 VLOG(1) << "ScreenLocker " << screen_locker_ << " already exists; " |
| 418 << " calling session manager's HandleLockScreenShown D-Bus method"; | 418 << " calling session manager's HandleLockScreenShown D-Bus method"; |
| 419 DBusThreadManager::Get()->GetSessionManagerClient()-> | 419 DBusThreadManager::Get()->GetSessionManagerClient()-> |
| 420 NotifyLockScreenShown(); | 420 NotifyLockScreenShown(); |
| 421 } | 421 } |
| 422 } | 422 } |
| 423 | 423 |
| 424 // static | 424 // static |
| 425 void ScreenLocker::Hide() { | 425 void ScreenLocker::Hide() { |
| 426 #if defined(USE_ATHENA) | |
| 427 // crbug.com/413926 | |
| 428 return; | |
| 429 #endif | |
| 430 | |
| 431 DCHECK(base::MessageLoopForUI::IsCurrent()); | 426 DCHECK(base::MessageLoopForUI::IsCurrent()); |
| 432 // For a guest/demo user, screen_locker_ would have never been initialized. | 427 // For a guest/demo user, screen_locker_ would have never been initialized. |
| 433 if (user_manager::UserManager::Get()->IsLoggedInAsGuest() || | 428 if (user_manager::UserManager::Get()->IsLoggedInAsGuest() || |
| 434 user_manager::UserManager::Get()->IsLoggedInAsDemoUser()) { | 429 user_manager::UserManager::Get()->IsLoggedInAsDemoUser()) { |
| 435 VLOG(1) << "Refusing to hide lock screen for guest/demo account"; | 430 VLOG(1) << "Refusing to hide lock screen for guest/demo account"; |
| 436 return; | 431 return; |
| 437 } | 432 } |
| 438 | 433 |
| 439 DCHECK(screen_locker_); | 434 DCHECK(screen_locker_); |
| 440 base::Callback<void(void)> callback = | 435 base::Callback<void(void)> callback = |
| 441 base::Bind(&ScreenLocker::ScheduleDeletion); | 436 base::Bind(&ScreenLocker::ScheduleDeletion); |
| 437 #if !defined(USE_ATHENA) |
| 442 ash::Shell::GetInstance()->lock_state_controller()-> | 438 ash::Shell::GetInstance()->lock_state_controller()-> |
| 443 OnLockScreenHide(callback); | 439 OnLockScreenHide(callback); |
| 440 #else |
| 441 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback); |
| 442 #endif |
| 444 } | 443 } |
| 445 | 444 |
| 446 void ScreenLocker::ScheduleDeletion() { | 445 void ScreenLocker::ScheduleDeletion() { |
| 447 // Avoid possible multiple calls. | 446 // Avoid possible multiple calls. |
| 448 if (screen_locker_ == NULL) | 447 if (screen_locker_ == NULL) |
| 449 return; | 448 return; |
| 450 VLOG(1) << "Deleting ScreenLocker " << screen_locker_; | 449 VLOG(1) << "Deleting ScreenLocker " << screen_locker_; |
| 451 | 450 |
| 451 #if !defined(USE_ATHENA) |
| 452 ash::PlaySystemSoundIfSpokenFeedback(SOUND_UNLOCK); | 452 ash::PlaySystemSoundIfSpokenFeedback(SOUND_UNLOCK); |
| 453 #endif |
| 453 | 454 |
| 454 delete screen_locker_; | 455 delete screen_locker_; |
| 455 screen_locker_ = NULL; | 456 screen_locker_ = NULL; |
| 456 } | 457 } |
| 457 | 458 |
| 458 //////////////////////////////////////////////////////////////////////////////// | 459 //////////////////////////////////////////////////////////////////////////////// |
| 459 // ScreenLocker, private: | 460 // ScreenLocker, private: |
| 460 | 461 |
| 461 ScreenLocker::~ScreenLocker() { | 462 ScreenLocker::~ScreenLocker() { |
| 462 VLOG(1) << "Destroying ScreenLocker " << this; | 463 VLOG(1) << "Destroying ScreenLocker " << this; |
| 463 DCHECK(base::MessageLoopForUI::IsCurrent()); | 464 DCHECK(base::MessageLoopForUI::IsCurrent()); |
| 464 | 465 |
| 465 if (authenticator_.get()) | 466 if (authenticator_.get()) |
| 466 authenticator_->SetConsumer(NULL); | 467 authenticator_->SetConsumer(NULL); |
| 467 ClearErrors(); | 468 ClearErrors(); |
| 468 | 469 |
| 470 #if !defined(USE_ATHENA) |
| 471 // TOOD(dpolukhin): we need to to something similar for Athena. |
| 469 VLOG(1) << "Moving desktop background to unlocked container"; | 472 VLOG(1) << "Moving desktop background to unlocked container"; |
| 470 ash::Shell::GetInstance()-> | 473 ash::Shell::GetInstance()-> |
| 471 desktop_background_controller()->MoveDesktopToUnlockedContainer(); | 474 desktop_background_controller()->MoveDesktopToUnlockedContainer(); |
| 475 #endif |
| 472 | 476 |
| 473 screen_locker_ = NULL; | 477 screen_locker_ = NULL; |
| 474 bool state = false; | 478 bool state = false; |
| 475 VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; | 479 VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; |
| 476 content::NotificationService::current()->Notify( | 480 content::NotificationService::current()->Notify( |
| 477 chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, | 481 chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, |
| 478 content::Source<ScreenLocker>(this), | 482 content::Source<ScreenLocker>(this), |
| 479 content::Details<bool>(&state)); | 483 content::Details<bool>(&state)); |
| 480 | 484 |
| 481 VLOG(1) << "Calling session manager's HandleLockScreenDismissed D-Bus method"; | 485 VLOG(1) << "Calling session manager's HandleLockScreenDismissed D-Bus method"; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 492 } | 496 } |
| 493 | 497 |
| 494 void ScreenLocker::ScreenLockReady() { | 498 void ScreenLocker::ScreenLockReady() { |
| 495 locked_ = true; | 499 locked_ = true; |
| 496 base::TimeDelta delta = base::Time::Now() - start_time_; | 500 base::TimeDelta delta = base::Time::Now() - start_time_; |
| 497 VLOG(1) << "ScreenLocker " << this << " is ready after " | 501 VLOG(1) << "ScreenLocker " << this << " is ready after " |
| 498 << delta.InSecondsF() << " second(s)"; | 502 << delta.InSecondsF() << " second(s)"; |
| 499 UMA_HISTOGRAM_TIMES("ScreenLocker.ScreenLockTime", delta); | 503 UMA_HISTOGRAM_TIMES("ScreenLocker.ScreenLockTime", delta); |
| 500 | 504 |
| 501 VLOG(1) << "Moving desktop background to locked container"; | 505 VLOG(1) << "Moving desktop background to locked container"; |
| 506 #if !defined(USE_ATHENA) |
| 502 ash::Shell::GetInstance()-> | 507 ash::Shell::GetInstance()-> |
| 503 desktop_background_controller()->MoveDesktopToLockedContainer(); | 508 desktop_background_controller()->MoveDesktopToLockedContainer(); |
| 509 #endif |
| 504 | 510 |
| 505 input_method::InputMethodManager::Get() | 511 input_method::InputMethodManager::Get() |
| 506 ->GetActiveIMEState() | 512 ->GetActiveIMEState() |
| 507 ->EnableLockScreenLayouts(); | 513 ->EnableLockScreenLayouts(); |
| 508 | 514 |
| 509 bool state = true; | 515 bool state = true; |
| 510 VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; | 516 VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; |
| 511 content::NotificationService::current()->Notify( | 517 content::NotificationService::current()->Notify( |
| 512 chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, | 518 chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, |
| 513 content::Source<ScreenLocker>(this), | 519 content::Source<ScreenLocker>(this), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 524 for (user_manager::UserList::const_iterator it = users_.begin(); | 530 for (user_manager::UserList::const_iterator it = users_.begin(); |
| 525 it != users_.end(); | 531 it != users_.end(); |
| 526 ++it) { | 532 ++it) { |
| 527 if ((*it)->email() == username) | 533 if ((*it)->email() == username) |
| 528 return true; | 534 return true; |
| 529 } | 535 } |
| 530 return false; | 536 return false; |
| 531 } | 537 } |
| 532 | 538 |
| 533 } // namespace chromeos | 539 } // namespace chromeos |
| OLD | NEW |