summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorantrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 17:47:46 +0000
committerantrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 17:47:46 +0000
commit55ec8b532bf7ee58b9ecf0fc45c029def3419d1d (patch)
tree874869d7743131c6a599490f528024a5ecdb8904
parentd1c80d681dd92c27e8add7736da726c824fad530 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/chromeos/login/webui_screen_locker.cc34
-rw-r--r--chrome/browser/chromeos/login/webui_screen_locker.h14
-rw-r--r--chrome/browser/resources/chromeos/login/login.js7
-rw-r--r--chrome/browser/resources/chromeos/login/oobe.js7
-rw-r--r--chrome/browser/resources/chromeos/login/screen_account_picker.js9
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() {