| Index: components/mus/ws/window_manager_state_unittest.cc
|
| diff --git a/components/mus/ws/window_manager_state_unittest.cc b/components/mus/ws/window_manager_state_unittest.cc
|
| index c803d0ffc4d84fa016a171fac965b3c47a202949..0f2f94f4f426b0efc532df02ed43106f8d6655a0 100644
|
| --- a/components/mus/ws/window_manager_state_unittest.cc
|
| +++ b/components/mus/ws/window_manager_state_unittest.cc
|
| @@ -38,7 +38,7 @@ class WindowManagerStateTest : public testing::Test {
|
|
|
| scoped_ptr<Accelerator> CreateAccelerator();
|
|
|
| - // Creates a child |server_window| with associataed |window_tree| and
|
| + // Creates a child |server_window| with associated |window_tree| and
|
| // |test_client|. The window is setup for processing input.
|
| void CreateSecondaryTree(TestWindowTreeClient** test_client,
|
| WindowTree** window_tree,
|
| @@ -51,7 +51,9 @@ class WindowManagerStateTest : public testing::Test {
|
| void OnEventAckTimeout();
|
|
|
| WindowTree* tree() { return tree_; }
|
| - ServerWindow* window() { return window_; }
|
| + WindowServer* window_server() { return window_server_.get(); }
|
| + ServerWindow* target_window() { return target_window_; }
|
| + TestWindowTreeClient* target_window_client() { return target_window_client_; }
|
| TestWindowManager* window_manager() { return &window_manager_; }
|
| TestWindowTreeClient* wm_client() { return wm_client_; }
|
| WindowManagerState* window_manager_state() { return window_manager_state_; }
|
| @@ -82,9 +84,14 @@ class WindowManagerStateTest : public testing::Test {
|
| scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
|
| TestPlatformDisplayFactory platform_display_factory_;
|
| TestWindowManager window_manager_;
|
| - ServerWindow* window_;
|
| + // Test window created as a child of the window manager window.
|
| + ServerWindow* target_window_;
|
| + // TestWindowTreeClient for |target_window_|.
|
| + TestWindowTreeClient* target_window_client_;
|
| // Needed to Bind to |wm_client_|
|
| base::MessageLoop message_loop_;
|
| + // Needed for hit testing.
|
| + scoped_refptr<SurfacesState> surfaces_state_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest);
|
| };
|
| @@ -92,7 +99,8 @@ class WindowManagerStateTest : public testing::Test {
|
| WindowManagerStateTest::WindowManagerStateTest()
|
| : cursor_id_(0),
|
| task_runner_(new base::TestSimpleTaskRunner),
|
| - platform_display_factory_(&cursor_id_) {}
|
| + platform_display_factory_(&cursor_id_),
|
| + surfaces_state_(new SurfacesState()) {}
|
|
|
| scoped_ptr<Accelerator> WindowManagerStateTest::CreateAccelerator() {
|
| mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher(
|
| @@ -108,7 +116,7 @@ void WindowManagerStateTest::CreateSecondaryTree(
|
| TestWindowTreeClient** test_client,
|
| WindowTree** window_tree,
|
| ServerWindow** server_window) {
|
| - WindowTree* tree1 = window_server_->GetTreeWithRoot(window_);
|
| + WindowTree* tree1 = window_server_->GetTreeWithRoot(target_window_);
|
| ASSERT_TRUE(tree1 != nullptr);
|
| ASSERT_NE(tree1, tree());
|
|
|
| @@ -118,9 +126,9 @@ void WindowManagerStateTest::CreateSecondaryTree(
|
| ServerWindow* child1 = tree1->GetWindowByClientId(child1_id);
|
| ASSERT_TRUE(child1);
|
| ClientWindowId window_id;
|
| - tree1->IsWindowKnown(window_, &window_id);
|
| + tree1->IsWindowKnown(target_window_, &window_id);
|
| EXPECT_TRUE(tree1->AddWindow(window_id, child1_id));
|
| - tree1->GetDisplay(window_)->AddActivationParent(window_);
|
| + tree1->GetDisplay(target_window_)->AddActivationParent(target_window_);
|
|
|
| child1->SetVisible(true);
|
| child1->SetBounds(gfx::Rect(20, 20, 20, 20));
|
| @@ -154,10 +162,11 @@ void WindowManagerStateTest::SetUp() {
|
| message_loop_.SetTaskRunner(task_runner_);
|
|
|
| PlatformDisplay::set_factory_for_testing(&platform_display_factory_);
|
| - window_server_.reset(new WindowServer(&window_server_delegate_,
|
| - scoped_refptr<SurfacesState>()));
|
| + window_server_.reset(
|
| + new WindowServer(&window_server_delegate_, surfaces_state_));
|
|
|
| PlatformDisplayInitParams display_init_params;
|
| + display_init_params.surfaces_state = surfaces_state_;
|
| display_ = new Display(window_server_.get(), display_init_params);
|
| display_binding_ = new TestDisplayBinding(display_, window_server_.get());
|
| display_->Init(make_scoped_ptr(display_binding_));
|
| @@ -176,13 +185,16 @@ void WindowManagerStateTest::SetUp() {
|
|
|
| EXPECT_TRUE(tree_->SetWindowVisibility(embed_window_id, true));
|
| EXPECT_TRUE(tree_->AddWindow(root_id, embed_window_id));
|
| - display_->root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
|
| + display_->root_window()->SetBounds(gfx::Rect(0, 0, 1024, 768));
|
| mojom::WindowTreeClientPtr client;
|
| mojom::WindowTreeClientRequest client_request = GetProxy(&client);
|
| wm_client_->Bind(std::move(client_request));
|
| tree_->Embed(embed_window_id, std::move(client));
|
| - window_ = tree_->GetWindowByClientId(embed_window_id);
|
| - window_->SetBounds(gfx::Rect(0, 0, 50, 50));
|
| + target_window_ = tree_->GetWindowByClientId(embed_window_id);
|
| + target_window_->SetBounds(gfx::Rect(10, 10, 50, 50));
|
| + EnableHitTest(target_window_);
|
| + target_window_client_ = window_server_delegate_.last_client();
|
| + target_window_client_->tracker()->changes()->clear();
|
|
|
| WindowTreeTestApi(tree_).set_window_manager_internal(&window_manager_);
|
| wm_client_->tracker()->changes()->clear();
|
| @@ -194,7 +206,7 @@ TEST_F(WindowManagerStateTest, NullAccelerator) {
|
| WindowManagerState* state = window_manager_state();
|
| EXPECT_TRUE(state);
|
|
|
| - ServerWindow* target = window();
|
| + ServerWindow* target = target_window();
|
| ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
|
| DispatchInputEventToWindow(target, true, key, nullptr);
|
| WindowTree* target_tree = tree();
|
| @@ -203,7 +215,7 @@ TEST_F(WindowManagerStateTest, NullAccelerator) {
|
| EXPECT_EQ("InputEvent window=1,1 event_action=1",
|
| ChangesToDescription1(*tracker->changes())[0]);
|
|
|
| - state->OnEventAck(target_tree, false);
|
| + state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED);
|
| EXPECT_FALSE(window_manager()->on_accelerator_called());
|
| }
|
|
|
| @@ -213,14 +225,14 @@ TEST_F(WindowManagerStateTest, PostTargetAccelerator) {
|
| ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
|
| scoped_ptr<Accelerator> accelerator = CreateAccelerator();
|
|
|
| - ServerWindow* target = window();
|
| + ServerWindow* target = target_window();
|
| DispatchInputEventToWindow(target, true, key, accelerator.get());
|
| TestChangeTracker* tracker = wm_client()->tracker();
|
| EXPECT_EQ(1u, tracker->changes()->size());
|
| EXPECT_EQ("InputEvent window=1,1 event_action=1",
|
| ChangesToDescription1(*tracker->changes())[0]);
|
|
|
| - window_manager_state()->OnEventAck(tree(), false);
|
| + window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED);
|
| EXPECT_TRUE(window_manager()->on_accelerator_called());
|
| EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
|
| }
|
| @@ -231,14 +243,14 @@ TEST_F(WindowManagerStateTest, ClientHandlesEvent) {
|
| ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
|
| scoped_ptr<Accelerator> accelerator = CreateAccelerator();
|
|
|
| - ServerWindow* target = window();
|
| + ServerWindow* target = target_window();
|
| DispatchInputEventToWindow(target, true, key, accelerator.get());
|
| TestChangeTracker* tracker = wm_client()->tracker();
|
| EXPECT_EQ(1u, tracker->changes()->size());
|
| EXPECT_EQ("InputEvent window=1,1 event_action=1",
|
| ChangesToDescription1(*tracker->changes())[0]);
|
|
|
| - window_manager_state()->OnEventAck(tree(), true);
|
| + window_manager_state()->OnEventAck(tree(), mojom::EventResult::HANDLED);
|
| EXPECT_FALSE(window_manager()->on_accelerator_called());
|
| }
|
|
|
| @@ -248,7 +260,7 @@ TEST_F(WindowManagerStateTest, AcceleratorDeleted) {
|
| ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
|
| scoped_ptr<Accelerator> accelerator(CreateAccelerator());
|
|
|
| - ServerWindow* target = window();
|
| + ServerWindow* target = target_window();
|
| DispatchInputEventToWindow(target, true, key, accelerator.get());
|
| TestChangeTracker* tracker = wm_client()->tracker();
|
| EXPECT_EQ(1u, tracker->changes()->size());
|
| @@ -256,7 +268,7 @@ TEST_F(WindowManagerStateTest, AcceleratorDeleted) {
|
| ChangesToDescription1(*tracker->changes())[0]);
|
|
|
| accelerator.reset();
|
| - window_manager_state()->OnEventAck(tree(), false);
|
| + window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED);
|
| EXPECT_FALSE(window_manager()->on_accelerator_called());
|
| }
|
|
|
| @@ -268,7 +280,7 @@ TEST_F(WindowManagerStateTest, EnqueuedAccelerators) {
|
| ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
|
| scoped_ptr<Accelerator> accelerator(CreateAccelerator());
|
|
|
| - ServerWindow* target = window();
|
| + ServerWindow* target = target_window();
|
| DispatchInputEventToWindow(target, true, key, accelerator.get());
|
| TestChangeTracker* tracker = wm_client()->tracker();
|
| EXPECT_EQ(1u, tracker->changes()->size());
|
| @@ -288,7 +300,7 @@ TEST_F(WindowManagerStateTest, EnqueuedAccelerators) {
|
|
|
| WindowTree* target_tree = tree();
|
| WindowTreeTestApi(target_tree).ClearAck();
|
| - state->OnEventAck(target_tree, false);
|
| + state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED);
|
| EXPECT_EQ(1u, tracker->changes()->size());
|
| EXPECT_EQ("InputEvent window=1,1 event_action=1",
|
| ChangesToDescription1(*tracker->changes())[0]);
|
| @@ -301,7 +313,7 @@ TEST_F(WindowManagerStateTest, DeleteTree) {
|
| ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
|
| scoped_ptr<Accelerator> accelerator = CreateAccelerator();
|
|
|
| - ServerWindow* target = window();
|
| + ServerWindow* target = target_window();
|
| DispatchInputEventToWindow(target, true, key, accelerator.get());
|
| TestChangeTracker* tracker = wm_client()->tracker();
|
| EXPECT_EQ(1u, tracker->changes()->size());
|
| @@ -341,7 +353,7 @@ TEST_F(WindowManagerStateTest, DeleteNonRootTree) {
|
| TEST_F(WindowManagerStateTest, AckTimeout) {
|
| ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
|
| scoped_ptr<Accelerator> accelerator = CreateAccelerator();
|
| - DispatchInputEventToWindow(window(), true, key, accelerator.get());
|
| + DispatchInputEventToWindow(target_window(), true, key, accelerator.get());
|
| TestChangeTracker* tracker = wm_client()->tracker();
|
| EXPECT_EQ(1u, tracker->changes()->size());
|
| EXPECT_EQ("InputEvent window=1,1 event_action=1",
|
| @@ -352,6 +364,49 @@ TEST_F(WindowManagerStateTest, AckTimeout) {
|
| EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
|
| }
|
|
|
| +// Tests that when a window returns an event as unhandled that event is
|
| +// reposted.
|
| +TEST_F(WindowManagerStateTest, RepostEvent) {
|
| + window_manager_state()->SetCapture(target_window(), false);
|
| +
|
| + // Simulate a mouse release at a point outside of a target window. It will
|
| + // still process the event because it has capture.
|
| + ASSERT_EQ("10,10", target_window()->bounds().origin().ToString());
|
| + ui::PointerEvent mouse_event(ui::MouseEvent(
|
| + ui::ET_MOUSE_RELEASED, gfx::Point(5, 5), gfx::Point(5, 5),
|
| + base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
|
| + window_manager_state()->ProcessEvent(mouse_event);
|
| +
|
| + // The event was sent to the target window.
|
| + TestChangeTracker* tracker = target_window_client()->tracker();
|
| + ASSERT_EQ(1u, tracker->changes()->size());
|
| + const Change& change1 = (*tracker->changes())[0];
|
| + EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP),
|
| + change1.event_action);
|
| + // The event has window-local coordinates.
|
| + EXPECT_EQ("-5,-5", change1.event_location.ToString());
|
| +
|
| + window_manager_state()->SetCapture(nullptr, false);
|
| +
|
| + // Ack the event and request reposting. Do this at the window tree level
|
| + // instead of directly in window_manager_state() because otherwise the window
|
| + // tree won't know the original event was handled and it will queue the
|
| + // reposted event instead of dispatching it.
|
| + WindowTree* target_tree = window_server()->GetTreeWithRoot(target_window());
|
| + WindowTreeTestApi(target_tree)
|
| + .OnWindowInputEventAck(change1.event_id, mojom::EventResult::REPOST);
|
| +
|
| + // The event was reposted. Because its location was outside the target window
|
| + // bounds it was sent to the window manager.
|
| + TestChangeTracker* wm_tracker = wm_client()->tracker();
|
| + ASSERT_EQ(1u, wm_tracker->changes()->size());
|
| + const Change& change2 = (*wm_tracker->changes())[0];
|
| + EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP),
|
| + change2.event_action);
|
| + // The event has window-local coordinates.
|
| + EXPECT_EQ("5,5", change2.event_location.ToString());
|
| +}
|
| +
|
| } // namespace test
|
| } // namespace ws
|
| } // namespace mus
|
|
|