diff options
author | antrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 17:47:46 +0000 |
---|---|---|
committer | antrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 17:47:46 +0000 |
commit | 55ec8b532bf7ee58b9ecf0fc45c029def3419d1d (patch) | |
tree | 874869d7743131c6a599490f528024a5ecdb8904 | |
parent | d1c80d681dd92c27e8add7736da726c824fad530 (diff) | |
download | chromium_src-55ec8b532bf7ee58b9ecf0fc45c029def3419d1d.zip chromium_src-55ec8b532bf7ee58b9ecf0fc45c029def3419d1d.tar.gz chromium_src-55ec8b532bf7ee58b9ecf0fc45c029def3419d1d.tar.bz2 |
Ensure that password/user pod is always in focus on resume.
BUG=162046
Review URL: https://chromiumcodereview.appspot.com/11640018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173943 0039d316-1c4b-4281-b951-d872f2087c98
5 files changed, 69 insertions, 2 deletions
diff --git a/chrome/browser/chromeos/login/webui_screen_locker.cc b/chrome/browser/chromeos/login/webui_screen_locker.cc index c3cb376..ad75b62 100644 --- a/chrome/browser/chromeos/login/webui_screen_locker.cc +++ b/chrome/browser/chromeos/login/webui_screen_locker.cc @@ -21,6 +21,9 @@ #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/url_constants.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/root_power_manager_client.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h" #include "content/public/browser/render_widget_host_view.h" @@ -28,6 +31,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/x/x11_util.h" #include "ui/gfx/screen.h" +#include "ui/views/controls/webview/webview.h" namespace { @@ -44,10 +48,12 @@ namespace chromeos { WebUIScreenLocker::WebUIScreenLocker(ScreenLocker* screen_locker) : ScreenLockerDelegate(screen_locker), lock_ready_(false), - webui_ready_(false) { + webui_ready_(false), + ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { set_should_emit_login_prompt_visible(false); if (ash::Shell::GetInstance()) ash::Shell::GetInstance()->session_state_controller()->AddObserver(this); + DBusThreadManager::Get()->GetRootPowerManagerClient()->AddObserver(this); } void WebUIScreenLocker::LockScreen(bool unlock_on_input) { @@ -124,7 +130,16 @@ content::WebUI* WebUIScreenLocker::GetAssociatedWebUI() { return GetWebUI(); } +void WebUIScreenLocker::FocusUserPod() { + if (!webui_ready_) + return; + webui_login_->RequestFocus(); + GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.forceLockedUserPodFocus"); +} + WebUIScreenLocker::~WebUIScreenLocker() { + DBusThreadManager::Get()->GetRootPowerManagerClient()->RemoveObserver(this); + if (ash::Shell::GetInstance()) ash::Shell::GetInstance()->session_state_controller()->RemoveObserver(this); // In case of shutdown, lock_window_ may be deleted before WebUIScreenLocker. @@ -263,4 +278,21 @@ void WebUIScreenLocker::OnWidgetClosing(views::Widget* widget) { lock_window_ = NULL; } +//////////////////////////////////////////////////////////////////////////////// +// RootPowerManagerObserver override. + +void WebUIScreenLocker::OnResume(const base::TimeDelta& sleep_duration) { + content::BrowserThread::PostTask( + content::BrowserThread::UI, + FROM_HERE, + base::Bind(&WebUIScreenLocker::FocusUserPod, weak_factory_.GetWeakPtr())); +} + +void WebUIScreenLocker::OnLidEvent(bool open, const base::TimeTicks& time) { + content::BrowserThread::PostTask( + content::BrowserThread::UI, + FROM_HERE, + base::Bind(&WebUIScreenLocker::FocusUserPod, weak_factory_.GetWeakPtr())); +} + } // namespace chromeos diff --git a/chrome/browser/chromeos/login/webui_screen_locker.h b/chrome/browser/chromeos/login/webui_screen_locker.h index 0d4085a..daa6d42 100644 --- a/chrome/browser/chromeos/login/webui_screen_locker.h +++ b/chrome/browser/chromeos/login/webui_screen_locker.h @@ -10,11 +10,13 @@ #include "ash/wm/session_state_observer.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/time.h" #include "chrome/browser/chromeos/login/lock_window.h" #include "chrome/browser/chromeos/login/login_display.h" #include "chrome/browser/chromeos/login/screen_locker_delegate.h" #include "chrome/browser/chromeos/login/webui_login_view.h" +#include "chromeos/dbus/root_power_manager_observer.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "ui/views/widget/widget.h" @@ -40,7 +42,8 @@ class WebUIScreenLocker : public WebUILoginView, public ScreenLockerDelegate, public LockWindow::Observer, public ash::SessionStateObserver, - public views::WidgetObserver { + public views::WidgetObserver, + public RootPowerManagerObserver { public: explicit WebUIScreenLocker(ScreenLocker* screen_locker); @@ -91,11 +94,18 @@ class WebUIScreenLocker : public WebUILoginView, // WidgetObserver override. virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE; + // RootPowerManagerObserver overrides: + virtual void OnResume(const base::TimeDelta& sleep_duration) OVERRIDE; + virtual void OnLidEvent(bool open, const base::TimeTicks& time) OVERRIDE; + private: friend class test::WebUIScreenLockerTester; virtual ~WebUIScreenLocker(); + // Ensures that user pod is focused. + void FocusUserPod(); + // The screen locker window. views::Widget* lock_window_; @@ -114,6 +124,8 @@ class WebUIScreenLocker : public WebUILoginView, // Time when lock was initiated, required for metrics. base::TimeTicks lock_time_; + base::WeakPtrFactory<WebUIScreenLocker> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(WebUIScreenLocker); }; diff --git a/chrome/browser/resources/chromeos/login/login.js b/chrome/browser/resources/chromeos/login/login.js index e83d190..e8fe76b 100644 --- a/chrome/browser/resources/chromeos/login/login.js +++ b/chrome/browser/resources/chromeos/login/login.js @@ -212,6 +212,13 @@ cr.define('cr.ui', function() { DisplayManager.setEnterpriseInfo(messageText); }; + /** + * Enforces focus on user pod of locked user. + */ + Oobe.forceLockedUserPodFocus = function() { + login.AccountPickerScreen.forceLockedUserPodFocus(); + }; + // Export return { Oobe: Oobe diff --git a/chrome/browser/resources/chromeos/login/oobe.js b/chrome/browser/resources/chromeos/login/oobe.js index 4e992f3..f70517c 100644 --- a/chrome/browser/resources/chromeos/login/oobe.js +++ b/chrome/browser/resources/chromeos/login/oobe.js @@ -455,6 +455,13 @@ cr.define('cr.ui', function() { DisplayManager.setEnterpriseInfo(messageText); }; + /** + * Enforces focus on user pod of locked user. + */ + Oobe.forceLockedUserPodFocus = function() { + login.AccountPickerScreen.forceLockedUserPodFocus(); + }; + // Export return { Oobe: Oobe diff --git a/chrome/browser/resources/chromeos/login/screen_account_picker.js b/chrome/browser/resources/chromeos/login/screen_account_picker.js index c34edbe..56035bc 100644 --- a/chrome/browser/resources/chromeos/login/screen_account_picker.js +++ b/chrome/browser/resources/chromeos/login/screen_account_picker.js @@ -175,6 +175,15 @@ cr.define('login', function() { }; /** + * Enforces focus on user pod of locked user. + */ + AccountPickerScreen.forceLockedUserPodFocus = function() { + var row = $('pod-row'); + if (row.lockedPod) + row.focusPod(row.lockedPod, true); + }; + + /** * Sets wallpaper for lock screen. */ AccountPickerScreen.setWallpaper = function() { |