Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(249)

Side by Side Diff: components/mus/ws/window_tree_apptest.cc

Issue 1639223003: Makes it so each windowtreeclient can use whatever ids it wants (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/mus/ws/window_finder.cc ('k') | components/mus/ws/window_tree_host_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 public TestChangeTracker::Delegate { 122 public TestChangeTracker::Delegate {
123 public: 123 public:
124 TestWindowTreeClientImpl() 124 TestWindowTreeClientImpl()
125 : binding_(this), 125 : binding_(this),
126 connection_id_(0), 126 connection_id_(0),
127 root_window_id_(0), 127 root_window_id_(0),
128 // Start with a random large number so tests can use lower ids if they 128 // Start with a random large number so tests can use lower ids if they
129 // want. 129 // want.
130 next_change_id_(10000), 130 next_change_id_(10000),
131 waiting_change_id_(0), 131 waiting_change_id_(0),
132 on_change_completed_result_(false) { 132 on_change_completed_result_(false),
133 track_root_bounds_changes_(false) {
133 tracker_.set_delegate(this); 134 tracker_.set_delegate(this);
134 } 135 }
135 136
136 void Bind(mojo::InterfaceRequest<mojom::WindowTreeClient> request) { 137 void Bind(mojo::InterfaceRequest<mojom::WindowTreeClient> request) {
137 binding_.Bind(std::move(request)); 138 binding_.Bind(std::move(request));
138 } 139 }
139 140
140 mojom::WindowTree* tree() { return tree_.get(); } 141 mojom::WindowTree* tree() { return tree_.get(); }
141 TestChangeTracker* tracker() { return &tracker_; } 142 TestChangeTracker* tracker() { return &tracker_; }
143 Id root_window_id() const { return root_window_id_; }
144
145 // Sets whether changes to the bounds of the root should be tracked. Normally
146 // they are ignored (as during startup we often times get random size
147 // changes).
148 void set_track_root_bounds_changes(bool value) {
149 track_root_bounds_changes_ = value;
150 }
142 151
143 // Runs a nested MessageLoop until |count| changes (calls to 152 // Runs a nested MessageLoop until |count| changes (calls to
144 // WindowTreeClient functions) have been received. 153 // WindowTreeClient functions) have been received.
145 void WaitForChangeCount(size_t count) { 154 void WaitForChangeCount(size_t count) {
146 if (tracker_.changes()->size() >= count) 155 if (tracker_.changes()->size() >= count)
147 return; 156 return;
148 157
149 ASSERT_TRUE(wait_state_.get() == nullptr); 158 ASSERT_TRUE(wait_state_.get() == nullptr);
150 wait_state_.reset(new WaitState); 159 wait_state_.reset(new WaitState);
151 wait_state_->change_count = count; 160 wait_state_->change_count = count;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 224
216 // Generally you want NewWindow(), but use this if you need to test given 225 // Generally you want NewWindow(), but use this if you need to test given
217 // a complete window id (NewWindow() ors with the connection id). 226 // a complete window id (NewWindow() ors with the connection id).
218 Id NewWindowWithCompleteId(Id id) { 227 Id NewWindowWithCompleteId(Id id) {
219 mojo::Map<mojo::String, mojo::Array<uint8_t>> properties; 228 mojo::Map<mojo::String, mojo::Array<uint8_t>> properties;
220 const uint32_t change_id = GetAndAdvanceChangeId(); 229 const uint32_t change_id = GetAndAdvanceChangeId();
221 tree()->NewWindow(change_id, id, std::move(properties)); 230 tree()->NewWindow(change_id, id, std::move(properties));
222 return WaitForChangeCompleted(change_id) ? id : 0; 231 return WaitForChangeCompleted(change_id) ? id : 0;
223 } 232 }
224 233
225 void set_root_window(Id root_window_id) { root_window_id_ = root_window_id; }
226
227 bool SetWindowProperty(Id window_id, 234 bool SetWindowProperty(Id window_id,
228 const std::string& name, 235 const std::string& name,
229 const std::vector<uint8_t>* data) { 236 const std::vector<uint8_t>* data) {
230 Array<uint8_t> mojo_data; 237 Array<uint8_t> mojo_data;
231 if (data) 238 if (data)
232 mojo_data = Array<uint8_t>::From(*data); 239 mojo_data = Array<uint8_t>::From(*data);
233 const uint32_t change_id = GetAndAdvanceChangeId(); 240 const uint32_t change_id = GetAndAdvanceChangeId();
234 tree()->SetWindowProperty(change_id, window_id, name, std::move(mojo_data)); 241 tree()->SetWindowProperty(change_id, window_id, name, std::move(mojo_data));
235 return WaitForChangeCompleted(change_id); 242 return WaitForChangeCompleted(change_id);
236 } 243 }
(...skipping 28 matching lines...) Expand all
265 } 272 }
266 } 273 }
267 274
268 // WindowTreeClient: 275 // WindowTreeClient:
269 void OnEmbed(ConnectionSpecificId connection_id, 276 void OnEmbed(ConnectionSpecificId connection_id,
270 WindowDataPtr root, 277 WindowDataPtr root,
271 mojom::WindowTreePtr tree, 278 mojom::WindowTreePtr tree,
272 Id focused_window_id, 279 Id focused_window_id,
273 uint32_t access_policy) override { 280 uint32_t access_policy) override {
274 // TODO(sky): add coverage of |focused_window_id|. 281 // TODO(sky): add coverage of |focused_window_id|.
282 ASSERT_TRUE(root);
283 root_window_id_ = root->window_id;
275 tree_ = std::move(tree); 284 tree_ = std::move(tree);
276 connection_id_ = connection_id; 285 connection_id_ = connection_id;
277 tracker()->OnEmbed(connection_id, std::move(root)); 286 tracker()->OnEmbed(connection_id, std::move(root));
278 if (embed_run_loop_) 287 if (embed_run_loop_)
279 embed_run_loop_->Quit(); 288 embed_run_loop_->Quit();
280 } 289 }
281 void OnEmbeddedAppDisconnected(Id window_id) override { 290 void OnEmbeddedAppDisconnected(Id window_id) override {
282 tracker()->OnEmbeddedAppDisconnected(window_id); 291 tracker()->OnEmbeddedAppDisconnected(window_id);
283 } 292 }
284 void OnUnembed(Id window_id) override { tracker()->OnUnembed(window_id); } 293 void OnUnembed(Id window_id) override { tracker()->OnUnembed(window_id); }
285 void OnTopLevelCreated(uint32_t change_id, 294 void OnTopLevelCreated(uint32_t change_id,
286 mojom::WindowDataPtr data) override { 295 mojom::WindowDataPtr data) override {
287 tracker()->OnTopLevelCreated(change_id, std::move(data)); 296 tracker()->OnTopLevelCreated(change_id, std::move(data));
288 } 297 }
289 void OnWindowBoundsChanged(Id window_id, 298 void OnWindowBoundsChanged(Id window_id,
290 RectPtr old_bounds, 299 RectPtr old_bounds,
291 RectPtr new_bounds) override { 300 RectPtr new_bounds) override {
292 // The bounds of the root may change during startup on Android at random 301 // The bounds of the root may change during startup on Android at random
293 // times. As this doesn't matter, and shouldn't impact test exepctations, 302 // times. As this doesn't matter, and shouldn't impact test exepctations,
294 // it is ignored. 303 // it is ignored.
295 if (window_id == root_window_id_) 304 if (window_id == root_window_id_ && !track_root_bounds_changes_)
296 return; 305 return;
297 tracker()->OnWindowBoundsChanged(window_id, std::move(old_bounds), 306 tracker()->OnWindowBoundsChanged(window_id, std::move(old_bounds),
298 std::move(new_bounds)); 307 std::move(new_bounds));
299 } 308 }
300 void OnClientAreaChanged( 309 void OnClientAreaChanged(
301 uint32_t window_id, 310 uint32_t window_id,
302 mojo::InsetsPtr new_client_area, 311 mojo::InsetsPtr new_client_area,
303 mojo::Array<mojo::RectPtr> new_additional_client_areas) override {} 312 mojo::Array<mojo::RectPtr> new_additional_client_areas) override {}
304 void OnTransientWindowAdded(uint32_t window_id, 313 void OnTransientWindowAdded(uint32_t window_id,
305 uint32_t transient_window_id) override { 314 uint32_t transient_window_id) override {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 // If non-null we're waiting for a certain number of change notifications to 383 // If non-null we're waiting for a certain number of change notifications to
375 // be encountered. 384 // be encountered.
376 scoped_ptr<WaitState> wait_state_; 385 scoped_ptr<WaitState> wait_state_;
377 386
378 mojo::Binding<WindowTreeClient> binding_; 387 mojo::Binding<WindowTreeClient> binding_;
379 Id connection_id_; 388 Id connection_id_;
380 Id root_window_id_; 389 Id root_window_id_;
381 uint32_t next_change_id_; 390 uint32_t next_change_id_;
382 uint32_t waiting_change_id_; 391 uint32_t waiting_change_id_;
383 bool on_change_completed_result_; 392 bool on_change_completed_result_;
393 bool track_root_bounds_changes_;
384 scoped_ptr<base::RunLoop> change_completed_run_loop_; 394 scoped_ptr<base::RunLoop> change_completed_run_loop_;
385 395
386 DISALLOW_COPY_AND_ASSIGN(TestWindowTreeClientImpl); 396 DISALLOW_COPY_AND_ASSIGN(TestWindowTreeClientImpl);
387 }; 397 };
388 398
389 // ----------------------------------------------------------------------------- 399 // -----------------------------------------------------------------------------
390 400
391 // InterfaceFactory for vending TestWindowTreeClientImpls. 401 // InterfaceFactory for vending TestWindowTreeClientImpls.
392 class WindowTreeClientFactory 402 class WindowTreeClientFactory
393 : public mojo::InterfaceFactory<WindowTreeClient> { 403 : public mojo::InterfaceFactory<WindowTreeClient> {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 461
452 int connection_id_1() const { return connection_id_1_; } 462 int connection_id_1() const { return connection_id_1_; }
453 int connection_id_2() const { return connection_id_2_; } 463 int connection_id_2() const { return connection_id_2_; }
454 464
455 void EstablishSecondConnectionWithRoot(Id root_id) { 465 void EstablishSecondConnectionWithRoot(Id root_id) {
456 ASSERT_TRUE(ws_client2_.get() == nullptr); 466 ASSERT_TRUE(ws_client2_.get() == nullptr);
457 ws_client2_ = 467 ws_client2_ =
458 EstablishConnectionViaEmbed(ws1(), root_id, &connection_id_2_); 468 EstablishConnectionViaEmbed(ws1(), root_id, &connection_id_2_);
459 ASSERT_GT(connection_id_2_, 0); 469 ASSERT_GT(connection_id_2_, 0);
460 ASSERT_TRUE(ws_client2_.get() != nullptr); 470 ASSERT_TRUE(ws_client2_.get() != nullptr);
461 ws_client2_->set_root_window(root_window_id_);
462 } 471 }
463 472
464 void EstablishSecondConnection(bool create_initial_window) { 473 void EstablishSecondConnection(bool create_initial_window) {
465 Id window_1_1 = 0; 474 Id window_1_1 = 0;
466 if (create_initial_window) { 475 if (create_initial_window) {
467 window_1_1 = ws_client1()->NewWindow(1); 476 window_1_1 = ws_client1()->NewWindow(1);
468 ASSERT_TRUE(window_1_1); 477 ASSERT_TRUE(window_1_1);
469 } 478 }
470 ASSERT_NO_FATAL_FAILURE( 479 ASSERT_NO_FATAL_FAILURE(
471 EstablishSecondConnectionWithRoot(BuildWindowId(connection_id_1(), 1))); 480 EstablishSecondConnectionWithRoot(BuildWindowId(connection_id_1(), 1)));
472 481
473 if (create_initial_window) { 482 if (create_initial_window) {
474 EXPECT_EQ("[" + WindowParentToString(window_1_1, kNullParentId) + "]", 483 EXPECT_EQ("[" + WindowParentToString(window_1_1, kNullParentId) + "]",
475 ChangeWindowDescription(*changes2())); 484 ChangeWindowDescription(*changes2()));
476 } 485 }
477 } 486 }
478 487
479 void EstablishThirdConnection(WindowTree* owner, Id root_id) { 488 void EstablishThirdConnection(WindowTree* owner, Id root_id) {
480 ASSERT_TRUE(ws_client3_.get() == nullptr); 489 ASSERT_TRUE(ws_client3_.get() == nullptr);
481 ws_client3_ = EstablishConnectionViaEmbed(owner, root_id, nullptr); 490 ws_client3_ = EstablishConnectionViaEmbed(owner, root_id, nullptr);
482 ASSERT_TRUE(ws_client3_.get() != nullptr); 491 ASSERT_TRUE(ws_client3_.get() != nullptr);
483 ws_client3_->set_root_window(root_window_id_);
484 } 492 }
485 493
486 scoped_ptr<TestWindowTreeClientImpl> WaitForWindowTreeClient() { 494 scoped_ptr<TestWindowTreeClientImpl> WaitForWindowTreeClient() {
487 return client_factory_->WaitForInstance(); 495 return client_factory_->WaitForInstance();
488 } 496 }
489 497
490 // Establishes a new connection by way of Embed() on the specified 498 // Establishes a new connection by way of Embed() on the specified
491 // WindowTree. 499 // WindowTree.
492 scoped_ptr<TestWindowTreeClientImpl> EstablishConnectionViaEmbed( 500 scoped_ptr<TestWindowTreeClientImpl> EstablishConnectionViaEmbed(
493 WindowTree* owner, 501 WindowTree* owner,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 552
545 ASSERT_EQ(1u, changes1()->size()); 553 ASSERT_EQ(1u, changes1()->size());
546 EXPECT_EQ(CHANGE_TYPE_EMBED, (*changes1())[0].type); 554 EXPECT_EQ(CHANGE_TYPE_EMBED, (*changes1())[0].type);
547 // All these tests assume 1 for the client id. The only real assertion here 555 // All these tests assume 1 for the client id. The only real assertion here
548 // is the client id is not zero, but adding this as rest of code here 556 // is the client id is not zero, but adding this as rest of code here
549 // assumes 1. 557 // assumes 1.
550 ASSERT_GT((*changes1())[0].connection_id, 0); 558 ASSERT_GT((*changes1())[0].connection_id, 0);
551 connection_id_1_ = (*changes1())[0].connection_id; 559 connection_id_1_ = (*changes1())[0].connection_id;
552 ASSERT_FALSE((*changes1())[0].windows.empty()); 560 ASSERT_FALSE((*changes1())[0].windows.empty());
553 root_window_id_ = (*changes1())[0].windows[0].window_id; 561 root_window_id_ = (*changes1())[0].windows[0].window_id;
554 ws_client1_->set_root_window(root_window_id_); 562 ASSERT_EQ(root_window_id_, ws_client1_->root_window_id());
555 changes1()->clear(); 563 changes1()->clear();
556 } 564 }
557 565
558 // ApplicationDelegate implementation. 566 // ApplicationDelegate implementation.
559 bool ConfigureIncomingConnection(ApplicationConnection* connection) override { 567 bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
560 connection->AddService(client_factory_.get()); 568 connection->AddService(client_factory_.get());
561 return true; 569 return true;
562 } 570 }
563 571
564 scoped_ptr<TestWindowTreeClientImpl> ws_client1_; 572 scoped_ptr<TestWindowTreeClientImpl> ws_client1_;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 windows.clear(); 650 windows.clear();
643 GetWindowTree(ws2(), window_2_4, &windows); 651 GetWindowTree(ws2(), window_2_4, &windows);
644 EXPECT_EQ(WindowParentToString(window_2_4, kNullParentId), 652 EXPECT_EQ(WindowParentToString(window_2_4, kNullParentId),
645 SingleWindowDescription(windows)); 653 SingleWindowDescription(windows));
646 } 654 }
647 655
648 // And window 4 should not be visible to connection 3. 656 // And window 4 should not be visible to connection 3.
649 { 657 {
650 std::vector<TestWindow> windows; 658 std::vector<TestWindow> windows;
651 GetWindowTree(ws3(), window_2_3, &windows); 659 GetWindowTree(ws3(), window_2_3, &windows);
652 EXPECT_EQ(WindowParentToString(window_2_3, kNullParentId), 660 EXPECT_EQ("no windows", SingleWindowDescription(windows));
653 SingleWindowDescription(windows));
654 } 661 }
655 } 662 }
656 663
657 // Verifies once Embed() has been invoked the parent connection can't see any 664 // Verifies once Embed() has been invoked the parent connection can't see any
658 // children. 665 // children.
659 TEST_F(WindowTreeAppTest, CantAccessChildrenOfEmbeddedWindow) { 666 TEST_F(WindowTreeAppTest, CantAccessChildrenOfEmbeddedWindow) {
660 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 667 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
661 668
662 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 669 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
663 Id window_2_2 = ws_client2()->NewWindow(2); 670 Id window_2_2 = ws_client2()->NewWindow(2);
664 ASSERT_TRUE(window_2_2); 671 ASSERT_TRUE(window_2_2);
665 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 672 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2));
666 673
667 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2)); 674 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2));
668 675
669 Id window_3_3 = ws_client3()->NewWindow(3); 676 Id window_3_3 = ws_client3()->NewWindow(3);
670 ASSERT_TRUE(window_3_3); 677 ASSERT_TRUE(window_3_3);
671 ASSERT_TRUE(ws_client3()->AddWindow(window_2_2, window_3_3)); 678 ASSERT_TRUE(
679 ws_client3()->AddWindow(ws_client3()->root_window_id(), window_3_3));
672 680
673 // Even though 3 is a child of 2 connection 2 can't see 3 as it's from a 681 // Even though 3 is a child of 2 connection 2 can't see 3 as it's from a
674 // different connection. 682 // different connection.
675 { 683 {
676 std::vector<TestWindow> windows; 684 std::vector<TestWindow> windows;
677 GetWindowTree(ws2(), window_2_2, &windows); 685 GetWindowTree(ws2(), window_2_2, &windows);
678 EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), 686 EXPECT_EQ(WindowParentToString(window_2_2, window_1_1),
679 SingleWindowDescription(windows)); 687 SingleWindowDescription(windows));
680 } 688 }
681 689
682 // Connection 2 shouldn't be able to get window 3 at all. 690 // Connection 2 shouldn't be able to get window 3 at all.
683 { 691 {
684 std::vector<TestWindow> windows; 692 std::vector<TestWindow> windows;
685 GetWindowTree(ws2(), window_3_3, &windows); 693 GetWindowTree(ws2(), window_3_3, &windows);
686 EXPECT_TRUE(windows.empty()); 694 EXPECT_TRUE(windows.empty());
687 } 695 }
688 696
689 // Connection 1 should be able to see it all (its the root). 697 // Connection 1 should be able to see it all (its the root).
690 { 698 {
691 std::vector<TestWindow> windows; 699 std::vector<TestWindow> windows;
692 GetWindowTree(ws1(), window_1_1, &windows); 700 GetWindowTree(ws1(), window_1_1, &windows);
693 ASSERT_EQ(3u, windows.size()); 701 ASSERT_EQ(3u, windows.size());
694 EXPECT_EQ(WindowParentToString(window_1_1, kNullParentId), 702 EXPECT_EQ(WindowParentToString(window_1_1, kNullParentId),
695 windows[0].ToString()); 703 windows[0].ToString());
696 EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), 704 // NOTE: we expect a match of WindowParentToString(window_2_2, window_1_1),
697 windows[1].ToString()); 705 // but the ids are in the id space of client2, which is not the same as
698 EXPECT_EQ(WindowParentToString(window_3_3, window_2_2), 706 // the id space of ws1().
699 windows[2].ToString()); 707 EXPECT_EQ("window=2,1 parent=1,1", windows[1].ToString());
708 // Same thing here, we really want to test for
709 // WindowParentToString(window_3_3, window_2_2).
710 EXPECT_EQ("window=3,1 parent=2,1", windows[2].ToString());
700 } 711 }
701 } 712 }
702 713
703 // Verifies once Embed() has been invoked the parent can't mutate the children. 714 // Verifies once Embed() has been invoked the parent can't mutate the children.
704 TEST_F(WindowTreeAppTest, CantModifyChildrenOfEmbeddedWindow) { 715 TEST_F(WindowTreeAppTest, CantModifyChildrenOfEmbeddedWindow) {
705 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 716 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
706 717
707 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 718 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
719 Id window_2_1 = ws_client2()->NewWindow(1);
720 ASSERT_TRUE(window_2_1);
721 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
722
723 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1));
724
708 Id window_2_2 = ws_client2()->NewWindow(2); 725 Id window_2_2 = ws_client2()->NewWindow(2);
709 ASSERT_TRUE(window_2_2); 726 ASSERT_TRUE(window_2_2);
710 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2));
711
712 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2));
713
714 Id window_2_3 = ws_client2()->NewWindow(3);
715 ASSERT_TRUE(window_2_3);
716 // Connection 2 shouldn't be able to add anything to the window anymore. 727 // Connection 2 shouldn't be able to add anything to the window anymore.
717 ASSERT_FALSE(ws_client2()->AddWindow(window_2_2, window_2_3)); 728 ASSERT_FALSE(ws_client2()->AddWindow(window_2_1, window_2_2));
718 729
719 // Create window 3 in connection 3 and add it to window 3. 730 // Create window 3 in connection 3 and add it to window 3.
720 Id window_3_3 = ws_client3()->NewWindow(3); 731 Id window_3_1 = ws_client3()->NewWindow(1);
721 ASSERT_TRUE(window_3_3); 732 ASSERT_TRUE(window_3_1);
722 ASSERT_TRUE(ws_client3()->AddWindow(window_2_2, window_3_3)); 733 ASSERT_TRUE(ws_client3()->AddWindow(window_2_1, window_3_1));
723 734
724 // Connection 2 shouldn't be able to remove window 3. 735 // Connection 2 shouldn't be able to remove window 3.
725 ASSERT_FALSE(ws_client2()->RemoveWindowFromParent(window_3_3)); 736 ASSERT_FALSE(ws_client2()->RemoveWindowFromParent(window_3_1));
726 } 737 }
727 738
728 // Verifies client gets a valid id. 739 // Verifies client gets a valid id.
729 TEST_F(WindowTreeAppTest, NewWindow) { 740 TEST_F(WindowTreeAppTest, NewWindow) {
730 Id window_1_1 = ws_client1()->NewWindow(1); 741 Id window_1_1 = ws_client1()->NewWindow(1);
731 ASSERT_TRUE(window_1_1); 742 ASSERT_TRUE(window_1_1);
732 EXPECT_TRUE(changes1()->empty()); 743 EXPECT_TRUE(changes1()->empty());
733 744
734 // Can't create a window with the same id. 745 // Can't create a window with the same id.
735 ASSERT_EQ(0u, ws_client1()->NewWindowWithCompleteId(window_1_1)); 746 ASSERT_EQ(0u, ws_client1()->NewWindowWithCompleteId(window_1_1));
736 EXPECT_TRUE(changes1()->empty()); 747 EXPECT_TRUE(changes1()->empty());
737 748
738 // Can't create a window with a bogus connection id. 749 // Can't create a window with a bogus connection id.
739 ASSERT_EQ(0u, ws_client1()->NewWindowWithCompleteId( 750 ASSERT_EQ(0u, ws_client1()->NewWindowWithCompleteId(
740 BuildWindowId(connection_id_1() + 1, 1))); 751 BuildWindowId(connection_id_1() + 1, 1)));
741 EXPECT_TRUE(changes1()->empty()); 752 EXPECT_TRUE(changes1()->empty());
742 } 753 }
743 754
744 // Verifies AddWindow fails when window is already in position. 755 // Verifies AddWindow fails when window is already in position.
745 TEST_F(WindowTreeAppTest, AddWindowWithNoChange) { 756 TEST_F(WindowTreeAppTest, AddWindowWithNoChange) {
757 // Create the embed point now so that the ids line up.
758 ASSERT_TRUE(ws_client1()->NewWindow(1));
746 Id window_1_2 = ws_client1()->NewWindow(2); 759 Id window_1_2 = ws_client1()->NewWindow(2);
747 Id window_1_3 = ws_client1()->NewWindow(3); 760 Id window_1_3 = ws_client1()->NewWindow(3);
748 ASSERT_TRUE(window_1_2); 761 ASSERT_TRUE(window_1_2);
749 ASSERT_TRUE(window_1_3); 762 ASSERT_TRUE(window_1_3);
750 763
751 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 764 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false));
752 765
753 // Make 3 a child of 2. 766 // Make 3 a child of 2.
754 ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_3)); 767 ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_3));
755 768
756 // Try again, this should fail. 769 // Try again, this should fail.
757 EXPECT_FALSE(ws_client1()->AddWindow(window_1_2, window_1_3)); 770 EXPECT_FALSE(ws_client1()->AddWindow(window_1_2, window_1_3));
758 } 771 }
759 772
760 // Verifies AddWindow fails when window is already in position. 773 // Verifies AddWindow fails when window is already in position.
761 TEST_F(WindowTreeAppTest, AddAncestorFails) { 774 TEST_F(WindowTreeAppTest, AddAncestorFails) {
775 // Create the embed point now so that the ids line up.
776 ASSERT_TRUE(ws_client1()->NewWindow(1));
762 Id window_1_2 = ws_client1()->NewWindow(2); 777 Id window_1_2 = ws_client1()->NewWindow(2);
763 Id window_1_3 = ws_client1()->NewWindow(3); 778 Id window_1_3 = ws_client1()->NewWindow(3);
764 ASSERT_TRUE(window_1_2); 779 ASSERT_TRUE(window_1_2);
765 ASSERT_TRUE(window_1_3); 780 ASSERT_TRUE(window_1_3);
766 781
767 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 782 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false));
768 783
769 // Make 3 a child of 2. 784 // Make 3 a child of 2.
770 ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_3)); 785 ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_3));
771 786
772 // Try to make 2 a child of 3, this should fail since 2 is an ancestor of 3. 787 // Try to make 2 a child of 3, this should fail since 2 is an ancestor of 3.
773 EXPECT_FALSE(ws_client1()->AddWindow(window_1_3, window_1_2)); 788 EXPECT_FALSE(ws_client1()->AddWindow(window_1_3, window_1_2));
774 } 789 }
775 790
776 // Verifies adding to root sends right notifications. 791 // Verifies adding to root sends right notifications.
777 TEST_F(WindowTreeAppTest, AddToRoot) { 792 TEST_F(WindowTreeAppTest, AddToRoot) {
793 // Create the embed point now so that the ids line up.
794 Id window_1_1 = ws_client1()->NewWindow(1);
795 ASSERT_TRUE(window_1_1);
778 Id window_1_21 = ws_client1()->NewWindow(21); 796 Id window_1_21 = ws_client1()->NewWindow(21);
779 Id window_1_3 = ws_client1()->NewWindow(3); 797 Id window_1_3 = ws_client1()->NewWindow(3);
780 ASSERT_TRUE(window_1_21); 798 ASSERT_TRUE(window_1_21);
781 ASSERT_TRUE(window_1_3); 799 ASSERT_TRUE(window_1_3);
782 800
783 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 801 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false));
784 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
785 changes2()->clear(); 802 changes2()->clear();
786 803
787 // Make 3 a child of 21. 804 // Make 3 a child of 21.
788 ASSERT_TRUE(ws_client1()->AddWindow(window_1_21, window_1_3)); 805 ASSERT_TRUE(ws_client1()->AddWindow(window_1_21, window_1_3));
789 806
790 // Make 21 a child of 1. 807 // Make 21 a child of 1.
791 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_21)); 808 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_21));
792 809
793 // Connection 2 should not be told anything (because the window is from a 810 // Connection 2 should not be told anything (because the window is from a
794 // different connection). Create a window to ensure we got a response from 811 // different connection). Create a window to ensure we got a response from
795 // the server. 812 // the server.
796 ASSERT_TRUE(ws_client2()->NewWindow(100)); 813 ASSERT_TRUE(ws_client2()->NewWindow(100));
797 EXPECT_TRUE(changes2()->empty()); 814 EXPECT_TRUE(changes2()->empty());
798 } 815 }
799 816
800 // Verifies HierarchyChanged is correctly sent for various adds/removes. 817 // Verifies HierarchyChanged is correctly sent for various adds/removes.
801 TEST_F(WindowTreeAppTest, WindowHierarchyChangedWindows) { 818 TEST_F(WindowTreeAppTest, WindowHierarchyChangedWindows) {
819 // Create the embed point now so that the ids line up.
820 Id window_1_1 = ws_client1()->NewWindow(1);
802 // 1,2->1,11. 821 // 1,2->1,11.
803 Id window_1_2 = ws_client1()->NewWindow(2); 822 Id window_1_2 = ws_client1()->NewWindow(2);
804 ASSERT_TRUE(window_1_2); 823 ASSERT_TRUE(window_1_2);
805 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_2, true)); 824 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_2, true));
806 Id window_1_11 = ws_client1()->NewWindow(11); 825 Id window_1_11 = ws_client1()->NewWindow(11);
807 ASSERT_TRUE(window_1_11); 826 ASSERT_TRUE(window_1_11);
808 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_11, true)); 827 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_11, true));
809 ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_11)); 828 ASSERT_TRUE(ws_client1()->AddWindow(window_1_2, window_1_11));
810 829
811 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 830 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false));
812 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
813 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_1, true)); 831 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_1, true));
814 832
815 ASSERT_TRUE(ws_client2()->WaitForAllMessages()); 833 ASSERT_TRUE(ws_client2()->WaitForAllMessages());
816 changes2()->clear(); 834 changes2()->clear();
817 835
818 // 1,1->1,2->1,11 836 // 1,1->1,2->1,11
819 { 837 {
820 // Client 2 should not get anything (1,2 is from another connection). 838 // Client 2 should not get anything (1,2 is from another connection).
821 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_2)); 839 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_2));
822 ASSERT_TRUE(ws_client2()->WaitForAllMessages()); 840 ASSERT_TRUE(ws_client2()->WaitForAllMessages());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1)); 903 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1));
886 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_11)); 904 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_11));
887 ASSERT_TRUE(ws_client2()->AddWindow(window_2_2, window_2_21)); 905 ASSERT_TRUE(ws_client2()->AddWindow(window_2_2, window_2_21));
888 906
889 // Remove 11, should result in a hierarchy change for the root. 907 // Remove 11, should result in a hierarchy change for the root.
890 { 908 {
891 changes1()->clear(); 909 changes1()->clear();
892 ASSERT_TRUE(ws_client2()->RemoveWindowFromParent(window_2_11)); 910 ASSERT_TRUE(ws_client2()->RemoveWindowFromParent(window_2_11));
893 911
894 ws_client1_->WaitForChangeCount(1); 912 ws_client1_->WaitForChangeCount(1);
895 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_11) + 913 // 2,1 should be IdToString(window_2_11), but window_2_11 is in the id
896 " new_parent=null old_parent=" + IdToString(window_1_1), 914 // space of client2, not client1.
915 EXPECT_EQ("HierarchyChanged window=2,1 new_parent=null old_parent=" +
916 IdToString(window_1_1),
897 SingleChangeToDescription(*changes1())); 917 SingleChangeToDescription(*changes1()));
898 } 918 }
899 919
900 // Add 2 to 1. 920 // Add 2 to 1.
901 { 921 {
902 changes1()->clear(); 922 changes1()->clear();
903 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 923 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2));
904 ws_client1_->WaitForChangeCount(1); 924 ws_client1_->WaitForChangeCount(1);
905 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + 925 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) +
906 " new_parent=" + IdToString(window_1_1) + " old_parent=null", 926 " new_parent=" + IdToString(window_1_1) + " old_parent=null",
907 SingleChangeToDescription(*changes1())); 927 SingleChangeToDescription(*changes1()));
908 EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) + "],[" + 928 // "window=2,3 parent=2,2]" should be,
909 WindowParentToString(window_2_21, window_2_2) + "]", 929 // WindowParentToString(window_2_21, window_2_2), but isn't because of
930 // differing id spaces.
931 EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) +
932 "],[window=2,3 parent=2,2]",
910 ChangeWindowDescription(*changes1())); 933 ChangeWindowDescription(*changes1()));
911 } 934 }
912 } 935 }
913 936
914 TEST_F(WindowTreeAppTest, ReorderWindow) { 937 TEST_F(WindowTreeAppTest, ReorderWindow) {
915 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 938 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
916 939
917 Id window_2_1 = ws_client2()->NewWindow(1); 940 Id window_2_1 = ws_client2()->NewWindow(1);
918 Id window_2_2 = ws_client2()->NewWindow(2); 941 Id window_2_2 = ws_client2()->NewWindow(2);
919 Id window_2_3 = ws_client2()->NewWindow(3); 942 Id window_2_3 = ws_client2()->NewWindow(3);
920 Id window_1_4 = ws_client1()->NewWindow(4); // Peer to 1,1 943 Id window_1_4 = ws_client1()->NewWindow(4); // Peer to 1,1
921 Id window_1_5 = ws_client1()->NewWindow(5); // Peer to 1,1 944 Id window_1_5 = ws_client1()->NewWindow(5); // Peer to 1,1
922 Id window_2_6 = ws_client2()->NewWindow(6); // Child of 1,2. 945 Id window_2_6 = ws_client2()->NewWindow(6); // Child of 1,2.
923 Id window_2_7 = ws_client2()->NewWindow(7); // Unparented. 946 Id window_2_7 = ws_client2()->NewWindow(7); // Unparented.
924 Id window_2_8 = ws_client2()->NewWindow(8); // Unparented. 947 Id window_2_8 = ws_client2()->NewWindow(8); // Unparented.
925 ASSERT_TRUE(window_2_1); 948 ASSERT_TRUE(window_2_1);
926 ASSERT_TRUE(window_2_2); 949 ASSERT_TRUE(window_2_2);
927 ASSERT_TRUE(window_2_3); 950 ASSERT_TRUE(window_2_3);
928 ASSERT_TRUE(window_1_4); 951 ASSERT_TRUE(window_1_4);
929 ASSERT_TRUE(window_1_5); 952 ASSERT_TRUE(window_1_5);
930 ASSERT_TRUE(window_2_6); 953 ASSERT_TRUE(window_2_6);
931 ASSERT_TRUE(window_2_7); 954 ASSERT_TRUE(window_2_7);
932 ASSERT_TRUE(window_2_8); 955 ASSERT_TRUE(window_2_8);
933 956
934 ASSERT_TRUE(ws_client2()->AddWindow(window_2_1, window_2_2)); 957 ASSERT_TRUE(ws_client2()->AddWindow(window_2_1, window_2_2));
935 ASSERT_TRUE(ws_client2()->AddWindow(window_2_2, window_2_6)); 958 ASSERT_TRUE(ws_client2()->AddWindow(window_2_2, window_2_6));
936 ASSERT_TRUE(ws_client2()->AddWindow(window_2_1, window_2_3)); 959 ASSERT_TRUE(ws_client2()->AddWindow(window_2_1, window_2_3));
937 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_4)); 960 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_4));
938 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_5)); 961 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_5));
939 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_2_1)); 962 ASSERT_TRUE(
963 ws_client2()->AddWindow(BuildWindowId(connection_id_1(), 1), window_2_1));
940 964
941 { 965 {
942 changes1()->clear(); 966 changes1()->clear();
943 ASSERT_TRUE(ws_client2()->ReorderWindow(window_2_2, window_2_3, 967 ASSERT_TRUE(ws_client2()->ReorderWindow(window_2_2, window_2_3,
944 mojom::OrderDirection::ABOVE)); 968 mojom::OrderDirection::ABOVE));
945 969
946 ws_client1_->WaitForChangeCount(1); 970 ws_client1_->WaitForChangeCount(1);
947 EXPECT_EQ("Reordered window=" + IdToString(window_2_2) + " relative=" + 971 EXPECT_EQ("Reordered window=" + IdToString(window_2_2) + " relative=" +
948 IdToString(window_2_3) + " direction=above", 972 IdToString(window_2_3) + " direction=above",
949 SingleChangeToDescription(*changes1())); 973 SingleChangeToDescription(*changes1()));
(...skipping 29 matching lines...) Expand all
979 1003
980 // view7 & view8 are un-parented. 1004 // view7 & view8 are un-parented.
981 EXPECT_FALSE(ws_client1()->ReorderWindow(window_2_7, window_2_8, 1005 EXPECT_FALSE(ws_client1()->ReorderWindow(window_2_7, window_2_8,
982 mojom::OrderDirection::ABOVE)); 1006 mojom::OrderDirection::ABOVE));
983 } 1007 }
984 1008
985 // Verifies DeleteWindow works. 1009 // Verifies DeleteWindow works.
986 TEST_F(WindowTreeAppTest, DeleteWindow) { 1010 TEST_F(WindowTreeAppTest, DeleteWindow) {
987 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1011 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
988 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1012 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
989 Id window_2_2 = ws_client2()->NewWindow(2); 1013 Id window_2_1 = ws_client2()->NewWindow(1);
990 ASSERT_TRUE(window_2_2); 1014 ASSERT_TRUE(window_2_1);
991 1015
992 // Make 2 a child of 1. 1016 // Make 2 a child of 1.
993 { 1017 {
994 changes1()->clear(); 1018 changes1()->clear();
995 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1019 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
996 ws_client1_->WaitForChangeCount(1); 1020 ws_client1_->WaitForChangeCount(1);
997 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + 1021 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_1) +
998 " new_parent=" + IdToString(window_1_1) + " old_parent=null", 1022 " new_parent=" + IdToString(window_1_1) + " old_parent=null",
999 SingleChangeToDescription(*changes1())); 1023 SingleChangeToDescription(*changes1()));
1000 } 1024 }
1001 1025
1002 // Delete 2. 1026 // Delete 2.
1003 { 1027 {
1004 changes1()->clear(); 1028 changes1()->clear();
1005 changes2()->clear(); 1029 changes2()->clear();
1006 ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_2)); 1030 ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_1));
1007 EXPECT_TRUE(changes2()->empty()); 1031 EXPECT_TRUE(changes2()->empty());
1008 1032
1009 ws_client1_->WaitForChangeCount(1); 1033 ws_client1_->WaitForChangeCount(1);
1010 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2), 1034 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_1),
1011 SingleChangeToDescription(*changes1())); 1035 SingleChangeToDescription(*changes1()));
1012 } 1036 }
1013 } 1037 }
1014 1038
1015 // Verifies DeleteWindow isn't allowed from a separate connection. 1039 // Verifies DeleteWindow isn't allowed from a separate connection.
1016 TEST_F(WindowTreeAppTest, DeleteWindowFromAnotherConnectionDisallowed) { 1040 TEST_F(WindowTreeAppTest, DeleteWindowFromAnotherConnectionDisallowed) {
1017 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1041 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1018 EXPECT_FALSE(ws_client2()->DeleteWindow(BuildWindowId(connection_id_1(), 1))); 1042 EXPECT_FALSE(ws_client2()->DeleteWindow(BuildWindowId(connection_id_1(), 1)));
1019 } 1043 }
1020 1044
1021 // Verifies if a window was deleted and then reused that other clients are 1045 // Verifies if a window was deleted and then reused that other clients are
1022 // properly notified. 1046 // properly notified.
1023 TEST_F(WindowTreeAppTest, ReuseDeletedWindowId) { 1047 TEST_F(WindowTreeAppTest, ReuseDeletedWindowId) {
1024 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1048 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1025 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1049 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
1026 Id window_2_2 = ws_client2()->NewWindow(2); 1050 Id window_2_1 = ws_client2()->NewWindow(1);
1027 ASSERT_TRUE(window_2_2); 1051 ASSERT_TRUE(window_2_1);
1028 1052
1029 // Add 2 to 1. 1053 // Add 2 to 1.
1030 { 1054 {
1031 changes1()->clear(); 1055 changes1()->clear();
1032 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1056 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
1033 ws_client1_->WaitForChangeCount(1); 1057 ws_client1_->WaitForChangeCount(1);
1034 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + 1058 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_1) +
1035 " new_parent=" + IdToString(window_1_1) + " old_parent=null", 1059 " new_parent=" + IdToString(window_1_1) + " old_parent=null",
1036 SingleChangeToDescription(*changes1())); 1060 SingleChangeToDescription(*changes1()));
1037 EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) + "]", 1061 EXPECT_EQ("[" + WindowParentToString(window_2_1, window_1_1) + "]",
1038 ChangeWindowDescription(*changes1())); 1062 ChangeWindowDescription(*changes1()));
1039 } 1063 }
1040 1064
1041 // Delete 2. 1065 // Delete 2.
1042 { 1066 {
1043 changes1()->clear(); 1067 changes1()->clear();
1044 ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_2)); 1068 ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_1));
1045 1069
1046 ws_client1_->WaitForChangeCount(1); 1070 ws_client1_->WaitForChangeCount(1);
1047 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2), 1071 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_1),
1048 SingleChangeToDescription(*changes1())); 1072 SingleChangeToDescription(*changes1()));
1049 } 1073 }
1050 1074
1051 // Create 2 again, and add it back to 1. Should get the same notification. 1075 // Create 2 again, and add it back to 1. Should get the same notification.
1052 window_2_2 = ws_client2()->NewWindow(2); 1076 window_2_1 = ws_client2()->NewWindow(2);
1053 ASSERT_TRUE(window_2_2); 1077 ASSERT_TRUE(window_2_1);
1054 { 1078 {
1055 changes1()->clear(); 1079 changes1()->clear();
1056 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1080 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
1057 1081
1058 ws_client1_->WaitForChangeCount(1); 1082 ws_client1_->WaitForChangeCount(1);
1059 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2) + 1083 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_1) +
1060 " new_parent=" + IdToString(window_1_1) + " old_parent=null", 1084 " new_parent=" + IdToString(window_1_1) + " old_parent=null",
1061 SingleChangeToDescription(*changes1())); 1085 SingleChangeToDescription(*changes1()));
1062 EXPECT_EQ("[" + WindowParentToString(window_2_2, window_1_1) + "]", 1086 EXPECT_EQ("[" + WindowParentToString(window_2_1, window_1_1) + "]",
1063 ChangeWindowDescription(*changes1())); 1087 ChangeWindowDescription(*changes1()));
1064 } 1088 }
1065 } 1089 }
1066 1090
1067 // Assertions for GetWindowTree. 1091 // Assertions for GetWindowTree.
1068 TEST_F(WindowTreeAppTest, GetWindowTree) { 1092 TEST_F(WindowTreeAppTest, GetWindowTree) {
1069 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1093 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1070 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1094 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
1071 1095
1072 // Create 11 in first connection and make it a child of 1. 1096 // Create 11 in first connection and make it a child of 1.
1073 Id window_1_11 = ws_client1()->NewWindow(11); 1097 Id window_1_11 = ws_client1()->NewWindow(11);
1074 ASSERT_TRUE(window_1_11); 1098 ASSERT_TRUE(window_1_11);
1075 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1)); 1099 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1));
1076 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_11)); 1100 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_11));
1077 1101
1078 // Create two windows in second connection, 2 and 3, both children of 1. 1102 // Create two windows in second connection, 2 and 3, both children of 1.
1103 Id window_2_1 = ws_client2()->NewWindow(1);
1079 Id window_2_2 = ws_client2()->NewWindow(2); 1104 Id window_2_2 = ws_client2()->NewWindow(2);
1080 Id window_2_3 = ws_client2()->NewWindow(3); 1105 ASSERT_TRUE(window_2_1);
1081 ASSERT_TRUE(window_2_2); 1106 ASSERT_TRUE(window_2_2);
1082 ASSERT_TRUE(window_2_3); 1107 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
1083 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1108 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2));
1084 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_3));
1085 1109
1086 // Verifies GetWindowTree() on the root. The root connection sees all. 1110 // Verifies GetWindowTree() on the root. The root connection sees all.
1087 { 1111 {
1088 std::vector<TestWindow> windows; 1112 std::vector<TestWindow> windows;
1089 GetWindowTree(ws1(), root_window_id(), &windows); 1113 GetWindowTree(ws1(), root_window_id(), &windows);
1090 ASSERT_EQ(5u, windows.size()); 1114 ASSERT_EQ(5u, windows.size());
1091 EXPECT_EQ(WindowParentToString(root_window_id(), kNullParentId), 1115 EXPECT_EQ(WindowParentToString(root_window_id(), kNullParentId),
1092 windows[0].ToString()); 1116 windows[0].ToString());
1093 EXPECT_EQ(WindowParentToString(window_1_1, root_window_id()), 1117 EXPECT_EQ(WindowParentToString(window_1_1, root_window_id()),
1094 windows[1].ToString()); 1118 windows[1].ToString());
1095 EXPECT_EQ(WindowParentToString(window_1_11, window_1_1), 1119 EXPECT_EQ(WindowParentToString(window_1_11, window_1_1),
1096 windows[2].ToString()); 1120 windows[2].ToString());
1121 EXPECT_EQ(WindowParentToString(window_2_1, window_1_1),
1122 windows[3].ToString());
1097 EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), 1123 EXPECT_EQ(WindowParentToString(window_2_2, window_1_1),
1098 windows[3].ToString());
1099 EXPECT_EQ(WindowParentToString(window_2_3, window_1_1),
1100 windows[4].ToString()); 1124 windows[4].ToString());
1101 } 1125 }
1102 1126
1103 // Verifies GetWindowTree() on the window 1,1 from ws2(). ws2() sees 1,1 as 1127 // Verifies GetWindowTree() on the window 1,1 from ws2(). ws2() sees 1,1 as
1104 // 1,1 1128 // 1,1
1105 // is ws2()'s root and ws2() sees all the windows it created. 1129 // is ws2()'s root and ws2() sees all the windows it created.
1106 { 1130 {
1107 std::vector<TestWindow> windows; 1131 std::vector<TestWindow> windows;
1108 GetWindowTree(ws2(), window_1_1, &windows); 1132 GetWindowTree(ws2(), window_1_1, &windows);
1109 ASSERT_EQ(3u, windows.size()); 1133 ASSERT_EQ(3u, windows.size());
1110 EXPECT_EQ(WindowParentToString(window_1_1, kNullParentId), 1134 EXPECT_EQ(WindowParentToString(window_1_1, kNullParentId),
1111 windows[0].ToString()); 1135 windows[0].ToString());
1136 EXPECT_EQ(WindowParentToString(window_2_1, window_1_1),
1137 windows[1].ToString());
1112 EXPECT_EQ(WindowParentToString(window_2_2, window_1_1), 1138 EXPECT_EQ(WindowParentToString(window_2_2, window_1_1),
1113 windows[1].ToString());
1114 EXPECT_EQ(WindowParentToString(window_2_3, window_1_1),
1115 windows[2].ToString()); 1139 windows[2].ToString());
1116 } 1140 }
1117 1141
1118 // Connection 2 shouldn't be able to get the root tree. 1142 // Connection 2 shouldn't be able to get the root tree.
1119 { 1143 {
1120 std::vector<TestWindow> windows; 1144 std::vector<TestWindow> windows;
1121 GetWindowTree(ws2(), root_window_id(), &windows); 1145 GetWindowTree(ws2(), root_window_id(), &windows);
1122 ASSERT_EQ(0u, windows.size()); 1146 ASSERT_EQ(0u, windows.size());
1123 } 1147 }
1124 } 1148 }
1125 1149
1126 TEST_F(WindowTreeAppTest, SetWindowBounds) { 1150 TEST_F(WindowTreeAppTest, SetWindowBounds) {
1127 Id window_1_1 = ws_client1()->NewWindow(1); 1151 Id window_1_1 = ws_client1()->NewWindow(1);
1128 ASSERT_TRUE(window_1_1); 1152 ASSERT_TRUE(window_1_1);
1129 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1)); 1153 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1));
1130 1154
1131 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false)); 1155 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false));
1132 1156
1133 changes2()->clear(); 1157 changes2()->clear();
1134 1158
1159 ws_client2_->set_track_root_bounds_changes(true);
1160
1135 ws1()->SetWindowBounds(10, window_1_1, 1161 ws1()->SetWindowBounds(10, window_1_1,
1136 mojo::Rect::From(gfx::Rect(0, 0, 100, 100))); 1162 mojo::Rect::From(gfx::Rect(0, 0, 100, 100)));
1137 ASSERT_TRUE(ws_client1()->WaitForChangeCompleted(10)); 1163 ASSERT_TRUE(ws_client1()->WaitForChangeCompleted(10));
1138 1164
1139 ws_client2_->WaitForChangeCount(1); 1165 ws_client2_->WaitForChangeCount(1);
1140 EXPECT_EQ("BoundsChanged window=" + IdToString(window_1_1) + 1166 EXPECT_EQ("BoundsChanged window=" + IdToString(window_1_1) +
1141 " old_bounds=0,0 0x0 new_bounds=0,0 100x100", 1167 " old_bounds=0,0 0x0 new_bounds=0,0 100x100",
1142 SingleChangeToDescription(*changes2())); 1168 SingleChangeToDescription(*changes2()));
1143 1169
1144 // Should not be possible to change the bounds of a window created by another 1170 // Should not be possible to change the bounds of a window created by another
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 Id window_1_2 = ws_client1()->NewWindow(2); 1461 Id window_1_2 = ws_client1()->NewWindow(2);
1436 ASSERT_TRUE(window_1_2); 1462 ASSERT_TRUE(window_1_2);
1437 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_2, true)); 1463 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_2, true));
1438 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1)); 1464 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1));
1439 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_2)); 1465 ASSERT_TRUE(ws_client1()->AddWindow(window_1_1, window_1_2));
1440 1466
1441 // Establish the second connection at 1,2. 1467 // Establish the second connection at 1,2.
1442 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnectionWithRoot(window_1_2)); 1468 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnectionWithRoot(window_1_2));
1443 1469
1444 // Add 2,3 as a child of 1,2. 1470 // Add 2,3 as a child of 1,2.
1445 Id window_2_3 = ws_client2()->NewWindow(3); 1471 Id window_2_1 = ws_client2()->NewWindow(1);
1446 ASSERT_TRUE(window_2_3); 1472 ASSERT_TRUE(window_2_1);
1447 ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_3, true)); 1473 ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_1, true));
1448 ASSERT_TRUE(ws_client2()->AddWindow(window_1_2, window_2_3)); 1474 ASSERT_TRUE(ws_client2()->AddWindow(window_1_2, window_2_1));
1449 ASSERT_TRUE(ws_client1()->WaitForAllMessages()); 1475 ASSERT_TRUE(ws_client1()->WaitForAllMessages());
1450 1476
1451 changes2()->clear(); 1477 changes2()->clear();
1452 // Hide 1,2 from connection 1. Connection 2 should see this. 1478 // Hide 1,2 from connection 1. Connection 2 should see this.
1453 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_2, false)); 1479 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_2, false));
1454 { 1480 {
1455 ws_client2_->WaitForChangeCount(1); 1481 ws_client2_->WaitForChangeCount(1);
1456 EXPECT_EQ( 1482 EXPECT_EQ(
1457 "VisibilityChanged window=" + IdToString(window_1_2) + " visible=false", 1483 "VisibilityChanged window=" + IdToString(window_1_2) + " visible=false",
1458 SingleChangeToDescription(*changes2())); 1484 SingleChangeToDescription(*changes2()));
(...skipping 24 matching lines...) Expand all
1483 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_1, true)); 1509 ASSERT_TRUE(ws_client1()->SetWindowVisibility(window_1_1, true));
1484 { 1510 {
1485 ws_client2_->WaitForChangeCount(1); 1511 ws_client2_->WaitForChangeCount(1);
1486 EXPECT_EQ( 1512 EXPECT_EQ(
1487 "DrawnStateChanged window=" + IdToString(window_1_2) + " drawn=true", 1513 "DrawnStateChanged window=" + IdToString(window_1_2) + " drawn=true",
1488 SingleChangeToDescription(*changes2())); 1514 SingleChangeToDescription(*changes2()));
1489 } 1515 }
1490 1516
1491 // Change visibility of 2,3, connection 1 should see this. 1517 // Change visibility of 2,3, connection 1 should see this.
1492 changes1()->clear(); 1518 changes1()->clear();
1493 ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_3, false)); 1519 ASSERT_TRUE(ws_client2()->SetWindowVisibility(window_2_1, false));
1494 { 1520 {
1495 ws_client1_->WaitForChangeCount(1); 1521 ws_client1_->WaitForChangeCount(1);
1496 EXPECT_EQ( 1522 EXPECT_EQ(
1497 "VisibilityChanged window=" + IdToString(window_2_3) + " visible=false", 1523 "VisibilityChanged window=" + IdToString(window_2_1) + " visible=false",
1498 SingleChangeToDescription(*changes1())); 1524 SingleChangeToDescription(*changes1()));
1499 } 1525 }
1500 1526
1501 changes2()->clear(); 1527 changes2()->clear();
1502 // Remove 1,1 from the root, connection 2 should see drawn state changed. 1528 // Remove 1,1 from the root, connection 2 should see drawn state changed.
1503 ASSERT_TRUE(ws_client1()->RemoveWindowFromParent(window_1_1)); 1529 ASSERT_TRUE(ws_client1()->RemoveWindowFromParent(window_1_1));
1504 { 1530 {
1505 ws_client2_->WaitForChangeCount(1); 1531 ws_client2_->WaitForChangeCount(1);
1506 EXPECT_EQ( 1532 EXPECT_EQ(
1507 "DrawnStateChanged window=" + IdToString(window_1_2) + " drawn=false", 1533 "DrawnStateChanged window=" + IdToString(window_1_2) + " drawn=false",
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1564 EXPECT_EQ("PropertyChanged window=" + IdToString(window_1_1) + 1590 EXPECT_EQ("PropertyChanged window=" + IdToString(window_1_1) +
1565 " key=one value=NULL", 1591 " key=one value=NULL",
1566 SingleChangeToDescription(*changes2())); 1592 SingleChangeToDescription(*changes2()));
1567 } 1593 }
1568 } 1594 }
1569 1595
1570 TEST_F(WindowTreeAppTest, OnEmbeddedAppDisconnected) { 1596 TEST_F(WindowTreeAppTest, OnEmbeddedAppDisconnected) {
1571 // Create connection 2 and 3. 1597 // Create connection 2 and 3.
1572 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1598 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1573 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1599 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
1574 Id window_2_2 = ws_client2()->NewWindow(2); 1600 Id window_2_1 = ws_client2()->NewWindow(1);
1575 ASSERT_TRUE(window_2_2); 1601 ASSERT_TRUE(window_2_1);
1576 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1602 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
1577 changes2()->clear(); 1603 changes2()->clear();
1578 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2)); 1604 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1));
1579 1605
1580 // Connection 1 should get a hierarchy change for window_2_2. 1606 // Connection 1 should get a hierarchy change for window_2_1.
1581 ws_client1_->WaitForChangeCount(1); 1607 ws_client1_->WaitForChangeCount(1);
1582 changes1()->clear(); 1608 changes1()->clear();
1583 1609
1584 // Close connection 3. Connection 2 (which had previously embedded 3) should 1610 // Close connection 3. Connection 2 (which had previously embedded 3) should
1585 // be notified of this. 1611 // be notified of this.
1586 ws_client3_.reset(); 1612 ws_client3_.reset();
1587 ws_client2_->WaitForChangeCount(1); 1613 ws_client2_->WaitForChangeCount(1);
1588 EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_2), 1614 EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_1),
1589 SingleChangeToDescription(*changes2())); 1615 SingleChangeToDescription(*changes2()));
1590 1616
1591 ws_client1_->WaitForChangeCount(1); 1617 ws_client1_->WaitForChangeCount(1);
1592 EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_2), 1618 EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_1),
1593 SingleChangeToDescription(*changes1())); 1619 SingleChangeToDescription(*changes1()));
1594 } 1620 }
1595 1621
1596 // Verifies when the parent of an Embed() is destroyed the embedded app gets 1622 // Verifies when the parent of an Embed() is destroyed the embedded app gets
1597 // a WindowDeleted (and doesn't trigger a DCHECK). 1623 // a WindowDeleted (and doesn't trigger a DCHECK).
1598 TEST_F(WindowTreeAppTest, OnParentOfEmbedDisconnects) { 1624 TEST_F(WindowTreeAppTest, OnParentOfEmbedDisconnects) {
1599 // Create connection 2 and 3. 1625 // Create connection 2 and 3.
1600 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1626 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1601 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1627 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
1602 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1)); 1628 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_1));
1629 Id window_2_1 = ws_client2()->NewWindow(1);
1603 Id window_2_2 = ws_client2()->NewWindow(2); 1630 Id window_2_2 = ws_client2()->NewWindow(2);
1604 Id window_2_3 = ws_client2()->NewWindow(3); 1631 ASSERT_TRUE(window_2_1);
1605 ASSERT_TRUE(window_2_2); 1632 ASSERT_TRUE(window_2_2);
1606 ASSERT_TRUE(window_2_3); 1633 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
1607 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1634 ASSERT_TRUE(ws_client2()->AddWindow(window_2_1, window_2_2));
1608 ASSERT_TRUE(ws_client2()->AddWindow(window_2_2, window_2_3));
1609 changes2()->clear(); 1635 changes2()->clear();
1610 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_3)); 1636 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2));
1611 changes3()->clear(); 1637 changes3()->clear();
1612 1638
1613 // Close connection 2. Connection 3 should get a delete (for its root). 1639 // Close connection 2. Connection 3 should get a delete (for its root).
1614 ws_client2_.reset(); 1640 ws_client2_.reset();
1615 ws_client3_->WaitForChangeCount(1); 1641 ws_client3_->WaitForChangeCount(1);
1616 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_3), 1642 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2),
1617 SingleChangeToDescription(*changes3())); 1643 SingleChangeToDescription(*changes3()));
1618 } 1644 }
1619 1645
1620 // Verifies WindowTreeImpl doesn't incorrectly erase from its internal 1646 // Verifies WindowTreeImpl doesn't incorrectly erase from its internal
1621 // map when a window from another connection with the same window_id is removed. 1647 // map when a window from another connection with the same window_id is removed.
1622 TEST_F(WindowTreeAppTest, DontCleanMapOnDestroy) { 1648 TEST_F(WindowTreeAppTest, DontCleanMapOnDestroy) {
1623 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1649 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1624 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1650 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
1625 ASSERT_TRUE(ws_client2()->NewWindow(1)); 1651 ASSERT_TRUE(ws_client2()->NewWindow(1));
1626 changes1()->clear(); 1652 changes1()->clear();
(...skipping 17 matching lines...) Expand all
1644 std::move(client2_ptr))); 1670 std::move(client2_ptr)));
1645 client2.WaitForOnEmbed(); 1671 client2.WaitForOnEmbed();
1646 EXPECT_EQ("OnEmbed", 1672 EXPECT_EQ("OnEmbed",
1647 SingleChangeToDescription(*client2.tracker()->changes())); 1673 SingleChangeToDescription(*client2.tracker()->changes()));
1648 } 1674 }
1649 1675
1650 TEST_F(WindowTreeAppTest, EmbedFailsFromOtherConnection) { 1676 TEST_F(WindowTreeAppTest, EmbedFailsFromOtherConnection) {
1651 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1677 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1652 1678
1653 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1679 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
1654 Id window_2_2 = ws_client2()->NewWindow(2); 1680 Id window_2_1 = ws_client2()->NewWindow(1);
1655 ASSERT_TRUE(window_2_2); 1681 ASSERT_TRUE(window_2_1);
1656 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1682 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
1657 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_2)); 1683 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1));
1658 1684
1659 Id window_3_3 = ws_client3()->NewWindow(3); 1685 Id window_3_3 = ws_client3()->NewWindow(3);
1660 ASSERT_TRUE(window_3_3); 1686 ASSERT_TRUE(window_3_3);
1661 ASSERT_TRUE(ws_client3()->AddWindow(window_2_2, window_3_3)); 1687 ASSERT_TRUE(ws_client3()->AddWindow(window_2_1, window_3_3));
1662 1688
1663 // 2 should not be able to embed in window_3_3 as window_3_3 was not created 1689 // 2 should not be able to embed in window_3_3 as window_3_3 was not created
1664 // by 1690 // by
1665 // 2. 1691 // 2.
1666 EXPECT_FALSE(EmbedUrl(application_impl(), ws2(), application_impl()->url(), 1692 EXPECT_FALSE(EmbedUrl(application_impl(), ws2(), application_impl()->url(),
1667 window_3_3)); 1693 window_3_3));
1668 } 1694 }
1669 1695
1670 // Verifies Embed() from window manager on another connections window works. 1696 // Verifies Embed() from window manager on another connections window works.
1671 TEST_F(WindowTreeAppTest, EmbedFromOtherConnection) { 1697 TEST_F(WindowTreeAppTest, EmbedFromOtherConnection) {
1672 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1698 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
1673 1699
1674 Id window_1_1 = BuildWindowId(connection_id_1(), 1); 1700 Id window_1_1 = BuildWindowId(connection_id_1(), 1);
1675 Id window_2_2 = ws_client2()->NewWindow(2); 1701 Id window_2_1 = ws_client2()->NewWindow(1);
1676 ASSERT_TRUE(window_2_2); 1702 ASSERT_TRUE(window_2_1);
1677 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_2)); 1703 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1));
1678 1704
1679 changes2()->clear(); 1705 changes2()->clear();
1680 1706
1681 // Establish a third connection in window_2_2. 1707 // Establish a third connection in window_2_1.
1682 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws1(), window_2_2)); 1708 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws1(), window_2_1));
1683 1709
1684 ASSERT_TRUE(ws_client2()->WaitForAllMessages()); 1710 ASSERT_TRUE(ws_client2()->WaitForAllMessages());
1685 EXPECT_EQ(std::string(), SingleChangeToDescription(*changes2())); 1711 EXPECT_EQ(std::string(), SingleChangeToDescription(*changes2()));
1686 } 1712 }
1687 1713
1688 TEST_F(WindowTreeAppTest, CantEmbedFromConnectionRoot) { 1714 TEST_F(WindowTreeAppTest, CantEmbedFromConnectionRoot) {
1689 // Shouldn't be able to embed into the root. 1715 // Shouldn't be able to embed into the root.
1690 ASSERT_FALSE(EmbedUrl(application_impl(), ws1(), application_impl()->url(), 1716 ASSERT_FALSE(EmbedUrl(application_impl(), ws1(), application_impl()->url(),
1691 root_window_id())); 1717 root_window_id()));
1692 1718
(...skipping 11 matching lines...) Expand all
1704 WaitForWindowTreeClient(); 1730 WaitForWindowTreeClient();
1705 1731
1706 Id window_1_2 = ws_client1()->NewWindow(2); 1732 Id window_1_2 = ws_client1()->NewWindow(2);
1707 ASSERT_TRUE(window_1_2); 1733 ASSERT_TRUE(window_1_2);
1708 ASSERT_TRUE( 1734 ASSERT_TRUE(
1709 ws_client1()->AddWindow(BuildWindowId(connection_id_1(), 1), window_1_2)); 1735 ws_client1()->AddWindow(BuildWindowId(connection_id_1(), 1), window_1_2));
1710 ASSERT_TRUE(ws_client3_.get() == nullptr); 1736 ASSERT_TRUE(ws_client3_.get() == nullptr);
1711 ws_client3_ = EstablishConnectionViaEmbedWithPolicyBitmask( 1737 ws_client3_ = EstablishConnectionViaEmbedWithPolicyBitmask(
1712 ws1(), window_1_2, mojom::WindowTree::kAccessPolicyEmbedRoot, nullptr); 1738 ws1(), window_1_2, mojom::WindowTree::kAccessPolicyEmbedRoot, nullptr);
1713 ASSERT_TRUE(ws_client3_.get() != nullptr); 1739 ASSERT_TRUE(ws_client3_.get() != nullptr);
1714 ws_client3_->set_root_window(root_window_id());
1715 1740
1716 // window_1_2 is ws3's root, so even though v3 is an embed root it should not 1741 // window_1_2 is ws3's root, so even though v3 is an embed root it should not
1717 // be able to Embed into itself. 1742 // be able to Embed into itself.
1718 ASSERT_FALSE(EmbedUrl(application_impl(), ws3(), application_impl()->url(), 1743 ASSERT_FALSE(EmbedUrl(application_impl(), ws3(), application_impl()->url(),
1719 window_1_2)); 1744 window_1_2));
1720 } 1745 }
1721 1746
1722 // Verifies that a transient window tracks its parent's lifetime. 1747 // Verifies that a transient window tracks its parent's lifetime.
1723 TEST_F(WindowTreeAppTest, TransientWindowTracksTransientParentLifetime) { 1748 TEST_F(WindowTreeAppTest, TransientWindowTracksTransientParentLifetime) {
1724 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); 1749 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1758 1783
1759 changes1()->clear(); 1784 changes1()->clear();
1760 ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_1)); 1785 ASSERT_TRUE(ws_client2()->DeleteWindow(window_2_1));
1761 ws_client1()->WaitForChangeCount(2); 1786 ws_client1()->WaitForChangeCount(2);
1762 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2), 1787 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_2),
1763 ChangesToDescription1(*changes1())[0]); 1788 ChangesToDescription1(*changes1())[0]);
1764 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_1), 1789 EXPECT_EQ("WindowDeleted window=" + IdToString(window_2_1),
1765 ChangesToDescription1(*changes1())[1]); 1790 ChangesToDescription1(*changes1())[1]);
1766 } 1791 }
1767 1792
1793 TEST_F(WindowTreeAppTest, Ids) {
1794 const Id window_1_100 = ws_client1()->NewWindow(100);
1795 ASSERT_TRUE(window_1_100);
1796 ASSERT_TRUE(ws_client1()->AddWindow(root_window_id(), window_1_100));
1797
1798 // Establish the second connection at 1,100.
1799 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnectionWithRoot(window_1_100));
1800
1801 // 1,100 is the id in the ws_client1's id space. The new client should see
1802 // 2,1 (the server id).
1803 const Id window_1_100_in_ws2 = BuildWindowId(connection_id_1(), 1);
1804 EXPECT_EQ(window_1_100_in_ws2, ws_client2()->root_window_id());
1805
1806 // The first window created in the second connection gets a server id of 2,1
1807 // regardless of the id the client uses.
1808 const Id window_2_101 = ws_client2()->NewWindow(101);
1809 ASSERT_TRUE(ws_client2()->AddWindow(window_1_100_in_ws2, window_2_101));
1810 const Id window_2_101_in_ws1 = BuildWindowId(connection_id_2(), 1);
1811 ws_client1()->WaitForChangeCount(1);
1812 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_101_in_ws1) +
1813 " new_parent=" + IdToString(window_1_100) + " old_parent=null",
1814 SingleChangeToDescription(*changes1()));
1815 changes1()->clear();
1816
1817 // Change the bounds of window_2_101 and make sure server gets it.
1818 ws2()->SetWindowBounds(11, window_2_101,
1819 mojo::Rect::From(gfx::Rect(1, 2, 3, 4)));
1820 ASSERT_TRUE(ws_client2()->WaitForChangeCompleted(11));
1821 ws_client1()->WaitForChangeCount(1);
1822 EXPECT_EQ("BoundsChanged window=" + IdToString(window_2_101_in_ws1) +
1823 " old_bounds=0,0 0x0 new_bounds=1,2 3x4",
1824 SingleChangeToDescription(*changes1()));
1825 changes2()->clear();
1826
1827 // Remove 2_101 from wm, client1 should see the change.
1828 ws1()->RemoveWindowFromParent(12, window_2_101_in_ws1);
1829 ASSERT_TRUE(ws_client1()->WaitForChangeCompleted(12));
1830 ws_client2()->WaitForChangeCount(1);
1831 EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_101) +
1832 " new_parent=null old_parent=" +
1833 IdToString(window_1_100_in_ws2),
1834 SingleChangeToDescription(*changes2()));
1835 }
1836
1768 // TODO(sky): need to better track changes to initial connection. For example, 1837 // TODO(sky): need to better track changes to initial connection. For example,
1769 // that SetBounsdWindows/AddWindow and the like don't result in messages to the 1838 // that SetBounsdWindows/AddWindow and the like don't result in messages to the
1770 // originating connection. 1839 // originating connection.
1771 1840
1772 // TODO(sky): make sure coverage of what was 1841 // TODO(sky): make sure coverage of what was
1773 // WindowManagerTest.SecondEmbedRoot_InitService and 1842 // WindowManagerTest.SecondEmbedRoot_InitService and
1774 // WindowManagerTest.MultipleEmbedRootsBeforeWTHReady gets added to window 1843 // WindowManagerTest.MultipleEmbedRootsBeforeWTHReady gets added to window
1775 // manager 1844 // manager
1776 // tests. 1845 // tests.
1777 1846
1778 } // namespace ws 1847 } // namespace ws
1779 } // namespace mus 1848 } // namespace mus
OLDNEW
« no previous file with comments | « components/mus/ws/window_finder.cc ('k') | components/mus/ws/window_tree_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698