Index: components/mus/ws/event_dispatcher_unittest.cc |
diff --git a/components/mus/ws/event_dispatcher_unittest.cc b/components/mus/ws/event_dispatcher_unittest.cc |
index ae4f4179c7ff492d9ec6c58e53d0c8e35d987d1a..b58e0d02ae02a0eac0cee88e8d53d8c5c1ca1c4c 100644 |
--- a/components/mus/ws/event_dispatcher_unittest.cc |
+++ b/components/mus/ws/event_dispatcher_unittest.cc |
@@ -197,7 +197,7 @@ class EventDispatcherTest : public testing::Test { |
// Creates a window which is a child of |root_window_|. |
scoped_ptr<ServerWindow> CreateChildWindow(const WindowId& id); |
bool IsMouseButtonDown() const; |
- bool IsWindowPointerTarget(ServerWindow* window) const; |
+ bool IsWindowPointerTarget(const ServerWindow* window) const; |
int NumberPointerTargetsForWindow(ServerWindow* window) const; |
protected: |
@@ -243,9 +243,10 @@ bool EventDispatcherTest::IsMouseButtonDown() const { |
return EventDispatcherTestApi(event_dispatcher_.get()).is_mouse_button_down(); |
} |
-bool EventDispatcherTest::IsWindowPointerTarget(ServerWindow* window) const { |
+bool EventDispatcherTest::IsWindowPointerTarget( |
+ const ServerWindow* window) const { |
return EventDispatcherTestApi(event_dispatcher_.get()) |
- .IsObservingWindow(window); |
+ .IsWindowPointerTarget(window); |
} |
int EventDispatcherTest::NumberPointerTargetsForWindow( |
@@ -1300,6 +1301,62 @@ TEST_F(EventDispatcherTest, ModalWindowEventOnDescendantOfModalParent) { |
EXPECT_EQ(gfx::Point(-25, 15), dispatched_event->location()); |
} |
+// Tests that events on a system modal window target the modal window itself. |
+TEST_F(EventDispatcherTest, ModalWindowEventOnSystemModal) { |
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); |
+ |
+ root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); |
+ w1->SetBounds(gfx::Rect(10, 10, 30, 30)); |
+ w1->SetModal(); |
+ |
+ // Send event that is over |w1|. |
+ const ui::PointerEvent mouse_pressed(ui::MouseEvent( |
+ ui::ET_MOUSE_PRESSED, gfx::Point(15, 15), gfx::Point(15, 15), |
+ base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON)); |
+ event_dispatcher()->ProcessEvent(mouse_pressed); |
+ |
+ scoped_ptr<DispatchedEventDetails> details = |
+ test_event_dispatcher_delegate()->GetAndAdvanceDispatchedEventDetails(); |
+ ASSERT_TRUE(details); |
+ EXPECT_EQ(w1.get(), details->window); |
+ EXPECT_FALSE(details->in_nonclient_area); |
+ |
+ ASSERT_TRUE(details->event); |
+ ASSERT_TRUE(details->event->IsPointerEvent()); |
+ |
+ ui::PointerEvent* dispatched_event = details->event->AsPointerEvent(); |
+ EXPECT_EQ(gfx::Point(15, 15), dispatched_event->root_location()); |
+ EXPECT_EQ(gfx::Point(5, 5), dispatched_event->location()); |
+} |
+ |
+// Tests that events outside of system modal window target the modal window. |
+TEST_F(EventDispatcherTest, ModalWindowEventOutsideSystemModal) { |
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); |
+ |
+ root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); |
+ w1->SetBounds(gfx::Rect(10, 10, 30, 30)); |
+ w1->SetModal(); |
+ event_dispatcher()->SetSystemModalWindow(w1.get()); |
+ |
+ // Send event that is over |w1|. |
+ const ui::PointerEvent mouse_pressed(ui::MouseEvent( |
+ ui::ET_MOUSE_PRESSED, gfx::Point(45, 15), gfx::Point(45, 15), |
+ base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON)); |
+ event_dispatcher()->ProcessEvent(mouse_pressed); |
+ |
+ scoped_ptr<DispatchedEventDetails> details = |
+ test_event_dispatcher_delegate()->GetAndAdvanceDispatchedEventDetails(); |
+ ASSERT_TRUE(details); |
+ EXPECT_EQ(w1.get(), details->window); |
+ EXPECT_TRUE(details->in_nonclient_area); |
+ |
+ ASSERT_TRUE(details->event); |
+ ASSERT_TRUE(details->event->IsPointerEvent()); |
+ |
+ ui::PointerEvent* dispatched_event = details->event->AsPointerEvent(); |
+ EXPECT_EQ(gfx::Point(45, 15), dispatched_event->root_location()); |
+ EXPECT_EQ(gfx::Point(35, 5), dispatched_event->location()); |
+} |
// Tests that setting capture to a descendant of a modal parent fails. |
TEST_F(EventDispatcherTest, ModalWindowSetCaptureDescendantOfModalParent) { |
@@ -1338,6 +1395,22 @@ TEST_F(EventDispatcherTest, ModalWindowSetCaptureUnrelatedWindow) { |
EXPECT_EQ(w3.get(), event_dispatcher()->capture_window()); |
} |
+// Tests that setting capture fails when there is a system modal window. |
+TEST_F(EventDispatcherTest, ModalWindowSystemSetCapture) { |
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3)); |
+ scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 4)); |
+ |
+ root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); |
+ w1->SetBounds(gfx::Rect(10, 10, 30, 30)); |
+ w2->SetBounds(gfx::Rect(50, 10, 10, 10)); |
+ |
+ w2->SetModal(); |
+ event_dispatcher()->SetSystemModalWindow(w2.get()); |
+ |
+ EXPECT_FALSE(event_dispatcher()->SetCaptureWindow(w1.get(), false)); |
+ EXPECT_EQ(nullptr, event_dispatcher()->capture_window()); |
+} |
+ |
} // namespace test |
} // namespace ws |
} // namespace mus |