Index: components/mus/ws/window_tree_apptest.cc |
diff --git a/components/mus/ws/window_tree_apptest.cc b/components/mus/ws/window_tree_apptest.cc |
index 340aa41549f7dd71b8cf04f3ae1439fe4fa4546c..c28fb33e7b53c057ab9f43a915efed2ee34d6d79 100644 |
--- a/components/mus/ws/window_tree_apptest.cc |
+++ b/components/mus/ws/window_tree_apptest.cc |
@@ -129,7 +129,8 @@ class TestWindowTreeClientImpl : public mojom::WindowTreeClient, |
// want. |
next_change_id_(10000), |
waiting_change_id_(0), |
- on_change_completed_result_(false) { |
+ on_change_completed_result_(false), |
+ track_root_bounds_changes_(false) { |
tracker_.set_delegate(this); |
} |
@@ -139,6 +140,14 @@ class TestWindowTreeClientImpl : public mojom::WindowTreeClient, |
mojom::WindowTree* tree() { return tree_.get(); } |
TestChangeTracker* tracker() { return &tracker_; } |
+ Id root_window_id() const { return root_window_id_; } |
+ |
+ // Sets whether changes to the bounds of the root should be tracked. Normally |
+ // they are ignored (as during startup we often times get random size |
+ // changes). |
+ void set_track_root_bounds_changes(bool value) { |
+ track_root_bounds_changes_ = value; |
+ } |
// Runs a nested MessageLoop until |count| changes (calls to |
// WindowTreeClient functions) have been received. |
@@ -222,8 +231,6 @@ class TestWindowTreeClientImpl : public mojom::WindowTreeClient, |
return WaitForChangeCompleted(change_id) ? id : 0; |
} |
- void set_root_window(Id root_window_id) { root_window_id_ = root_window_id; } |
- |
bool SetWindowProperty(Id window_id, |
const std::string& name, |
const std::vector<uint8_t>* data) { |
@@ -272,6 +279,8 @@ class TestWindowTreeClientImpl : public mojom::WindowTreeClient, |
Id focused_window_id, |
uint32_t access_policy) override { |
// TODO(sky): add coverage of |focused_window_id|. |
+ ASSERT_TRUE(root); |
+ root_window_id_ = root->window_id; |
tree_ = std::move(tree); |
connection_id_ = connection_id; |
tracker()->OnEmbed(connection_id, std::move(root)); |
@@ -292,7 +301,7 @@ class TestWindowTreeClientImpl : public mojom::WindowTreeClient, |
// The bounds of the root may change during startup on Android at random |
// times. As this doesn't matter, and shouldn't impact test exepctations, |
// it is ignored. |
- if (window_id == root_window_id_) |
+ if (window_id == root_window_id_ && !track_root_bounds_changes_) |
return; |
tracker()->OnWindowBoundsChanged(window_id, std::move(old_bounds), |
std::move(new_bounds)); |
@@ -381,6 +390,7 @@ class TestWindowTreeClientImpl : public mojom::WindowTreeClient, |
uint32_t next_change_id_; |
uint32_t waiting_change_id_; |
bool on_change_completed_result_; |
+ bool track_root_bounds_changes_; |
scoped_ptr<base::RunLoop> change_completed_run_loop_; |
DISALLOW_COPY_AND_ASSIGN(TestWindowTreeClientImpl); |
@@ -458,7 +468,6 @@ class WindowTreeAppTest : public mojo::test::ApplicationTestBase, |
EstablishConnectionViaEmbed(ws1(), root_id, &connection_id_2_); |
ASSERT_GT(connection_id_2_, 0); |
ASSERT_TRUE(ws_client2_.get() != nullptr); |
- ws_client2_->set_root_window(root_window_id_); |
} |
void EstablishSecondConnection(bool create_initial_window) { |
@@ -480,7 +489,6 @@ class WindowTreeAppTest : public mojo::test::ApplicationTestBase, |
ASSERT_TRUE(ws_client3_.get() == nullptr); |
ws_client3_ = EstablishConnectionViaEmbed(owner, root_id, nullptr); |
ASSERT_TRUE(ws_client3_.get() != nullptr); |
- ws_client3_->set_root_window(root_window_id_); |
} |
scoped_ptr<TestWindowTreeClientImpl> WaitForWindowTreeClient() { |
@@ -551,7 +559,7 @@ class WindowTreeAppTest : public mojo::test::ApplicationTestBase, |
connection_id_1_ = (*changes1())[0].connection_id; |
ASSERT_FALSE((*changes1())[0].windows.empty()); |
root_window_id_ = (*changes1())[0].windows[0].window_id; |
- ws_client1_->set_root_window(root_window_id_); |
+ ASSERT_EQ(root_window_id_, ws_client1_->root_window_id()); |
changes1()->clear(); |
} |
@@ -649,8 +657,7 @@ TEST_F(WindowTreeAppTest, WindowsRemovedWhenEmbedding) { |
{ |
std::vector<TestWindow> windows; |
GetWindowTree(ws3(), window_2_3, &windows); |
- EXPECT_EQ(WindowParentToString(window_2_3, kNullParentId), |
- SingleWindowDescription(windows)); |
+ EXPECT_EQ("no windows", SingleWindowDescription(windows)); |
} |
} |
@@ -668,7 +675,8 @@ TEST_F(WindowTreeAppTest, CantAccessChildrenOfEmbeddedWindow) { |
Id window_3_3 = ws_client3()->NewWindow(3); |
ASSERT_TRUE(window_3_3); |
- ASSERT_TRUE(ws_client3()->AddWindow(window_2_2, window_3_3)); |
+ ASSERT_TRUE( |
+ ws_client3()->AddWindow(ws_client3()->root_window_id(), window_3_3)); |
// Even though 3 is a child of 2 connection 2 can't see 3 as it's from a |
// different connection. |
@@ -693,10 +701,13 @@ TEST_F(WindowTreeAppTest, CantAccessChildrenOfEmbeddedWindow) { |
ASSERT_EQ(3u, windows.size()); |
EXPECT_EQ(WindowParentToString(window_1_1, kNullParentId), |
windows[0].ToString()); |
- EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), |
- windows[1].ToString()); |
- EXPECT_EQ(WindowParentToString(window_3_3, window_2_2), |
- windows[2].ToString()); |
+ // NOTE: we expect a match of WindowParentToString(window_2_2, window_1_1), |
+ // but the ids are in the id space of client2, which is not the same as |
+ // the id space of ws1(). |
+ EXPECT_EQ("window=2,1 parent=1,1", windows[1].ToString()); |
+ // Same thing here, we really want to test for |
+ // WindowParentToString(window_3_3, window_2_2). |
+ EXPECT_EQ("window=3,1 parent=2,1", windows[2].ToString()); |
} |
} |
@@ -705,24 +716,24 @@ TEST_F(WindowTreeAppTest, CantModifyChildrenOfEmbeddedWindow) { |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- Id window_2_2 = ws_client2()->NewWindow(2); |
- ASSERT_TRUE(window_2_2); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
+ ASSERT_TRUE(window_2_1); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
- ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1)); |
- Id window_2_3 = ws_client2()->NewWindow(3); |
- ASSERT_TRUE(window_2_3); |
+ Id window_2_2 = ws_client2()->NewWindow(2); |
+ ASSERT_TRUE(window_2_2); |
// Connection 2 shouldn't be able to add anything to the window anymore. |
- ASSERT_FALSE(ws_client2()->AddWindow(window_2_2, window_2_3)); |
+ ASSERT_FALSE(ws_client2()->AddWindow(window_2_1, window_2_2)); |
// Create window 3 in connection 3 and add it to window 3. |
- Id window_3_3 = ws_client3()->NewWindow(3); |
- ASSERT_TRUE(window_3_3); |
- ASSERT_TRUE(ws_client3()->AddWindow(window_2_2, window_3_3)); |
+ Id window_3_1 = ws_client3()->NewWindow(1); |
+ ASSERT_TRUE(window_3_1); |
+ ASSERT_TRUE(ws_client3()->AddWindow(window_2_1, window_3_1)); |
// Connection 2 shouldn't be able to remove window 3. |
- ASSERT_FALSE(ws_client2()->RemoveWindowFromParent(window_3_3)); |
+ ASSERT_FALSE(ws_client2()->RemoveWindowFromParent(window_3_1)); |
} |
// Verifies client gets a valid id. |
@@ -743,12 +754,14 @@ TEST_F(WindowTreeAppTest, NewWindow) { |
// Verifies AddWindow fails when window is already in position. |
TEST_F(WindowTreeAppTest, AddWindowWithNoChange) { |
+ // Create the embed point now so that the ids line up. |
+ ASSERT_TRUE(ws_client1()->NewWindow(1)); |
Id window_1_2 = ws_client1()->NewWindow(2); |
Id window_1_3 = ws_client1()->NewWindow(3); |
ASSERT_TRUE(window_1_2); |
ASSERT_TRUE(window_1_3); |
- ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false)); |
// Make 3 a child of 2. |
ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_3)); |
@@ -759,12 +772,14 @@ TEST_F(WindowTreeAppTest, AddWindowWithNoChange) { |
// Verifies AddWindow fails when window is already in position. |
TEST_F(WindowTreeAppTest, AddAncestorFails) { |
+ // Create the embed point now so that the ids line up. |
+ ASSERT_TRUE(ws_client1()->NewWindow(1)); |
Id window_1_2 = ws_client1()->NewWindow(2); |
Id window_1_3 = ws_client1()->NewWindow(3); |
ASSERT_TRUE(window_1_2); |
ASSERT_TRUE(window_1_3); |
- ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false)); |
// Make 3 a child of 2. |
ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_3)); |
@@ -775,13 +790,15 @@ TEST_F(WindowTreeAppTest, AddAncestorFails) { |
// Verifies adding to root sends right notifications. |
TEST_F(WindowTreeAppTest, AddToRoot) { |
+ // Create the embed point now so that the ids line up. |
+ Id window_1_1 = ws_client1()->NewWindow(1); |
+ ASSERT_TRUE(window_1_1); |
Id window_1_21 = ws_client1()->NewWindow(21); |
Id window_1_3 = ws_client1()->NewWindow(3); |
ASSERT_TRUE(window_1_21); |
ASSERT_TRUE(window_1_3); |
- Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false)); |
changes2()->clear(); |
// Make 3 a child of 21. |
@@ -799,6 +816,8 @@ TEST_F(WindowTreeAppTest, AddToRoot) { |
// Verifies HierarchyChanged is correctly sent for various adds/removes. |
TEST_F(WindowTreeAppTest, WindowHierarchyChangedWindows) { |
+ // Create the embed point now so that the ids line up. |
+ Id window_1_1 = ws_client1()->NewWindow(1); |
// 1,2->1,11. |
Id window_1_2 = ws_client1()->NewWindow(2); |
ASSERT_TRUE(window_1_2); |
@@ -808,8 +827,7 @@ TEST_F(WindowTreeAppTest, WindowHierarchyChangedWindows) { |
ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_11, true)); |
ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_11)); |
- Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false)); |
ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_1, true)); |
ASSERT_TRUE(ws_client2()->WaitForAllMessages()); |
@@ -892,8 +910,10 @@ TEST_F(WindowTreeAppTest, WindowHierarchyChangedAddingKnownToUnknown) { |
ASSERT_TRUE(ws_client2()->RemoveWindowFromParent(window_2_11)); |
ws_client1_->WaitForChangeCount(1); |
- EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_11) + |
- " new_parent=null old_parent=" + IdToString(window_1_1), |
+ // 2,1 should be IdToString(window_2_11), but window_2_11 is in the id |
+ // space of client2, not client1. |
+ EXPECT_EQ("HierarchyChanged window=2,1 new_parent=null old_parent=" + |
+ IdToString(window_1_1), |
SingleChangeToDescription(*changes1())); |
} |
@@ -905,8 +925,11 @@ TEST_F(WindowTreeAppTest, WindowHierarchyChangedAddingKnownToUnknown) { |
EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + |
" new_parent=" + IdToString(window_1_1) + " old_parent=null", |
SingleChangeToDescription(*changes1())); |
- EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) + "],[" + |
- WindowParentToString(window_2_21, window_2_2) + "]", |
+ // "window=2,3 parent=2,2]" should be, |
+ // WindowParentToString(window_2_21, window_2_2), but isn't because of |
+ // differing id spaces. |
+ EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) + |
+ "],[window=2,3 parent=2,2]", |
ChangeWindowDescription(*changes1())); |
} |
} |
@@ -936,7 +959,8 @@ TEST_F(WindowTreeAppTest, ReorderWindow) { |
ASSERT_TRUE(ws_client2()->AddWindow(window_2_1, window_2_3)); |
ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_4)); |
ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_5)); |
- ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_2_1)); |
+ ASSERT_TRUE( |
+ ws_client2()->AddWindow(BuildWindowId(connection_id_1(), 1), window_2_1)); |
{ |
changes1()->clear(); |
@@ -986,15 +1010,15 @@ TEST_F(WindowTreeAppTest, ReorderWindow) { |
TEST_F(WindowTreeAppTest, DeleteWindow) { |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- Id window_2_2 = ws_client2()->NewWindow(2); |
- ASSERT_TRUE(window_2_2); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
+ ASSERT_TRUE(window_2_1); |
// Make 2 a child of 1. |
{ |
changes1()->clear(); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
ws_client1_->WaitForChangeCount(1); |
- EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + |
+ EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_1) + |
" new_parent=" + IdToString(window_1_1) + " old_parent=null", |
SingleChangeToDescription(*changes1())); |
} |
@@ -1003,11 +1027,11 @@ TEST_F(WindowTreeAppTest, DeleteWindow) { |
{ |
changes1()->clear(); |
changes2()->clear(); |
- ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_2)); |
+ ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_1)); |
EXPECT_TRUE(changes2()->empty()); |
ws_client1_->WaitForChangeCount(1); |
- EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2), |
+ EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_1), |
SingleChangeToDescription(*changes1())); |
} |
} |
@@ -1023,43 +1047,43 @@ TEST_F(WindowTreeAppTest, DeleteWindowFromAnotherConnectionDisallowed) { |
TEST_F(WindowTreeAppTest, ReuseDeletedWindowId) { |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- Id window_2_2 = ws_client2()->NewWindow(2); |
- ASSERT_TRUE(window_2_2); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
+ ASSERT_TRUE(window_2_1); |
// Add 2 to 1. |
{ |
changes1()->clear(); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
ws_client1_->WaitForChangeCount(1); |
- EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + |
+ EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_1) + |
" new_parent=" + IdToString(window_1_1) + " old_parent=null", |
SingleChangeToDescription(*changes1())); |
- EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) + "]", |
+ EXPECT_EQ("[" + WindowParentToString(window_2_1, window_1_1) + "]", |
ChangeWindowDescription(*changes1())); |
} |
// Delete 2. |
{ |
changes1()->clear(); |
- ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_2)); |
+ ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_1)); |
ws_client1_->WaitForChangeCount(1); |
- EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2), |
+ EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_1), |
SingleChangeToDescription(*changes1())); |
} |
// Create 2 again, and add it back to 1. Should get the same notification. |
- window_2_2 = ws_client2()->NewWindow(2); |
- ASSERT_TRUE(window_2_2); |
+ window_2_1 = ws_client2()->NewWindow(2); |
+ ASSERT_TRUE(window_2_1); |
{ |
changes1()->clear(); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
ws_client1_->WaitForChangeCount(1); |
- EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + |
+ EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_1) + |
" new_parent=" + IdToString(window_1_1) + " old_parent=null", |
SingleChangeToDescription(*changes1())); |
- EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) + "]", |
+ EXPECT_EQ("[" + WindowParentToString(window_2_1, window_1_1) + "]", |
ChangeWindowDescription(*changes1())); |
} |
} |
@@ -1076,12 +1100,12 @@ TEST_F(WindowTreeAppTest, GetWindowTree) { |
ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_11)); |
// Create two windows in second connection, 2 and 3, both children of 1. |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
Id window_2_2 = ws_client2()->NewWindow(2); |
- Id window_2_3 = ws_client2()->NewWindow(3); |
+ ASSERT_TRUE(window_2_1); |
ASSERT_TRUE(window_2_2); |
- ASSERT_TRUE(window_2_3); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_3)); |
// Verifies GetWindowTree() on the root. The root connection sees all. |
{ |
@@ -1094,9 +1118,9 @@ TEST_F(WindowTreeAppTest, GetWindowTree) { |
windows[1].ToString()); |
EXPECT_EQ(WindowParentToString(window_1_11, window_1_1), |
windows[2].ToString()); |
- EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), |
+ EXPECT_EQ(WindowParentToString(window_2_1, window_1_1), |
windows[3].ToString()); |
- EXPECT_EQ(WindowParentToString(window_2_3, window_1_1), |
+ EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), |
windows[4].ToString()); |
} |
@@ -1109,9 +1133,9 @@ TEST_F(WindowTreeAppTest, GetWindowTree) { |
ASSERT_EQ(3u, windows.size()); |
EXPECT_EQ(WindowParentToString(window_1_1, kNullParentId), |
windows[0].ToString()); |
- EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), |
+ EXPECT_EQ(WindowParentToString(window_2_1, window_1_1), |
windows[1].ToString()); |
- EXPECT_EQ(WindowParentToString(window_2_3, window_1_1), |
+ EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), |
windows[2].ToString()); |
} |
@@ -1132,6 +1156,8 @@ TEST_F(WindowTreeAppTest, SetWindowBounds) { |
changes2()->clear(); |
+ ws_client2_->set_track_root_bounds_changes(true); |
+ |
ws1()->SetWindowBounds(10, window_1_1, |
mojo::Rect::From(gfx::Rect(0, 0, 100, 100))); |
ASSERT_TRUE(ws_client1()->WaitForChangeCompleted(10)); |
@@ -1442,10 +1468,10 @@ TEST_F(WindowTreeAppTest, SetWindowVisibilityNotifications) { |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnectionWithRoot(window_1_2)); |
// Add 2,3 as a child of 1,2. |
- Id window_2_3 = ws_client2()->NewWindow(3); |
- ASSERT_TRUE(window_2_3); |
- ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_3, true)); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_2, window_2_3)); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
+ ASSERT_TRUE(window_2_1); |
+ ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_1, true)); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_2, window_2_1)); |
ASSERT_TRUE(ws_client1()->WaitForAllMessages()); |
changes2()->clear(); |
@@ -1490,11 +1516,11 @@ TEST_F(WindowTreeAppTest, SetWindowVisibilityNotifications) { |
// Change visibility of 2,3, connection 1 should see this. |
changes1()->clear(); |
- ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_3, false)); |
+ ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_1, false)); |
{ |
ws_client1_->WaitForChangeCount(1); |
EXPECT_EQ( |
- "VisibilityChanged window=" + IdToString(window_2_3) + " visible=false", |
+ "VisibilityChanged window=" + IdToString(window_2_1) + " visible=false", |
SingleChangeToDescription(*changes1())); |
} |
@@ -1571,13 +1597,13 @@ TEST_F(WindowTreeAppTest, OnEmbeddedAppDisconnected) { |
// Create connection 2 and 3. |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- Id window_2_2 = ws_client2()->NewWindow(2); |
- ASSERT_TRUE(window_2_2); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
+ ASSERT_TRUE(window_2_1); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
changes2()->clear(); |
- ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1)); |
- // Connection 1 should get a hierarchy change for window_2_2. |
+ // Connection 1 should get a hierarchy change for window_2_1. |
ws_client1_->WaitForChangeCount(1); |
changes1()->clear(); |
@@ -1585,11 +1611,11 @@ TEST_F(WindowTreeAppTest, OnEmbeddedAppDisconnected) { |
// be notified of this. |
ws_client3_.reset(); |
ws_client2_->WaitForChangeCount(1); |
- EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_2), |
+ EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_1), |
SingleChangeToDescription(*changes2())); |
ws_client1_->WaitForChangeCount(1); |
- EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_2), |
+ EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_1), |
SingleChangeToDescription(*changes1())); |
} |
@@ -1600,20 +1626,20 @@ TEST_F(WindowTreeAppTest, OnParentOfEmbedDisconnects) { |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1)); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
Id window_2_2 = ws_client2()->NewWindow(2); |
- Id window_2_3 = ws_client2()->NewWindow(3); |
+ ASSERT_TRUE(window_2_1); |
ASSERT_TRUE(window_2_2); |
- ASSERT_TRUE(window_2_3); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_2_2, window_2_3)); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_2_1, window_2_2)); |
changes2()->clear(); |
- ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_3)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2)); |
changes3()->clear(); |
// Close connection 2. Connection 3 should get a delete (for its root). |
ws_client2_.reset(); |
ws_client3_->WaitForChangeCount(1); |
- EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_3), |
+ EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2), |
SingleChangeToDescription(*changes3())); |
} |
@@ -1651,14 +1677,14 @@ TEST_F(WindowTreeAppTest, EmbedFailsFromOtherConnection) { |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- Id window_2_2 = ws_client2()->NewWindow(2); |
- ASSERT_TRUE(window_2_2); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
- ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2)); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
+ ASSERT_TRUE(window_2_1); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
+ ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1)); |
Id window_3_3 = ws_client3()->NewWindow(3); |
ASSERT_TRUE(window_3_3); |
- ASSERT_TRUE(ws_client3()->AddWindow(window_2_2, window_3_3)); |
+ ASSERT_TRUE(ws_client3()->AddWindow(window_2_1, window_3_3)); |
// 2 should not be able to embed in window_3_3 as window_3_3 was not created |
// by |
@@ -1672,14 +1698,14 @@ TEST_F(WindowTreeAppTest, EmbedFromOtherConnection) { |
ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
- Id window_2_2 = ws_client2()->NewWindow(2); |
- ASSERT_TRUE(window_2_2); |
- ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); |
+ Id window_2_1 = ws_client2()->NewWindow(1); |
+ ASSERT_TRUE(window_2_1); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
changes2()->clear(); |
- // Establish a third connection in window_2_2. |
- ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws1(), window_2_2)); |
+ // Establish a third connection in window_2_1. |
+ ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws1(), window_2_1)); |
ASSERT_TRUE(ws_client2()->WaitForAllMessages()); |
EXPECT_EQ(std::string(), SingleChangeToDescription(*changes2())); |
@@ -1711,7 +1737,6 @@ TEST_F(WindowTreeAppTest, CantEmbedFromConnectionRoot) { |
ws_client3_ = EstablishConnectionViaEmbedWithPolicyBitmask( |
ws1(), window_1_2, mojom::WindowTree::kAccessPolicyEmbedRoot, nullptr); |
ASSERT_TRUE(ws_client3_.get() != nullptr); |
- ws_client3_->set_root_window(root_window_id()); |
// window_1_2 is ws3's root, so even though v3 is an embed root it should not |
// be able to Embed into itself. |
@@ -1765,6 +1790,50 @@ TEST_F(WindowTreeAppTest, TransientWindowTracksTransientParentLifetime) { |
ChangesToDescription1(*changes1())[1]); |
} |
+TEST_F(WindowTreeAppTest, Ids) { |
+ const Id window_1_100 = ws_client1()->NewWindow(100); |
+ ASSERT_TRUE(window_1_100); |
+ ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_100)); |
+ |
+ // Establish the second connection at 1,100. |
+ ASSERT_NO_FATAL_FAILURE(EstablishSecondConnectionWithRoot(window_1_100)); |
+ |
+ // 1,100 is the id in the ws_client1's id space. The new client should see |
+ // 2,1 (the server id). |
+ const Id window_1_100_in_ws2 = BuildWindowId(connection_id_1(), 1); |
+ EXPECT_EQ(window_1_100_in_ws2, ws_client2()->root_window_id()); |
+ |
+ // The first window created in the second connection gets a server id of 2,1 |
+ // regardless of the id the client uses. |
+ const Id window_2_101 = ws_client2()->NewWindow(101); |
+ ASSERT_TRUE(ws_client2()->AddWindow(window_1_100_in_ws2, window_2_101)); |
+ const Id window_2_101_in_ws1 = BuildWindowId(connection_id_2(), 1); |
+ ws_client1()->WaitForChangeCount(1); |
+ EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_101_in_ws1) + |
+ " new_parent=" + IdToString(window_1_100) + " old_parent=null", |
+ SingleChangeToDescription(*changes1())); |
+ changes1()->clear(); |
+ |
+ // Change the bounds of window_2_101 and make sure server gets it. |
+ ws2()->SetWindowBounds(11, window_2_101, |
+ mojo::Rect::From(gfx::Rect(1, 2, 3, 4))); |
+ ASSERT_TRUE(ws_client2()->WaitForChangeCompleted(11)); |
+ ws_client1()->WaitForChangeCount(1); |
+ EXPECT_EQ("BoundsChanged window=" + IdToString(window_2_101_in_ws1) + |
+ " old_bounds=0,0 0x0 new_bounds=1,2 3x4", |
+ SingleChangeToDescription(*changes1())); |
+ changes2()->clear(); |
+ |
+ // Remove 2_101 from wm, client1 should see the change. |
+ ws1()->RemoveWindowFromParent(12, window_2_101_in_ws1); |
+ ASSERT_TRUE(ws_client1()->WaitForChangeCompleted(12)); |
+ ws_client2()->WaitForChangeCount(1); |
+ EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_101) + |
+ " new_parent=null old_parent=" + |
+ IdToString(window_1_100_in_ws2), |
+ SingleChangeToDescription(*changes2())); |
+} |
+ |
// TODO(sky): need to better track changes to initial connection. For example, |
// that SetBounsdWindows/AddWindow and the like don't result in messages to the |
// originating connection. |