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

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

Issue 1425123002: Makes event dispatch implicitly target specific window until release (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 5 years, 2 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
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 91ce4b3a060404688ee4425b0b8a9ec0e5a9d760..1ad8b7c89b4de939635255187740691d1624532f 100644
--- a/components/mus/ws/event_dispatcher_unittest.cc
+++ b/components/mus/ws/event_dispatcher_unittest.cc
@@ -36,6 +36,11 @@ class TestEventDispatcherDelegate : public EventDispatcherDelegate {
return return_value;
}
+ ServerWindow* GetAndClearLastTarget() {
+ ServerWindow* result = last_target_;
+ last_target_ = nullptr;
+ return result;
+ }
ServerWindow* last_target() { return last_target_; }
bool GetAndClearLastInNonclientArea() {
@@ -44,6 +49,12 @@ class TestEventDispatcherDelegate : public EventDispatcherDelegate {
return result;
}
+ ServerWindow* GetAndClearLastFocusedWindow() {
+ ServerWindow* result = focused_window_;
+ focused_window_ = nullptr;
+ return result;
+ }
+
private:
// EventDispatcherDelegate:
void OnAccelerator(uint32_t accelerator, mojo::EventPtr event) override {
@@ -342,5 +353,153 @@ TEST(EventDispatcherTest, ClientAreaGoesToOwner) {
EXPECT_FALSE(event_dispatcher_delegate.GetAndClearLastInNonclientArea());
}
+TEST(EventDispatcherTest, DontFocusOnSecondDown) {
+ TestServerWindowDelegate window_delegate;
+ ServerWindow root(&window_delegate, WindowId(1, 2));
+ window_delegate.set_root_window(&root);
+ root.SetVisible(true);
+
+ ServerWindow child1(&window_delegate, WindowId(1, 3));
+ root.Add(&child1);
+ child1.SetVisible(true);
+
+ ServerWindow child2(&window_delegate, WindowId(1, 4));
+ root.Add(&child2);
+ child2.SetVisible(true);
+
+ root.SetBounds(gfx::Rect(0, 0, 100, 100));
+ child1.SetBounds(gfx::Rect(10, 10, 20, 20));
+ child2.SetBounds(gfx::Rect(50, 51, 11, 12));
+
+ TestEventDispatcherDelegate event_dispatcher_delegate(&root);
+ EventDispatcher dispatcher(&event_dispatcher_delegate);
+ dispatcher.set_root(&root);
+
+ // Press on child1. First press event should change focus.
+ const ui::MouseEvent press_event(
+ ui::ET_MOUSE_PRESSED, gfx::PointF(12.f, 12.f), gfx::PointF(12.f, 12.f),
+ base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(press_event)));
+ EXPECT_EQ(&child1, event_dispatcher_delegate.last_target());
+ EXPECT_EQ(&child1, event_dispatcher_delegate.GetAndClearLastFocusedWindow());
+
+ // Press (with a different pointer id) on child2. Event should go to child2,
+ // but focus should not change.
+ const ui::TouchEvent touch_event(
+ ui::ET_TOUCH_PRESSED, gfx::PointF(53.f, 54.f), 2, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(touch_event)));
+ EXPECT_EQ(&child2, event_dispatcher_delegate.last_target());
+ EXPECT_EQ(nullptr, event_dispatcher_delegate.GetAndClearLastFocusedWindow());
+}
+
+TEST(EventDispatcherTest, TwoPointersActive) {
+ TestServerWindowDelegate window_delegate;
+ ServerWindow root(&window_delegate, WindowId(1, 2));
+ window_delegate.set_root_window(&root);
+ root.SetVisible(true);
+
+ ServerWindow child1(&window_delegate, WindowId(1, 3));
+ root.Add(&child1);
+ child1.SetVisible(true);
+
+ ServerWindow child2(&window_delegate, WindowId(1, 4));
+ root.Add(&child2);
+ child2.SetVisible(true);
+
+ root.SetBounds(gfx::Rect(0, 0, 100, 100));
+ child1.SetBounds(gfx::Rect(10, 10, 20, 20));
+ child2.SetBounds(gfx::Rect(50, 51, 11, 12));
+
+ TestEventDispatcherDelegate event_dispatcher_delegate(&root);
+ EventDispatcher dispatcher(&event_dispatcher_delegate);
+ dispatcher.set_root(&root);
+
+ // Press on child1.
+ const ui::TouchEvent touch_event1(
+ ui::ET_TOUCH_PRESSED, gfx::PointF(12.f, 13.f), 1, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(touch_event1)));
+ EXPECT_EQ(&child1, event_dispatcher_delegate.GetAndClearLastTarget());
+
+ // Drag over child2, child1 should get the drag.
+ const ui::TouchEvent drag_event1(ui::ET_TOUCH_MOVED, gfx::PointF(53.f, 54.f),
+ 1, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(drag_event1)));
+ EXPECT_EQ(&child1, event_dispatcher_delegate.GetAndClearLastTarget());
+
+ // Press on child2 with a different touch id.
+ const ui::TouchEvent touch_event2(
+ ui::ET_TOUCH_PRESSED, gfx::PointF(54.f, 55.f), 2, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(touch_event2)));
+ EXPECT_EQ(&child2, event_dispatcher_delegate.GetAndClearLastTarget());
+
+ // Drag over child1 with id 2, child2 should continue to get the drag.
+ const ui::TouchEvent drag_event2(ui::ET_TOUCH_MOVED, gfx::PointF(13.f, 14.f),
+ 2, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(drag_event2)));
+ EXPECT_EQ(&child2, event_dispatcher_delegate.GetAndClearLastTarget());
+
+ // Drag again with id 1, child1 should continue to get it.
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(drag_event1)));
+ EXPECT_EQ(&child1, event_dispatcher_delegate.GetAndClearLastTarget());
+
+ // Release touch id 1, and click on 2. 2 should get it.
+ const ui::TouchEvent touch_release(
+ ui::ET_TOUCH_RELEASED, gfx::PointF(54.f, 55.f), 1, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(touch_release)));
+ EXPECT_EQ(&child1, event_dispatcher_delegate.GetAndClearLastTarget());
+ const ui::TouchEvent touch_event3(
+ ui::ET_TOUCH_PRESSED, gfx::PointF(54.f, 55.f), 2, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(touch_event3)));
+ EXPECT_EQ(&child2, event_dispatcher_delegate.GetAndClearLastTarget());
+}
+
+TEST(EventDispatcherTest, DestroyWindowWhileGettingEvents) {
+ TestServerWindowDelegate window_delegate;
+ ServerWindow root(&window_delegate, WindowId(1, 2));
+ window_delegate.set_root_window(&root);
+ root.SetVisible(true);
+
+ scoped_ptr<ServerWindow> child(
+ new ServerWindow(&window_delegate, WindowId(1, 3)));
+ root.Add(child.get());
+ child->SetVisible(true);
+
+ root.SetBounds(gfx::Rect(0, 0, 100, 100));
+ child->SetBounds(gfx::Rect(10, 10, 20, 20));
+
+ TestEventDispatcherDelegate event_dispatcher_delegate(&root);
+ EventDispatcher dispatcher(&event_dispatcher_delegate);
+ dispatcher.set_root(&root);
+
+ // Press on child.
+ const ui::TouchEvent touch_event1(
+ ui::ET_TOUCH_PRESSED, gfx::PointF(12.f, 13.f), 1, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(touch_event1)));
+ EXPECT_EQ(child.get(), event_dispatcher_delegate.GetAndClearLastTarget());
+
+ event_dispatcher_delegate.GetAndClearLastDispatchedEvent();
+
+ // Delete child, and continue the drag. Event should not be dispatched.
+ child.reset();
+
+ const ui::TouchEvent drag_event1(ui::ET_TOUCH_MOVED, gfx::PointF(53.f, 54.f),
+ 1, base::TimeDelta());
+ dispatcher.OnEvent(
+ mojo::Event::From(static_cast<const ui::Event&>(drag_event1)));
+ EXPECT_EQ(nullptr, event_dispatcher_delegate.GetAndClearLastTarget());
+ EXPECT_EQ(nullptr,
+ event_dispatcher_delegate.GetAndClearLastDispatchedEvent().get());
+}
+
} // namespace ws
} // namespace mus

Powered by Google App Engine
This is Rietveld 408576698