| Index: components/mus/ws/window_tree_unittest.cc
|
| diff --git a/components/mus/ws/window_tree_unittest.cc b/components/mus/ws/window_tree_unittest.cc
|
| index d985e6e5f2c8bcd8615d6e03762d74ba5fc5cca4..0bd503f76b3f0c3e6a988e4d61091a56f79f7850 100644
|
| --- a/components/mus/ws/window_tree_unittest.cc
|
| +++ b/components/mus/ws/window_tree_unittest.cc
|
| @@ -50,6 +50,19 @@ std::string WindowIdToString(const WindowId& id) {
|
| return base::StringPrintf("%d,%d", id.connection_id, id.window_id);
|
| }
|
|
|
| +ClientWindowId BuildClientWindowId(WindowTreeImpl* tree,
|
| + ConnectionSpecificId window_id) {
|
| + return ClientWindowId(WindowIdToTransportId(WindowId(tree->id(), window_id)));
|
| +}
|
| +
|
| +ClientWindowId ClientWindowIdForWindow(WindowTreeImpl* tree,
|
| + const ServerWindow* window) {
|
| + ClientWindowId client_window_id;
|
| + // If window isn't known we'll return 0, which should then error out.
|
| + tree->IsWindowKnown(window, &client_window_id);
|
| + return client_window_id;
|
| +}
|
| +
|
| class TestWindowManagerInternal : public mojom::WindowManagerInternal {
|
| public:
|
| TestWindowManagerInternal()
|
| @@ -379,6 +392,13 @@ const ServerWindow* FirstRoot(WindowTreeImpl* connection) {
|
| : nullptr;
|
| }
|
|
|
| +ClientWindowId FirstRootId(WindowTreeImpl* connection) {
|
| + return connection->roots().size() == 1u
|
| + ? ClientWindowIdForWindow(connection,
|
| + *(connection->roots().begin()))
|
| + : ClientWindowId();
|
| +}
|
| +
|
| } // namespace
|
|
|
| // -----------------------------------------------------------------------------
|
| @@ -477,16 +497,19 @@ class WindowTreeTest : public testing::Test {
|
| DISALLOW_COPY_AND_ASSIGN(WindowTreeTest);
|
| };
|
|
|
| +// Creates a new window in wm_connection(), adds it to the root, embeds a
|
| +// new client in the window and creates a child of said window. |window| is
|
| +// set to the child of |window_tree_connection| that is created.
|
| void WindowTreeTest::SetupEventTargeting(
|
| TestWindowTreeClient** out_client,
|
| WindowTreeImpl** window_tree_connection,
|
| ServerWindow** window) {
|
| - const WindowId embed_window_id(wm_connection()->id(), 1);
|
| + const ClientWindowId embed_window_id =
|
| + BuildClientWindowId(wm_connection(), 1);
|
| EXPECT_TRUE(
|
| wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties()));
|
| EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true));
|
| - ASSERT_TRUE(FirstRoot(wm_connection()));
|
| - EXPECT_TRUE(wm_connection()->AddWindow(FirstRoot(wm_connection())->id(),
|
| + EXPECT_TRUE(wm_connection()->AddWindow(FirstRootId(wm_connection()),
|
| embed_window_id));
|
| host_connection()->window_tree_host()->root_window()->SetBounds(
|
| gfx::Rect(0, 0, 100, 100));
|
| @@ -498,25 +521,26 @@ void WindowTreeTest::SetupEventTargeting(
|
| wm_connection()->Embed(embed_window_id, std::move(client),
|
| mojom::WindowTree::kAccessPolicyDefault,
|
| &connection_id);
|
| - WindowTreeImpl* connection1 = connection_manager()->GetConnectionWithRoot(
|
| - GetWindowById(embed_window_id));
|
| + ServerWindow* embed_window =
|
| + wm_connection()->GetWindowByClientId(embed_window_id);
|
| + WindowTreeImpl* connection1 =
|
| + connection_manager()->GetConnectionWithRoot(embed_window);
|
| ASSERT_TRUE(connection1 != nullptr);
|
| ASSERT_NE(connection1, wm_connection());
|
|
|
| - connection_manager()
|
| - ->GetWindow(embed_window_id)
|
| - ->SetBounds(gfx::Rect(0, 0, 50, 50));
|
| + embed_window->SetBounds(gfx::Rect(0, 0, 50, 50));
|
|
|
| - const WindowId child1(connection1->id(), 1);
|
| - EXPECT_TRUE(connection1->NewWindow(child1, ServerWindow::Properties()));
|
| - EXPECT_TRUE(connection1->AddWindow(embed_window_id, child1));
|
| - connection1->GetHost(GetWindowById(embed_window_id))
|
| - ->AddActivationParent(WindowIdToTransportId(embed_window_id));
|
| + const ClientWindowId child1_id(BuildClientWindowId(connection1, 1));
|
| + EXPECT_TRUE(connection1->NewWindow(child1_id, ServerWindow::Properties()));
|
| + ServerWindow* child1 = connection1->GetWindowByClientId(child1_id);
|
| + ASSERT_TRUE(child1);
|
| + EXPECT_TRUE(connection1->AddWindow(
|
| + ClientWindowIdForWindow(connection1, embed_window), child1_id));
|
| + connection1->GetHost(embed_window)->AddActivationParent(embed_window_id.id);
|
|
|
| - ServerWindow* v1 = connection1->GetWindow(child1);
|
| - v1->SetVisible(true);
|
| - v1->SetBounds(gfx::Rect(20, 20, 20, 20));
|
| - EnableHitTest(v1);
|
| + child1->SetVisible(true);
|
| + child1->SetBounds(gfx::Rect(20, 20, 20, 20));
|
| + EnableHitTest(child1);
|
|
|
| TestWindowTreeClient* embed_connection = last_window_tree_client();
|
| embed_connection->tracker()->changes()->clear();
|
| @@ -524,18 +548,22 @@ void WindowTreeTest::SetupEventTargeting(
|
|
|
| *out_client = embed_connection;
|
| *window_tree_connection = connection1;
|
| - *window = v1;
|
| + *window = child1;
|
| }
|
|
|
| // Verifies focus correctly changes on pointer events.
|
| TEST_F(WindowTreeTest, FocusOnPointer) {
|
| - const WindowId embed_window_id(wm_connection()->id(), 1);
|
| + const ClientWindowId embed_window_id =
|
| + BuildClientWindowId(wm_connection(), 1);
|
| EXPECT_TRUE(
|
| wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties()));
|
| + ServerWindow* embed_window =
|
| + wm_connection()->GetWindowByClientId(embed_window_id);
|
| + ASSERT_TRUE(embed_window);
|
| EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true));
|
| ASSERT_TRUE(FirstRoot(wm_connection()));
|
| - EXPECT_TRUE(wm_connection()->AddWindow(FirstRoot(wm_connection())->id(),
|
| - embed_window_id));
|
| + const ClientWindowId wm_root_id = FirstRootId(wm_connection());
|
| + EXPECT_TRUE(wm_connection()->AddWindow(wm_root_id, embed_window_id));
|
| host_connection()->window_tree_host()->root_window()->SetBounds(
|
| gfx::Rect(0, 0, 100, 100));
|
| mojom::WindowTreeClientPtr client;
|
| @@ -546,22 +574,22 @@ TEST_F(WindowTreeTest, FocusOnPointer) {
|
| wm_connection()->Embed(embed_window_id, std::move(client),
|
| mojom::WindowTree::kAccessPolicyDefault,
|
| &connection_id);
|
| - WindowTreeImpl* connection1 = connection_manager()->GetConnectionWithRoot(
|
| - GetWindowById(embed_window_id));
|
| + WindowTreeImpl* connection1 =
|
| + connection_manager()->GetConnectionWithRoot(embed_window);
|
| ASSERT_TRUE(connection1 != nullptr);
|
| ASSERT_NE(connection1, wm_connection());
|
|
|
| - connection_manager()
|
| - ->GetWindow(embed_window_id)
|
| - ->SetBounds(gfx::Rect(0, 0, 50, 50));
|
| + embed_window->SetBounds(gfx::Rect(0, 0, 50, 50));
|
|
|
| - const WindowId child1(connection1->id(), 1);
|
| - EXPECT_TRUE(connection1->NewWindow(child1, ServerWindow::Properties()));
|
| - EXPECT_TRUE(connection1->AddWindow(embed_window_id, child1));
|
| - ServerWindow* v1 = connection1->GetWindow(child1);
|
| - v1->SetVisible(true);
|
| - v1->SetBounds(gfx::Rect(20, 20, 20, 20));
|
| - EnableHitTest(v1);
|
| + const ClientWindowId child1_id(BuildClientWindowId(connection1, 1));
|
| + EXPECT_TRUE(connection1->NewWindow(child1_id, ServerWindow::Properties()));
|
| + EXPECT_TRUE(connection1->AddWindow(
|
| + ClientWindowIdForWindow(connection1, embed_window), child1_id));
|
| + ServerWindow* child1 = connection1->GetWindowByClientId(child1_id);
|
| + ASSERT_TRUE(child1);
|
| + child1->SetVisible(true);
|
| + child1->SetBounds(gfx::Rect(20, 20, 20, 20));
|
| + EnableHitTest(child1);
|
|
|
| TestWindowTreeClient* connection1_client = last_window_tree_client();
|
| connection1_client->tracker()->changes()->clear();
|
| @@ -570,19 +598,18 @@ TEST_F(WindowTreeTest, FocusOnPointer) {
|
| // Focus should not go to |child1| yet, since the parent still doesn't allow
|
| // active children.
|
| DispatchEventAndAckImmediately(CreatePointerDownEvent(21, 22));
|
| - WindowTreeHostImpl* host1 =
|
| - connection1->GetHost(GetWindowById(embed_window_id));
|
| + WindowTreeHostImpl* host1 = connection1->GetHost(embed_window);
|
| EXPECT_EQ(nullptr, host1->GetFocusedWindow());
|
| DispatchEventAndAckImmediately(CreatePointerUpEvent(21, 22));
|
| connection1_client->tracker()->changes()->clear();
|
| wm_client()->tracker()->changes()->clear();
|
|
|
| - host1->AddActivationParent(WindowIdToTransportId(embed_window_id));
|
| + host1->AddActivationParent(embed_window_id.id);
|
|
|
| // Focus should go to child1. This result in notifying both the window
|
| // manager and client connection being notified.
|
| DispatchEventAndAckImmediately(CreatePointerDownEvent(21, 22));
|
| - EXPECT_EQ(v1, host1->GetFocusedWindow());
|
| + EXPECT_EQ(child1, host1->GetFocusedWindow());
|
| ASSERT_GE(wm_client()->tracker()->changes()->size(), 1u);
|
| EXPECT_EQ("Focused id=2,1",
|
| ChangesToDescription1(*wm_client()->tracker()->changes())[0]);
|
| @@ -598,7 +625,7 @@ TEST_F(WindowTreeTest, FocusOnPointer) {
|
| // Press outside of the embedded window. Note that root cannot be focused
|
| // (because it cannot be activated). So the focus would not move in this case.
|
| DispatchEventAndAckImmediately(CreatePointerDownEvent(61, 22));
|
| - EXPECT_EQ(v1, host_connection()->window_tree_host()->GetFocusedWindow());
|
| + EXPECT_EQ(child1, host_connection()->window_tree_host()->GetFocusedWindow());
|
|
|
| DispatchEventAndAckImmediately(CreatePointerUpEvent(21, 22));
|
| wm_client()->tracker()->changes()->clear();
|
| @@ -607,7 +634,7 @@ TEST_F(WindowTreeTest, FocusOnPointer) {
|
| // Press in the same location. Should not get a focus change event (only input
|
| // event).
|
| DispatchEventAndAckImmediately(CreatePointerDownEvent(61, 22));
|
| - EXPECT_EQ(v1, host_connection()->window_tree_host()->GetFocusedWindow());
|
| + EXPECT_EQ(child1, host_connection()->window_tree_host()->GetFocusedWindow());
|
| ASSERT_EQ(wm_client()->tracker()->changes()->size(), 1u)
|
| << SingleChangeToDescription(*wm_client()->tracker()->changes());
|
| EXPECT_EQ("InputEvent window=0,2 event_action=4",
|
| @@ -749,39 +776,39 @@ TEST_F(WindowTreeTest, WindowReorderingChangesCursor) {
|
| &embed_connection, &window_tree_connection, &window1));
|
|
|
| // Create a second window right over the first.
|
| - const WindowId embed_window_id(wm_connection()->id(), 1);
|
| - const WindowId child2(window_tree_connection->id(), 2);
|
| + const ClientWindowId embed_window_id(FirstRootId(window_tree_connection));
|
| + const ClientWindowId child2_id(
|
| + BuildClientWindowId(window_tree_connection, 2));
|
| EXPECT_TRUE(
|
| - window_tree_connection->NewWindow(child2, ServerWindow::Properties()));
|
| - EXPECT_TRUE(window_tree_connection->AddWindow(embed_window_id, child2));
|
| - window_tree_connection->GetHost(
|
| - GetWindowById(WindowId(wm_connection()->id(), 1)))
|
| - ->AddActivationParent(WindowIdToTransportId(embed_window_id));
|
| - ServerWindow* window2 = window_tree_connection->GetWindow(child2);
|
| - window2->SetVisible(true);
|
| - window2->SetBounds(gfx::Rect(20, 20, 20, 20));
|
| - EnableHitTest(window2);
|
| + window_tree_connection->NewWindow(child2_id, ServerWindow::Properties()));
|
| + ServerWindow* child2 = window_tree_connection->GetWindowByClientId(child2_id);
|
| + ASSERT_TRUE(child2);
|
| + EXPECT_TRUE(window_tree_connection->AddWindow(embed_window_id, child2_id));
|
| + child2->SetVisible(true);
|
| + child2->SetBounds(gfx::Rect(20, 20, 20, 20));
|
| + EnableHitTest(child2);
|
|
|
| // Give each window a different cursor.
|
| window1->SetPredefinedCursor(mojom::Cursor::IBEAM);
|
| - window2->SetPredefinedCursor(mojom::Cursor::HAND);
|
| + child2->SetPredefinedCursor(mojom::Cursor::HAND);
|
|
|
| // We expect window2 to be over window1 now.
|
| DispatchEventAndAckImmediately(CreateMouseMoveEvent(22, 22));
|
| EXPECT_EQ(mojom::Cursor::HAND, cursor_id());
|
|
|
| // But when we put window2 at the bottom, we should adapt window1's cursor.
|
| - window2->parent()->StackChildAtBottom(window2);
|
| + child2->parent()->StackChildAtBottom(child2);
|
| EXPECT_EQ(mojom::Cursor::IBEAM, cursor_id());
|
| }
|
|
|
| TEST_F(WindowTreeTest, EventAck) {
|
| - const WindowId embed_window_id(wm_connection()->id(), 1);
|
| + const ClientWindowId embed_window_id =
|
| + BuildClientWindowId(wm_connection(), 1);
|
| EXPECT_TRUE(
|
| wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties()));
|
| EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true));
|
| ASSERT_TRUE(FirstRoot(wm_connection()));
|
| - EXPECT_TRUE(wm_connection()->AddWindow(FirstRoot(wm_connection())->id(),
|
| + EXPECT_TRUE(wm_connection()->AddWindow(FirstRootId(wm_connection()),
|
| embed_window_id));
|
| host_connection()->window_tree_host()->root_window()->SetBounds(
|
| gfx::Rect(0, 0, 100, 100));
|
| @@ -821,10 +848,10 @@ TEST_F(WindowTreeTest, NewTopLevelWindow) {
|
| mojo::Map<mojo::String, mojo::Array<uint8_t>> properties;
|
| properties.mark_non_null();
|
| const uint32_t initial_change_id = 17;
|
| - const WindowId embed_window_id2_in_child(window_tree_connection->id(), 101);
|
| + // Explicitly use an id that does not contain the connection id.
|
| + const ClientWindowId embed_window_id2_in_child(45 << 16 | 27);
|
| static_cast<mojom::WindowTree*>(window_tree_connection)
|
| - ->NewTopLevelWindow(initial_change_id,
|
| - WindowIdToTransportId(embed_window_id2_in_child),
|
| + ->NewTopLevelWindow(initial_change_id, embed_window_id2_in_child.id,
|
| std::move(properties));
|
|
|
| // The binding should be paused until the wm acks the change.
|
| @@ -833,31 +860,36 @@ TEST_F(WindowTreeTest, NewTopLevelWindow) {
|
| EXPECT_TRUE(last_client_connection()->is_paused());
|
|
|
| // Create the window for |embed_window_id2_in_child|.
|
| - const WindowId embed_window_id2(wm_connection()->id(), 2);
|
| + const ClientWindowId embed_window_id2 =
|
| + BuildClientWindowId(wm_connection(), 2);
|
| EXPECT_TRUE(
|
| wm_connection()->NewWindow(embed_window_id2, ServerWindow::Properties()));
|
| - EXPECT_TRUE(wm_connection()->AddWindow(FirstRoot(wm_connection())->id(),
|
| + EXPECT_TRUE(wm_connection()->AddWindow(FirstRootId(wm_connection()),
|
| embed_window_id2));
|
|
|
| // Ack the change, which should resume the binding.
|
| static_cast<mojom::WindowManagerInternalClient*>(wm_connection())
|
| - ->OnWmCreatedTopLevelWindow(wm_change_id,
|
| - WindowIdToTransportId(embed_window_id2));
|
| + ->OnWmCreatedTopLevelWindow(wm_change_id, embed_window_id2.id);
|
| EXPECT_FALSE(last_client_connection()->is_paused());
|
| EXPECT_EQ("TopLevelCreated id=17 window_id=" +
|
| - WindowIdToString(embed_window_id2_in_child),
|
| + WindowIdToString(
|
| + WindowIdFromTransportId(embed_window_id2_in_child.id)),
|
| SingleChangeToDescription(*embed_connection->tracker()->changes()));
|
| embed_connection->tracker()->changes()->clear();
|
|
|
| // Change the visibility of the window from the owner and make sure the
|
| // client sees the right id.
|
| - ServerWindow* embed_window = wm_connection()->GetWindow(embed_window_id2);
|
| + ServerWindow* embed_window =
|
| + wm_connection()->GetWindowByClientId(embed_window_id2);
|
| ASSERT_TRUE(embed_window);
|
| EXPECT_FALSE(embed_window->visible());
|
| - ASSERT_TRUE(wm_connection()->SetWindowVisibility(embed_window->id(), true));
|
| + ASSERT_TRUE(wm_connection()->SetWindowVisibility(
|
| + ClientWindowIdForWindow(wm_connection(), embed_window), true));
|
| EXPECT_TRUE(embed_window->visible());
|
| EXPECT_EQ("VisibilityChanged window=" +
|
| - WindowIdToString(embed_window_id2_in_child) + " visible=true",
|
| + WindowIdToString(
|
| + WindowIdFromTransportId(embed_window_id2_in_child.id)) +
|
| + " visible=true",
|
| SingleChangeToDescription(*embed_connection->tracker()->changes()));
|
|
|
| // Set the visibility from the child using the client assigned id.
|
|
|