Index: chrome/browser/chromeos/login/lock/screen_locker.cc |
diff --git a/chrome/browser/chromeos/login/lock/screen_locker.cc b/chrome/browser/chromeos/login/lock/screen_locker.cc |
index b7011cc4d7fc05e53791230eca409da004e8f33d..d167f52a711511673065813fe8166b93a99c9658 100644 |
--- a/chrome/browser/chromeos/login/lock/screen_locker.cc |
+++ b/chrome/browser/chromeos/login/lock/screen_locker.cc |
@@ -473,12 +473,23 @@ void ScreenLocker::Hide() { |
} |
DCHECK(screen_locker_); |
- base::Callback<void(void)> callback = |
- base::Bind(&ScreenLocker::ScheduleDeletion); |
- ash::Shell::GetInstance()->lock_state_controller()-> |
- OnLockScreenHide(callback); |
+ |
+ // Sets session state to ACTIVE before destroying screen locker. Otherwise, |
+ // ash thinks the session is blocked and does not correct set focus on |
+ // screen lock dismissal. |
+ // TODO(xiyuan): Figure out a better way to ensure state change go through. |
+ session_manager::SessionManager::Get()->SetSessionState( |
+ session_manager::SessionState::ACTIVE); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, base::Bind([] { |
+ base::Callback<void(void)> callback = |
+ base::Bind(&ScreenLocker::ScheduleDeletion); |
+ ash::Shell::GetInstance()->lock_state_controller()->OnLockScreenHide( |
+ callback); |
+ })); |
} |
+// static |
void ScreenLocker::ScheduleDeletion() { |
// Avoid possible multiple calls. |
if (screen_locker_ == NULL) |
@@ -518,9 +529,6 @@ ScreenLocker::~ScreenLocker() { |
DBusThreadManager::Get()->GetSessionManagerClient()-> |
NotifyLockScreenDismissed(); |
- session_manager::SessionManager::Get()->SetSessionState( |
- session_manager::SessionState::ACTIVE); |
- |
if (saved_ime_state_.get()) { |
input_method::InputMethodManager::Get()->SetState(saved_ime_state_); |
} |