summaryrefslogtreecommitdiffstats
path: root/ash/wm/system_modal_container_layout_manager_unittest.cc
diff options
context:
space:
mode:
authorflackr@chromium.org <flackr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-27 21:58:00 +0000
committerflackr@chromium.org <flackr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-27 21:58:00 +0000
commitacc38027acf92220412f07699e12774f71f9c445 (patch)
tree8c75214e0164ec70357635e8e090cda8970856e0 /ash/wm/system_modal_container_layout_manager_unittest.cc
parent26024774201acfcee1be949aaf56af17f0f19c12 (diff)
downloadchromium_src-acc38027acf92220412f07699e12774f71f9c445.zip
chromium_src-acc38027acf92220412f07699e12774f71f9c445.tar.gz
chromium_src-acc38027acf92220412f07699e12774f71f9c445.tar.bz2
Do not allow system modal dialogs below the lock layer to steal focus.
BUG=110920 TEST=Open a system modal dialog, lock the screen, and verify that you can now unlock the screen. Review URL: https://chromiumcodereview.appspot.com/9271062 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119499 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/wm/system_modal_container_layout_manager_unittest.cc')
-rw-r--r--ash/wm/system_modal_container_layout_manager_unittest.cc69
1 files changed, 69 insertions, 0 deletions
diff --git a/ash/wm/system_modal_container_layout_manager_unittest.cc b/ash/wm/system_modal_container_layout_manager_unittest.cc
index db1fbc5..04198ea 100644
--- a/ash/wm/system_modal_container_layout_manager_unittest.cc
+++ b/ash/wm/system_modal_container_layout_manager_unittest.cc
@@ -12,6 +12,7 @@
#include "ui/aura/root_window.h"
#include "ui/aura/test/event_generator.h"
#include "ui/aura/window.h"
+#include "ui/views/events/event.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
@@ -62,6 +63,32 @@ class TestWindow : public views::WidgetDelegateView {
DISALLOW_COPY_AND_ASSIGN(TestWindow);
};
+class EventTestWindow : public TestWindow {
+ public:
+ explicit EventTestWindow(bool modal) : TestWindow(modal),
+ mouse_presses_(0) {}
+ virtual ~EventTestWindow() {}
+
+ aura::Window* OpenTestWindow(aura::Window* parent) {
+ views::Widget* widget =
+ views::Widget::CreateWindowWithParent(this, parent);
+ widget->Show();
+ return widget->GetNativeView();
+ }
+
+ // Overridden from views::View:
+ virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE {
+ mouse_presses_++;
+ return false;
+ }
+
+ int mouse_presses() const { return mouse_presses_; }
+ private:
+ int mouse_presses_;
+
+ DISALLOW_COPY_AND_ASSIGN(EventTestWindow);
+};
+
class TransientWindowObserver : public aura::WindowObserver {
public:
TransientWindowObserver() : destroyed_(false) {}
@@ -173,5 +200,47 @@ TEST_F(SystemModalContainerLayoutManagerTest,
EXPECT_TRUE(IsActiveWindow(unrelated.get()));
}
+TEST_F(SystemModalContainerLayoutManagerTest,
+ EventFocusContainers) {
+ // Create a normal window and attempt to receive a click event.
+ EventTestWindow* main_delegate = new EventTestWindow(false);
+ scoped_ptr<aura::Window> main(main_delegate->OpenTestWindow(NULL));
+ EXPECT_TRUE(IsActiveWindow(main.get()));
+ aura::test::EventGenerator e1(main.get());
+ e1.ClickLeftButton();
+ EXPECT_EQ(1, main_delegate->mouse_presses());
+
+ // Create a modal window for the main window and verify that the main window
+ // no longer receives mouse events.
+ EventTestWindow* transient_delegate = new EventTestWindow(true);
+ aura::Window* transient = transient_delegate->OpenTestWindow(main.get());
+ EXPECT_TRUE(IsActiveWindow(transient));
+ e1.ClickLeftButton();
+ EXPECT_EQ(1, transient_delegate->mouse_presses());
+
+ // Create a window in the lock screen container and ensure that it receives
+ // the mouse event instead of the modal window (crbug.com/110920).
+ EventTestWindow* lock_delegate = new EventTestWindow(false);
+ scoped_ptr<aura::Window> lock(lock_delegate->OpenTestWindow(
+ Shell::GetInstance()->GetContainer(
+ ash::internal::kShellWindowId_LockScreenContainer)));
+ EXPECT_TRUE(IsActiveWindow(lock.get()));
+ e1.ClickLeftButton();
+ EXPECT_EQ(1, lock_delegate->mouse_presses());
+
+ // Make sure that a modal container created by the lock screen can still
+ // receive mouse events.
+ EventTestWindow* lock_modal_delegate = new EventTestWindow(true);
+ aura::Window* lock_modal = lock_modal_delegate->OpenTestWindow(lock.get());
+ EXPECT_TRUE(IsActiveWindow(lock_modal));
+ e1.ClickLeftButton();
+ EXPECT_EQ(1, main_delegate->mouse_presses());
+
+ // Verify that none of the other containers received any more mouse presses.
+ EXPECT_EQ(1, transient_delegate->mouse_presses());
+ EXPECT_EQ(1, lock_delegate->mouse_presses());
+ EXPECT_EQ(1, lock_modal_delegate->mouse_presses());
+}
+
} // namespace test
} // namespace ash