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 bfa7c7852b593e23754b85c673e17dc821f91daa..8d470c6e9f82988c9a0787e21dd7e0e1b55ce29d 100644 |
--- a/ui/aura/mus/window_tree_client_unittest.cc |
+++ b/ui/aura/mus/window_tree_client_unittest.cc |
@@ -665,6 +665,8 @@ class InputEventBasicTestWindowDelegate : public test::TestWindowDelegate { |
~InputEventBasicTestWindowDelegate() override {} |
bool got_move() const { return got_move_; } |
+ bool got_press() const { return got_press_; } |
+ bool got_release() const { return got_release_; } |
bool was_acked() const { return was_acked_; } |
const gfx::Point& last_event_location() const { return last_event_location_; } |
void set_event_id(uint32_t event_id) { event_id_ = event_id; } |
@@ -674,6 +676,20 @@ class InputEventBasicTestWindowDelegate : public test::TestWindowDelegate { |
was_acked_ = test_window_tree_->WasEventAcked(event_id_); |
if (event->type() == ui::ET_MOUSE_MOVED) |
got_move_ = true; |
+ else if (event->type() == ui::ET_MOUSE_PRESSED) |
+ got_press_ = true; |
+ else if (event->type() == ui::ET_MOUSE_RELEASED) |
+ got_release_ = true; |
+ last_event_location_ = event->location(); |
+ event->SetHandled(); |
+ } |
+ |
+ void OnTouchEvent(ui::TouchEvent* event) override { |
+ was_acked_ = test_window_tree_->WasEventAcked(event_id_); |
+ if (event->type() == ui::ET_TOUCH_PRESSED) |
+ got_press_ = true; |
+ else if (event->type() == ui::ET_TOUCH_RELEASED) |
+ got_release_ = true; |
last_event_location_ = event->location(); |
event->SetHandled(); |
} |
@@ -681,6 +697,8 @@ class InputEventBasicTestWindowDelegate : public test::TestWindowDelegate { |
void reset() { |
was_acked_ = false; |
got_move_ = false; |
+ got_press_ = false; |
+ got_release_ = false; |
last_event_location_ = gfx::Point(); |
event_id_ = 0; |
} |
@@ -689,6 +707,8 @@ class InputEventBasicTestWindowDelegate : public test::TestWindowDelegate { |
TestWindowTree* test_window_tree_; |
bool was_acked_ = false; |
bool got_move_ = false; |
+ bool got_press_ = false; |
+ bool got_release_ = false; |
gfx::Point last_event_location_; |
uint32_t event_id_ = 0; |
@@ -697,7 +717,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_; } |
@@ -706,10 +727,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() { |
@@ -719,6 +742,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; |
@@ -1011,7 +1035,7 @@ TEST_F(WindowTreeClientClientTest, InputEventRootWindow) { |
WindowTreeHostMus window_tree_host( |
CreateInitParamsForTopLevel(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); |
@@ -1049,6 +1073,129 @@ TEST_F(WindowTreeClientClientTest, InputEventRootWindow) { |
EXPECT_EQ(gfx::Point(), child_delegate.last_event_location()); |
} |
+TEST_F(WindowTreeClientClientTest, InputMouseEventNoWindow) { |
+ Env* env = Env::GetInstance(); |
+ InputEventBasicTestWindowDelegate window_delegate(window_tree()); |
+ WindowTreeHostMus window_tree_host( |
+ CreateInitParamsForTopLevel(window_tree_client_impl())); |
+ Window* top_level = window_tree_host.window(); |
+ 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()); |
+ Window child(&window_delegate); |
+ child.Init(ui::LAYER_NOT_DRAWN); |
+ top_level->AddChild(&child); |
+ child.SetBounds(gfx::Rect(10, 10, 100, 100)); |
+ child.Show(); |
+ |
+ EXPECT_FALSE(window_delegate.got_press()); |
+ EXPECT_FALSE(env->IsMouseButtonDown()); |
+ EXPECT_FALSE(env->mouse_button_flags()); |
+ EXPECT_EQ(gfx::Point(), env->last_mouse_location()); |
+ |
+ const gfx::Point event_location(2, 3); |
+ uint32_t event_id = 1; |
+ window_delegate.set_event_id(event_id); |
+ ui::PointerEvent pointer_event_down( |
+ ui::ET_POINTER_DOWN, event_location, gfx::Point(), |
+ ui::EF_LEFT_MOUSE_BUTTON, 0, |
+ ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_MOUSE, 0), |
+ ui::EventTimeForNow()); |
+ window_tree_client()->OnWindowInputEvent( |
+ event_id, server_id(&child), window_tree_host.display_id(), |
+ ui::Event::Clone(pointer_event_down), 0); |
+ EXPECT_TRUE(window_tree()->WasEventAcked(event_id)); |
+ EXPECT_EQ(ui::mojom::EventResult::HANDLED, |
+ window_tree()->GetEventResult(event_id)); |
+ EXPECT_TRUE(window_delegate.got_press()); |
+ EXPECT_TRUE(env->IsMouseButtonDown()); |
+ EXPECT_EQ(1024, env->mouse_button_flags()); // ui::EF_LEFT_MOUSE_BUTTON |
+ EXPECT_EQ(event_location, env->last_mouse_location()); |
+ window_delegate.reset(); |
+ |
+ const gfx::Point event_location1(4, 5); |
+ event_id = 2; |
+ window_delegate.set_event_id(event_id); |
+ ui::PointerEvent pointer_event_up( |
+ ui::ET_POINTER_UP, event_location1, gfx::Point(), |
+ ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON, |
+ ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_MOUSE, 0), |
+ ui::EventTimeForNow()); |
+ window_tree_client()->OnWindowInputEvent( |
+ event_id, kInvalidServerId, window_tree_host.display_id(), |
+ ui::Event::Clone(pointer_event_up), 0); |
+ EXPECT_TRUE(window_tree()->WasEventAcked(event_id)); |
+ // WindowTreeClient::OnWindowInputEvent cannot find a target window with |
+ // kInvalidServerId but should use the event to update event states kept in |
+ // aura::Env, location shouldn't be updated. |
+ EXPECT_EQ(ui::mojom::EventResult::UNHANDLED, |
+ window_tree()->GetEventResult(event_id)); |
+ EXPECT_FALSE(window_delegate.got_release()); |
+ EXPECT_FALSE(env->IsMouseButtonDown()); |
+ EXPECT_FALSE(env->mouse_button_flags()); |
+ EXPECT_EQ(event_location, env->last_mouse_location()); |
+} |
+ |
+TEST_F(WindowTreeClientClientTest, InputTouchEventNoWindow) { |
+ Env* env = Env::GetInstance(); |
+ InputEventBasicTestWindowDelegate window_delegate(window_tree()); |
+ WindowTreeHostMus window_tree_host( |
+ CreateInitParamsForTopLevel(window_tree_client_impl())); |
+ Window* top_level = window_tree_host.window(); |
+ 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()); |
+ Window child(&window_delegate); |
+ child.Init(ui::LAYER_NOT_DRAWN); |
+ top_level->AddChild(&child); |
+ child.SetBounds(gfx::Rect(10, 10, 100, 100)); |
+ child.Show(); |
+ |
+ EXPECT_FALSE(window_delegate.got_press()); |
+ EXPECT_FALSE(env->is_touch_down()); |
+ |
+ const gfx::Point event_location(2, 3); |
+ uint32_t event_id = 1; |
+ window_delegate.set_event_id(event_id); |
+ ui::PointerEvent pointer_event_down( |
+ ui::ET_POINTER_DOWN, event_location, gfx::Point(), 0, 0, |
+ ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0), |
+ ui::EventTimeForNow()); |
+ window_tree_client()->OnWindowInputEvent( |
+ event_id, server_id(&child), window_tree_host.display_id(), |
+ ui::Event::Clone(pointer_event_down), 0); |
+ EXPECT_TRUE(window_tree()->WasEventAcked(event_id)); |
+ EXPECT_EQ(ui::mojom::EventResult::HANDLED, |
+ window_tree()->GetEventResult(event_id)); |
+ EXPECT_TRUE(window_delegate.got_press()); |
+ EXPECT_TRUE(env->is_touch_down()); |
+ window_delegate.reset(); |
+ |
+ event_id = 2; |
+ window_delegate.set_event_id(event_id); |
+ ui::PointerEvent pointer_event_up( |
+ ui::ET_POINTER_UP, event_location, gfx::Point(), 0, 0, |
+ ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0), |
+ ui::EventTimeForNow()); |
+ window_tree_client()->OnWindowInputEvent( |
+ event_id, kInvalidServerId, window_tree_host.display_id(), |
+ ui::Event::Clone(pointer_event_up), 0); |
+ EXPECT_TRUE(window_tree()->WasEventAcked(event_id)); |
+ // WindowTreeClient::OnWindowInputEvent cannot find a target window with |
+ // kInvalidServerId but should use the event to update event states kept in |
+ // aura::Env. |
+ EXPECT_EQ(ui::mojom::EventResult::UNHANDLED, |
+ window_tree()->GetEventResult(event_id)); |
+ EXPECT_FALSE(window_delegate.got_release()); |
+ EXPECT_FALSE(env->is_touch_down()); |
+} |
+ |
class WindowTreeClientPointerObserverTest : public WindowTreeClientClientTest { |
public: |
WindowTreeClientPointerObserverTest() {} |
@@ -1116,11 +1263,14 @@ TEST_F(WindowTreeClientPointerObserverTest, OnPointerEventObserved) { |
// Tests pointer watchers triggered by events that hit this window tree. |
TEST_F(WindowTreeClientPointerObserverTest, |
OnWindowInputEventWithPointerWatcher) { |
- std::unique_ptr<Window> top_level(base::MakeUnique<Window>(nullptr)); |
- top_level->SetType(ui::wm::WINDOW_TYPE_NORMAL); |
- top_level->Init(ui::LAYER_NOT_DRAWN); |
- top_level->SetBounds(gfx::Rect(0, 0, 100, 100)); |
- top_level->Show(); |
+ WindowTreeHostMus window_tree_host( |
+ CreateInitParamsForTopLevel(window_tree_client_impl())); |
+ Window* top_level = window_tree_host.window(); |
+ 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()); |
// Start a pointer watcher for all events excluding move events. |
window_tree_client_impl()->StartPointerWatcher(false /* want_moves */); |
@@ -1130,7 +1280,7 @@ TEST_F(WindowTreeClientPointerObserverTest, |
ui::ET_POINTER_DOWN, gfx::Point(), gfx::Point(), ui::EF_CONTROL_DOWN, 0, |
ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 1), |
base::TimeTicks::Now())); |
- window_tree_client()->OnWindowInputEvent(1, server_id(top_level.get()), 0, |
+ window_tree_client()->OnWindowInputEvent(1, server_id(top_level), 0, |
std::move(pointer_event_down), true); |
// Delegate sensed the event. |