Index: ui/aura/mus/window_tree_client_unittest.cc |
diff --git a/ui/aura/mus/window_tree_client_unittest.cc b/ui/aura/mus/window_tree_client_unittest.cc |
index 0cb895ab493dbb7afa6b1c3ff07d3713d02e1c0f..110f0d1944dafbe460c83ac96272c0247a594afb 100644 |
--- a/ui/aura/mus/window_tree_client_unittest.cc |
+++ b/ui/aura/mus/window_tree_client_unittest.cc |
@@ -22,6 +22,7 @@ |
#include "ui/aura/client/focus_client.h" |
#include "ui/aura/client/transient_window_client.h" |
#include "ui/aura/mus/capture_synchronizer.h" |
+#include "ui/aura/mus/mus_types.h" |
#include "ui/aura/mus/property_converter.h" |
#include "ui/aura/mus/window_mus.h" |
#include "ui/aura/mus/window_tree_client_delegate.h" |
@@ -541,7 +542,8 @@ class InputEventBasicTestWindowDelegate : public test::TestWindowDelegate { |
class InputEventBasicTestEventHandler : public ui::test::TestEventHandler { |
public: |
- InputEventBasicTestEventHandler() {} |
+ explicit InputEventBasicTestEventHandler(Window* target_window) |
+ : target_window_(target_window) {} |
~InputEventBasicTestEventHandler() override {} |
bool got_move() const { return got_move_; } |
@@ -550,10 +552,12 @@ class InputEventBasicTestEventHandler : public ui::test::TestEventHandler { |
// ui::test::TestEventHandler overrides. |
void OnMouseEvent(ui::MouseEvent* event) override { |
- if (event->type() == ui::ET_MOUSE_MOVED) |
- got_move_ = true; |
- last_event_location_ = event->location(); |
- event->SetHandled(); |
+ if (event->target() == target_window_) { |
+ if (event->type() == ui::ET_MOUSE_MOVED) |
+ got_move_ = true; |
+ last_event_location_ = event->location(); |
+ event->SetHandled(); |
+ } |
} |
void reset() { |
@@ -563,6 +567,7 @@ class InputEventBasicTestEventHandler : public ui::test::TestEventHandler { |
} |
private: |
+ Window* target_window_ = nullptr; |
bool got_move_ = false; |
gfx::Point last_event_location_; |
uint32_t event_id_ = 0; |
@@ -816,7 +821,7 @@ TEST_F(WindowTreeClientClientTest, InputEventCaptureWindow) { |
TEST_F(WindowTreeClientClientTest, InputEventRootWindow) { |
WindowTreeHostMus window_tree_host(window_tree_client_impl()); |
Window* top_level = window_tree_host.window(); |
- InputEventBasicTestEventHandler root_handler; |
+ InputEventBasicTestEventHandler root_handler(top_level); |
top_level->AddPreTargetHandler(&root_handler); |
const gfx::Rect bounds(0, 0, 100, 100); |
window_tree_host.SetBoundsInPixels(bounds); |
@@ -854,6 +859,104 @@ TEST_F(WindowTreeClientClientTest, InputEventRootWindow) { |
EXPECT_EQ(gfx::Point(), child_delegate.last_event_location()); |
} |
+TEST_F(WindowTreeClientClientTest, InputEventNoWindow) { |
+ WindowTreeHostMus window_tree_host(window_tree_client_impl()); |
+ Window* top_level = window_tree_host.window(); |
+ InputEventBasicTestEventHandler root_handler(top_level); |
+ top_level->AddPreTargetHandler(&root_handler); |
+ const gfx::Rect bounds(0, 0, 100, 100); |
+ window_tree_host.SetBoundsInPixels(bounds); |
+ window_tree_host.InitHost(); |
+ window_tree_host.Show(); |
+ EXPECT_EQ(bounds, top_level->bounds()); |
+ EXPECT_EQ(bounds, window_tree_host.GetBoundsInPixels()); |
+ InputEventBasicTestWindowDelegate child_delegate1(window_tree()); |
+ Window child1(&child_delegate1); |
+ child1.Init(ui::LAYER_NOT_DRAWN); |
+ top_level->AddChild(&child1); |
+ child1.SetBounds(gfx::Rect(25, 25, 100, 100)); |
+ child1.Show(); |
+ InputEventBasicTestWindowDelegate child_delegate2(window_tree()); |
+ Window child2(&child_delegate2); |
+ child2.Init(ui::LAYER_NOT_DRAWN); |
+ top_level->AddChild(&child2); |
+ child2.SetBounds(gfx::Rect(40, 40, 100, 100)); |
+ child2.Show(); |
+ EXPECT_FALSE(root_handler.got_move()); |
+ EXPECT_FALSE(child_delegate1.got_move()); |
+ EXPECT_FALSE(child_delegate2.got_move()); |
+ |
+ const gfx::Point event_location(40, 50); |
+ const gfx::Point event_root_location(10, 10); |
+ uint32_t event_id = 1; |
+ root_handler.set_event_id(event_id); |
+ child_delegate1.set_event_id(event_id); |
+ child_delegate2.set_event_id(event_id); |
+ std::unique_ptr<ui::Event> ui_event(new ui::MouseEvent( |
+ ui::ET_MOUSE_MOVED, event_location, event_root_location, |
+ ui::EventTimeForNow(), ui::EF_NONE, 0)); |
+ window_tree_client()->OnWindowInputEvent( |
+ event_id, kInvalidServerId, window_tree_host.display_id(), |
+ ui::Event::Clone(*ui_event.get()), 0); |
+ // WindowTreeClient::OnWindowInputEvent cannot find a target window with |
+ // kInvalidServerId but should use the display_id to find the window_tree_host |
+ // for event dispatching and dispatch the event to |top_level| since it's in |
+ // the space for |top_level|. |
+ EXPECT_TRUE(window_tree()->WasEventAcked(event_id)); |
+ EXPECT_EQ(ui::mojom::EventResult::HANDLED, |
+ window_tree()->GetEventResult(event_id)); |
+ EXPECT_TRUE(root_handler.got_move()); |
+ EXPECT_EQ(event_root_location, root_handler.last_event_location()); |
+ EXPECT_FALSE(child_delegate1.got_move()); |
+ EXPECT_FALSE(child_delegate2.got_move()); |
+ root_handler.reset(); |
+ child_delegate1.reset(); |
+ child_delegate2.reset(); |
+ |
+ const gfx::Point event_root_location1(30, 30); |
+ event_id = 2; |
+ root_handler.set_event_id(event_id); |
+ child_delegate1.set_event_id(event_id); |
+ child_delegate2.set_event_id(event_id); |
+ std::unique_ptr<ui::Event> ui_event1(new ui::MouseEvent( |
+ ui::ET_MOUSE_MOVED, event_location, event_root_location1, |
+ ui::EventTimeForNow(), ui::EF_NONE, 0)); |
+ window_tree_client()->OnWindowInputEvent( |
+ event_id, kInvalidServerId, window_tree_host.display_id(), |
+ ui::Event::Clone(*ui_event1.get()), 0); |
+ // |child1| should get the event since it's in the space for |child1|. |
+ EXPECT_TRUE(window_tree()->WasEventAcked(event_id)); |
+ EXPECT_EQ(ui::mojom::EventResult::HANDLED, |
+ window_tree()->GetEventResult(event_id)); |
+ EXPECT_FALSE(root_handler.got_move()); |
+ EXPECT_TRUE(child_delegate1.got_move()); |
+ EXPECT_EQ(gfx::Point(5, 5), child_delegate1.last_event_location()); |
+ EXPECT_FALSE(child_delegate2.got_move()); |
+ root_handler.reset(); |
+ child_delegate1.reset(); |
+ child_delegate2.reset(); |
+ |
+ const gfx::Point event_root_location2(60, 60); |
+ event_id = 3; |
+ root_handler.set_event_id(event_id); |
+ child_delegate1.set_event_id(event_id); |
+ child_delegate2.set_event_id(event_id); |
+ std::unique_ptr<ui::Event> ui_event2(new ui::MouseEvent( |
+ ui::ET_MOUSE_MOVED, event_location, event_root_location2, |
+ ui::EventTimeForNow(), ui::EF_NONE, 0)); |
+ window_tree_client()->OnWindowInputEvent( |
+ event_id, kInvalidServerId, window_tree_host.display_id(), |
+ ui::Event::Clone(*ui_event2.get()), 0); |
+ // |child2| should get the event since it's in the space for |child2|. |
+ EXPECT_TRUE(window_tree()->WasEventAcked(event_id)); |
+ EXPECT_EQ(ui::mojom::EventResult::HANDLED, |
+ window_tree()->GetEventResult(event_id)); |
+ EXPECT_FALSE(root_handler.got_move()); |
+ EXPECT_FALSE(child_delegate1.got_move()); |
+ EXPECT_TRUE(child_delegate2.got_move()); |
+ EXPECT_EQ(gfx::Point(20, 20), child_delegate2.last_event_location()); |
+} |
+ |
class WindowTreeClientPointerObserverTest : public WindowTreeClientClientTest { |
public: |
WindowTreeClientPointerObserverTest() {} |