Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(323)

Unified Diff: components/mus/ws/event_dispatcher_unittest.cc

Issue 1759523002: mus: Server-side implementation of modal windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: SetAsModal -> SetModal + Other review comments addressed Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/mus/ws/event_dispatcher.cc ('k') | components/mus/ws/server_window.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ea34f1cf3b516583feccc1b4ec32dc4bb22b8c6c..3273c3cbf235202dea46ef2cc691de927374095b 100644
--- a/components/mus/ws/event_dispatcher_unittest.cc
+++ b/components/mus/ws/event_dispatcher_unittest.cc
@@ -183,9 +183,10 @@ class EventDispatcherTest : public testing::Test {
bool AreAnyPointersDown() const;
// Deletes everything created during SetUp()
void ClearSetup();
- // Creates a window which is a child of |root_window_|. It is not owned by
- // EventDispatcherTest.
- ServerWindow* CreateChildWindow(const WindowId& id);
+ scoped_ptr<ServerWindow> CreateChildWindowWithParent(const WindowId& id,
+ ServerWindow* parent);
+ // 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;
int NumberPointerTargetsForWindow(ServerWindow* window) const;
@@ -214,14 +215,21 @@ void EventDispatcherTest::ClearSetup() {
event_dispatcher_.reset();
}
-ServerWindow* EventDispatcherTest::CreateChildWindow(const WindowId& id) {
- ServerWindow* child = new ServerWindow(window_delegate_.get(), id);
- root_window_->Add(child);
+scoped_ptr<ServerWindow> EventDispatcherTest::CreateChildWindowWithParent(
+ const WindowId& id,
+ ServerWindow* parent) {
+ scoped_ptr<ServerWindow> child(new ServerWindow(window_delegate_.get(), id));
+ parent->Add(child.get());
child->SetVisible(true);
- EnableHitTest(child);
+ EnableHitTest(child.get());
return child;
}
+scoped_ptr<ServerWindow> EventDispatcherTest::CreateChildWindow(
+ const WindowId& id) {
+ return CreateChildWindowWithParent(id, root_window_.get());
+}
+
bool EventDispatcherTest::IsMouseButtonDown() const {
return EventDispatcherTestApi(event_dispatcher_.get()).is_mouse_button_down();
}
@@ -253,7 +261,7 @@ void EventDispatcherTest::SetUp() {
}
TEST_F(EventDispatcherTest, ProcessEvent) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -377,7 +385,7 @@ TEST_F(EventDispatcherTest, PostTargetAccelerator) {
TEST_F(EventDispatcherTest, Capture) {
ServerWindow* root = root_window();
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -419,7 +427,7 @@ TEST_F(EventDispatcherTest, Capture) {
}
TEST_F(EventDispatcherTest, CaptureMultipleMouseButtons) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -462,7 +470,7 @@ TEST_F(EventDispatcherTest, CaptureMultipleMouseButtons) {
}
TEST_F(EventDispatcherTest, ClientAreaGoesToOwner) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -531,7 +539,7 @@ TEST_F(EventDispatcherTest, ClientAreaGoesToOwner) {
}
TEST_F(EventDispatcherTest, AdditionalClientArea) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -557,8 +565,8 @@ TEST_F(EventDispatcherTest, AdditionalClientArea) {
}
TEST_F(EventDispatcherTest, DontFocusOnSecondDown) {
- scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3)));
- scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4)));
+ scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child1->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -592,8 +600,8 @@ TEST_F(EventDispatcherTest, DontFocusOnSecondDown) {
}
TEST_F(EventDispatcherTest, TwoPointersActive) {
- scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3)));
- scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4)));
+ scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child1->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -651,7 +659,7 @@ TEST_F(EventDispatcherTest, TwoPointersActive) {
}
TEST_F(EventDispatcherTest, DestroyWindowWhileGettingEvents) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -681,7 +689,7 @@ TEST_F(EventDispatcherTest, DestroyWindowWhileGettingEvents) {
TEST_F(EventDispatcherTest, MouseInExtendedHitTestRegion) {
ServerWindow* root = root_window();
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -731,8 +739,8 @@ TEST_F(EventDispatcherTest, MouseInExtendedHitTestRegion) {
// TODO(moshayedi): crbug.com/590226. Enable this after we support wheel events
// in mus event dispatcher.
TEST_F(EventDispatcherTest, DISABLED_WheelWhileDown) {
- scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3)));
- scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4)));
+ scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child1->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -761,7 +769,7 @@ TEST_F(EventDispatcherTest, DISABLED_WheelWhileDown) {
// appropriate target window.
TEST_F(EventDispatcherTest, SetExplicitCapture) {
ServerWindow* root = root_window();
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -855,7 +863,7 @@ TEST_F(EventDispatcherTest, SetExplicitCapture) {
// capture.
TEST_F(EventDispatcherTest, ExplicitCaptureOverridesImplicitCapture) {
ServerWindow* root = root_window();
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -977,8 +985,8 @@ TEST_F(EventDispatcherTest, CaptureUpdatesActivePointerTargets) {
// Tests that when explicit capture is changed, that the previous window with
// capture is no longer being observed.
TEST_F(EventDispatcherTest, UpdatingCaptureStopsObservingPreviousCapture) {
- scoped_ptr<ServerWindow> child1(CreateChildWindow(WindowId(1, 3)));
- scoped_ptr<ServerWindow> child2(CreateChildWindow(WindowId(1, 4)));
+ scoped_ptr<ServerWindow> child1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> child2 = CreateChildWindow(WindowId(1, 4));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child1->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -1000,7 +1008,7 @@ TEST_F(EventDispatcherTest, UpdatingCaptureStopsObservingPreviousCapture) {
// Tests that destroying a window with explicit capture clears the capture
// state.
TEST_F(EventDispatcherTest, DestroyingCaptureWindowRemovesExplicitCapture) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
EventDispatcher* dispatcher = event_dispatcher();
@@ -1042,7 +1050,7 @@ TEST_F(EventDispatcherTest, CaptureInNonClientAreaOverridesActualPoint) {
}
TEST_F(EventDispatcherTest, ProcessPointerEvents) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -1089,7 +1097,7 @@ TEST_F(EventDispatcherTest, ProcessPointerEvents) {
}
TEST_F(EventDispatcherTest, ResetClearsPointerDown) {
- scoped_ptr<ServerWindow> child(CreateChildWindow(WindowId(1, 3)));
+ scoped_ptr<ServerWindow> child = CreateChildWindow(WindowId(1, 3));
root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
child->SetBounds(gfx::Rect(10, 10, 20, 20));
@@ -1125,6 +1133,179 @@ TEST_F(EventDispatcherTest, ResetClearsCapture) {
EXPECT_EQ(nullptr, event_dispatcher()->capture_window());
}
+// Tests that events on a modal parent target the modal child.
+TEST_F(EventDispatcherTest, ModalWindowEventOnModalParent) {
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5));
+
+ 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));
+
+ w1->AddTransientWindow(w2.get());
+ w2->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(w2.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(15, 15), dispatched_event->root_location());
+ EXPECT_EQ(gfx::Point(-35, 5), dispatched_event->location());
+}
+
+// Tests that events on a modal child target the modal child itself.
+TEST_F(EventDispatcherTest, ModalWindowEventOnModalChild) {
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5));
+
+ 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));
+
+ w1->AddTransientWindow(w2.get());
+ w2->SetModal();
+
+ // Send event that is over |w2|.
+ const ui::PointerEvent mouse_pressed(ui::MouseEvent(
+ ui::ET_MOUSE_PRESSED, gfx::Point(55, 15), gfx::Point(55, 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(w2.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(55, 15), dispatched_event->root_location());
+ EXPECT_EQ(gfx::Point(5, 5), dispatched_event->location());
+}
+
+// Tests that events on an unrelated window are not affected by the modal
+// window.
+TEST_F(EventDispatcherTest, ModalWindowEventOnUnrelatedWindow) {
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5));
+ scoped_ptr<ServerWindow> w3 = CreateChildWindow(WindowId(1, 6));
+
+ 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));
+ w3->SetBounds(gfx::Rect(70, 10, 10, 10));
+
+ w1->AddTransientWindow(w2.get());
+ w2->SetModal();
+
+ // Send event that is over |w3|.
+ const ui::PointerEvent mouse_pressed(ui::MouseEvent(
+ ui::ET_MOUSE_PRESSED, gfx::Point(75, 15), gfx::Point(75, 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(w3.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(75, 15), dispatched_event->root_location());
+ EXPECT_EQ(gfx::Point(5, 5), dispatched_event->location());
+}
+
+// Tests that events events on a descendant of a modal parent target the modal
+// child.
+TEST_F(EventDispatcherTest, ModalWindowEventOnDescendantOfModalParent) {
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> w11 =
+ CreateChildWindowWithParent(WindowId(1, 4), w1.get());
+ scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5));
+
+ root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
+ w1->SetBounds(gfx::Rect(10, 10, 30, 30));
+ w11->SetBounds(gfx::Rect(10, 10, 10, 10));
+ w2->SetBounds(gfx::Rect(50, 10, 10, 10));
+
+ w1->AddTransientWindow(w2.get());
+ w2->SetModal();
+
+ // Send event that is over |w11|.
+ const ui::PointerEvent mouse_pressed(ui::MouseEvent(
+ ui::ET_MOUSE_PRESSED, gfx::Point(25, 25), gfx::Point(25, 25),
+ 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(w2.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(25, 25), dispatched_event->root_location());
+ EXPECT_EQ(gfx::Point(-25, 15), dispatched_event->location());
+}
+
+
+// Tests that setting capture to a descendant of a modal parent fails.
+TEST_F(EventDispatcherTest, ModalWindowSetCaptureDescendantOfModalParent) {
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> w11 =
+ CreateChildWindowWithParent(WindowId(1, 4), w1.get());
+ scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5));
+
+ root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
+ w1->SetBounds(gfx::Rect(10, 10, 30, 30));
+ w11->SetBounds(gfx::Rect(10, 10, 10, 10));
+ w2->SetBounds(gfx::Rect(50, 10, 10, 10));
+
+ w1->AddTransientWindow(w2.get());
+ w2->SetModal();
+
+ EXPECT_FALSE(event_dispatcher()->SetCaptureWindow(w11.get(), false));
+ EXPECT_EQ(nullptr, event_dispatcher()->capture_window());
+}
+
+// Tests that setting capture to a window unrelated to a modal parent works.
+TEST_F(EventDispatcherTest, ModalWindowSetCaptureUnrelatedWindow) {
+ scoped_ptr<ServerWindow> w1 = CreateChildWindow(WindowId(1, 3));
+ scoped_ptr<ServerWindow> w2 = CreateChildWindow(WindowId(1, 5));
+ scoped_ptr<ServerWindow> w3 = CreateChildWindow(WindowId(1, 6));
+
+ 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));
+ w3->SetBounds(gfx::Rect(70, 10, 10, 10));
+
+ w1->AddTransientWindow(w2.get());
+ w2->SetModal();
+
+ EXPECT_TRUE(event_dispatcher()->SetCaptureWindow(w3.get(), false));
+ EXPECT_EQ(w3.get(), event_dispatcher()->capture_window());
+}
+
} // namespace test
} // namespace ws
} // namespace mus
« no previous file with comments | « components/mus/ws/event_dispatcher.cc ('k') | components/mus/ws/server_window.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698