| OLD | NEW |
| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "components/view_manager/ids.h" | 8 #include "components/view_manager/ids.h" |
| 9 #include "components/view_manager/public/interfaces/view_manager.mojom.h" | 9 #include "components/view_manager/public/interfaces/view_manager.mojom.h" |
| 10 #include "components/view_manager/public/interfaces/view_manager_root.mojom.h" |
| 10 #include "components/view_manager/test_change_tracker.h" | 11 #include "components/view_manager/test_change_tracker.h" |
| 11 #include "components/window_manager/public/interfaces/window_manager.mojom.h" | |
| 12 #include "components/window_manager/public/interfaces/window_manager_internal.mo
jom.h" | |
| 13 #include "mojo/application/application_test_base_chromium.h" | 12 #include "mojo/application/application_test_base_chromium.h" |
| 14 #include "mojo/application/public/cpp/application_delegate.h" | 13 #include "mojo/application/public/cpp/application_delegate.h" |
| 15 #include "mojo/application/public/cpp/application_impl.h" | 14 #include "mojo/application/public/cpp/application_impl.h" |
| 16 | 15 |
| 17 using mojo::ApplicationConnection; | 16 using mojo::ApplicationConnection; |
| 18 using mojo::ApplicationDelegate; | 17 using mojo::ApplicationDelegate; |
| 19 using mojo::Array; | 18 using mojo::Array; |
| 20 using mojo::Callback; | 19 using mojo::Callback; |
| 21 using mojo::ConnectionSpecificId; | 20 using mojo::ConnectionSpecificId; |
| 22 using mojo::ERROR_CODE_NONE; | 21 using mojo::ERROR_CODE_NONE; |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 if (run_loop_.get()) | 387 if (run_loop_.get()) |
| 389 run_loop_->Quit(); | 388 run_loop_->Quit(); |
| 390 } | 389 } |
| 391 | 390 |
| 392 scoped_ptr<ViewManagerClientImpl> client_impl_; | 391 scoped_ptr<ViewManagerClientImpl> client_impl_; |
| 393 scoped_ptr<base::RunLoop> run_loop_; | 392 scoped_ptr<base::RunLoop> run_loop_; |
| 394 | 393 |
| 395 DISALLOW_COPY_AND_ASSIGN(ViewManagerClientFactory); | 394 DISALLOW_COPY_AND_ASSIGN(ViewManagerClientFactory); |
| 396 }; | 395 }; |
| 397 | 396 |
| 398 class ViewManagerServiceAppTest | 397 class ViewManagerServiceAppTest : public mojo::test::ApplicationTestBase, |
| 399 : public mojo::test::ApplicationTestBase, | 398 public ApplicationDelegate { |
| 400 public ApplicationDelegate, | |
| 401 public mojo::InterfaceFactory<mojo::WindowManagerInternal>, | |
| 402 public mojo::WindowManagerInternal { | |
| 403 public: | 399 public: |
| 404 ViewManagerServiceAppTest() : wm_internal_binding_(this) {} | 400 ViewManagerServiceAppTest() {} |
| 405 ~ViewManagerServiceAppTest() override {} | 401 ~ViewManagerServiceAppTest() override {} |
| 406 | 402 |
| 407 protected: | 403 protected: |
| 408 // Returns the changes from the various connections. | 404 // Returns the changes from the various connections. |
| 409 std::vector<Change>* changes1() { return vm_client1_.tracker()->changes(); } | 405 std::vector<Change>* changes1() { return vm_client1_->tracker()->changes(); } |
| 410 std::vector<Change>* changes2() { return vm_client2_->tracker()->changes(); } | 406 std::vector<Change>* changes2() { return vm_client2_->tracker()->changes(); } |
| 411 std::vector<Change>* changes3() { return vm_client3_->tracker()->changes(); } | 407 std::vector<Change>* changes3() { return vm_client3_->tracker()->changes(); } |
| 412 | 408 |
| 413 // Various connections. |vm1()|, being the first connection, has special | 409 // Various connections. |vm1()|, being the first connection, has special |
| 414 // permissions (it's treated as the window manager). | 410 // permissions (it's treated as the window manager). |
| 415 ViewManagerService* vm1() { return vm1_.get(); } | 411 ViewManagerService* vm1() { return vm1_.get(); } |
| 416 ViewManagerService* vm2() { return vm_client2_->service(); } | 412 ViewManagerService* vm2() { return vm_client2_->service(); } |
| 417 ViewManagerService* vm3() { return vm_client3_->service(); } | 413 ViewManagerService* vm3() { return vm_client3_->service(); } |
| 418 | 414 |
| 419 void EstablishSecondConnectionWithRoot(Id root_id) { | 415 void EstablishSecondConnectionWithRoot(Id root_id) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 448 return nullptr; | 444 return nullptr; |
| 449 } | 445 } |
| 450 scoped_ptr<ViewManagerClientImpl> client = | 446 scoped_ptr<ViewManagerClientImpl> client = |
| 451 client_factory_.WaitForInstance(); | 447 client_factory_.WaitForInstance(); |
| 452 if (!client.get()) { | 448 if (!client.get()) { |
| 453 ADD_FAILURE() << "WaitForInstance failed"; | 449 ADD_FAILURE() << "WaitForInstance failed"; |
| 454 return nullptr; | 450 return nullptr; |
| 455 } | 451 } |
| 456 client->WaitForOnEmbed(); | 452 client->WaitForOnEmbed(); |
| 457 | 453 |
| 458 const std::string expected_creator = | 454 EXPECT_EQ("OnEmbed creator=" + application_impl()->url(), |
| 459 owner == vm1() ? "mojo:window_manager" : application_impl()->url(); | |
| 460 EXPECT_EQ("OnEmbed creator=" + expected_creator, | |
| 461 SingleChangeToDescription(*client->tracker()->changes())); | 455 SingleChangeToDescription(*client->tracker()->changes())); |
| 462 return client.Pass(); | 456 return client.Pass(); |
| 463 } | 457 } |
| 464 | 458 |
| 465 // ApplicationTestBase: | 459 // ApplicationTestBase: |
| 466 ApplicationDelegate* GetApplicationDelegate() override { return this; } | 460 ApplicationDelegate* GetApplicationDelegate() override { return this; } |
| 467 void SetUp() override { | 461 void SetUp() override { |
| 468 ApplicationTestBase::SetUp(); | 462 ApplicationTestBase::SetUp(); |
| 469 ApplicationConnection* vm_connection = | 463 ApplicationConnection* vm_connection = |
| 470 application_impl()->ConnectToApplication("mojo:view_manager"); | 464 application_impl()->ConnectToApplication("mojo:view_manager"); |
| 471 vm_connection->AddService(this); | |
| 472 vm_connection->ConnectToService(&vm1_); | 465 vm_connection->ConnectToService(&vm1_); |
| 473 vm_connection->ConnectToService(&wm_internal_client_); | 466 vm_connection->ConnectToService(&view_manager_root_); |
| 474 // Spin a run loop until the view manager service sends us the | 467 vm_connection->AddService(&client_factory_); |
| 475 // ViewManagerClient pipe to use for the "window manager" connection. | 468 vm_client1_ = client_factory_.WaitForInstance(); |
| 476 view_manager_setup_run_loop_.reset(new base::RunLoop); | 469 ASSERT_TRUE(vm_client1_); |
| 477 view_manager_setup_run_loop_->Run(); | |
| 478 view_manager_setup_run_loop_ = nullptr; | |
| 479 // Next we should get an embed call on the "window manager" client. | 470 // Next we should get an embed call on the "window manager" client. |
| 480 vm_client1_.WaitForIncomingMethodCall(); | 471 vm_client1_->WaitForIncomingMethodCall(); |
| 481 ASSERT_EQ(1u, changes1()->size()); | 472 ASSERT_EQ(1u, changes1()->size()); |
| 482 EXPECT_EQ(CHANGE_TYPE_EMBED, (*changes1())[0].type); | 473 EXPECT_EQ(CHANGE_TYPE_EMBED, (*changes1())[0].type); |
| 483 // All these tests assume 1 for the client id. The only real assertion here | 474 // All these tests assume 1 for the client id. The only real assertion here |
| 484 // is the client id is not zero, but adding this as rest of code here | 475 // is the client id is not zero, but adding this as rest of code here |
| 485 // assumes 1. | 476 // assumes 1. |
| 486 ASSERT_EQ(1, (*changes1())[0].connection_id); | 477 ASSERT_EQ(1, (*changes1())[0].connection_id); |
| 487 changes1()->clear(); | 478 changes1()->clear(); |
| 488 } | 479 } |
| 489 | 480 |
| 490 // ApplicationDelegate implementation. | 481 // ApplicationDelegate implementation. |
| 491 bool ConfigureIncomingConnection(ApplicationConnection* connection) override { | 482 bool ConfigureIncomingConnection(ApplicationConnection* connection) override { |
| 492 connection->AddService(&client_factory_); | 483 connection->AddService(&client_factory_); |
| 493 return true; | 484 return true; |
| 494 } | 485 } |
| 495 | 486 |
| 496 // mojo::InterfaceFactory<mojo::WindowManagerInternal> implementation. | 487 scoped_ptr<ViewManagerClientImpl> vm_client1_; |
| 497 void Create( | |
| 498 ApplicationConnection* connection, | |
| 499 mojo::InterfaceRequest<mojo::WindowManagerInternal> request) override { | |
| 500 DCHECK(!wm_internal_binding_.is_bound()); | |
| 501 wm_internal_binding_.Bind(request.Pass()); | |
| 502 } | |
| 503 | |
| 504 // mojo::WindowManagerInternal implementation. | |
| 505 void SetViewManagerClient( | |
| 506 mojo::ScopedMessagePipeHandle view_manager_client_request) override { | |
| 507 auto typed_request = mojo::MakeRequest<mojo::ViewManagerClient>( | |
| 508 view_manager_client_request.Pass()); | |
| 509 vm_client1_.Bind(typed_request.Pass()); | |
| 510 view_manager_setup_run_loop_->Quit(); | |
| 511 } | |
| 512 void OnAccelerator(mojo::EventPtr event) override {} | |
| 513 | |
| 514 mojo::Binding<mojo::WindowManagerInternal> wm_internal_binding_; | |
| 515 mojo::WindowManagerInternalClientPtr wm_internal_client_; | |
| 516 ViewManagerClientImpl vm_client1_; | |
| 517 scoped_ptr<ViewManagerClientImpl> vm_client2_; | 488 scoped_ptr<ViewManagerClientImpl> vm_client2_; |
| 518 scoped_ptr<ViewManagerClientImpl> vm_client3_; | 489 scoped_ptr<ViewManagerClientImpl> vm_client3_; |
| 519 | 490 |
| 491 mojo::ViewManagerRootPtr view_manager_root_; |
| 492 |
| 520 private: | 493 private: |
| 521 mojo::ViewManagerServicePtr vm1_; | 494 mojo::ViewManagerServicePtr vm1_; |
| 522 ViewManagerClientFactory client_factory_; | 495 ViewManagerClientFactory client_factory_; |
| 523 scoped_ptr<base::RunLoop> view_manager_setup_run_loop_; | |
| 524 | 496 |
| 525 MOJO_DISALLOW_COPY_AND_ASSIGN(ViewManagerServiceAppTest); | 497 MOJO_DISALLOW_COPY_AND_ASSIGN(ViewManagerServiceAppTest); |
| 526 }; | 498 }; |
| 527 | 499 |
| 528 // Verifies two clients/connections get different ids. | 500 // Verifies two clients/connections get different ids. |
| 529 TEST_F(ViewManagerServiceAppTest, TwoClientsGetDifferentConnectionIds) { | 501 TEST_F(ViewManagerServiceAppTest, TwoClientsGetDifferentConnectionIds) { |
| 530 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 502 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 531 | 503 |
| 532 // It isn't strictly necessary that the second connection gets 2, but these | 504 // It isn't strictly necessary that the second connection gets 2, but these |
| 533 // tests are written assuming that is the case. The key thing is the | 505 // tests are written assuming that is the case. The key thing is the |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 // Set up the hierarchy. | 765 // Set up the hierarchy. |
| 794 ASSERT_TRUE(AddView(vm1(), BuildViewId(0, 1), BuildViewId(1, 1))); | 766 ASSERT_TRUE(AddView(vm1(), BuildViewId(0, 1), BuildViewId(1, 1))); |
| 795 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 11))); | 767 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 11))); |
| 796 ASSERT_TRUE(AddView(vm2(), BuildViewId(2, 2), BuildViewId(2, 21))); | 768 ASSERT_TRUE(AddView(vm2(), BuildViewId(2, 2), BuildViewId(2, 21))); |
| 797 | 769 |
| 798 // Remove 11, should result in a hierarchy change for the root. | 770 // Remove 11, should result in a hierarchy change for the root. |
| 799 { | 771 { |
| 800 changes1()->clear(); | 772 changes1()->clear(); |
| 801 ASSERT_TRUE(RemoveViewFromParent(vm2(), BuildViewId(2, 11))); | 773 ASSERT_TRUE(RemoveViewFromParent(vm2(), BuildViewId(2, 11))); |
| 802 | 774 |
| 803 vm_client1_.WaitForChangeCount(1); | 775 vm_client1_->WaitForChangeCount(1); |
| 804 EXPECT_EQ("HierarchyChanged view=2,11 new_parent=null old_parent=1,1", | 776 EXPECT_EQ("HierarchyChanged view=2,11 new_parent=null old_parent=1,1", |
| 805 SingleChangeToDescription(*changes1())); | 777 SingleChangeToDescription(*changes1())); |
| 806 } | 778 } |
| 807 | 779 |
| 808 // Add 2 to 1. | 780 // Add 2 to 1. |
| 809 { | 781 { |
| 810 changes1()->clear(); | 782 changes1()->clear(); |
| 811 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); | 783 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); |
| 812 | 784 |
| 813 vm_client1_.WaitForChangeCount(1); | 785 vm_client1_->WaitForChangeCount(1); |
| 814 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", | 786 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", |
| 815 SingleChangeToDescription(*changes1())); | 787 SingleChangeToDescription(*changes1())); |
| 816 EXPECT_EQ( | 788 EXPECT_EQ( |
| 817 "[view=2,2 parent=1,1]," | 789 "[view=2,2 parent=1,1]," |
| 818 "[view=2,21 parent=2,2]", | 790 "[view=2,21 parent=2,2]", |
| 819 ChangeViewDescription(*changes1())); | 791 ChangeViewDescription(*changes1())); |
| 820 } | 792 } |
| 821 } | 793 } |
| 822 | 794 |
| 823 TEST_F(ViewManagerServiceAppTest, ReorderView) { | 795 TEST_F(ViewManagerServiceAppTest, ReorderView) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 843 ASSERT_TRUE(AddView(vm2(), view2_id, view6_id)); | 815 ASSERT_TRUE(AddView(vm2(), view2_id, view6_id)); |
| 844 ASSERT_TRUE(AddView(vm2(), view1_id, view3_id)); | 816 ASSERT_TRUE(AddView(vm2(), view1_id, view3_id)); |
| 845 ASSERT_TRUE(AddView(vm1(), ViewIdToTransportId(RootViewId()), view4_id)); | 817 ASSERT_TRUE(AddView(vm1(), ViewIdToTransportId(RootViewId()), view4_id)); |
| 846 ASSERT_TRUE(AddView(vm1(), ViewIdToTransportId(RootViewId()), view5_id)); | 818 ASSERT_TRUE(AddView(vm1(), ViewIdToTransportId(RootViewId()), view5_id)); |
| 847 ASSERT_TRUE(AddView(vm1(), ViewIdToTransportId(RootViewId()), view1_id)); | 819 ASSERT_TRUE(AddView(vm1(), ViewIdToTransportId(RootViewId()), view1_id)); |
| 848 | 820 |
| 849 { | 821 { |
| 850 changes1()->clear(); | 822 changes1()->clear(); |
| 851 ASSERT_TRUE(ReorderView(vm2(), view2_id, view3_id, ORDER_DIRECTION_ABOVE)); | 823 ASSERT_TRUE(ReorderView(vm2(), view2_id, view3_id, ORDER_DIRECTION_ABOVE)); |
| 852 | 824 |
| 853 vm_client1_.WaitForChangeCount(1); | 825 vm_client1_->WaitForChangeCount(1); |
| 854 EXPECT_EQ("Reordered view=2,2 relative=2,3 direction=above", | 826 EXPECT_EQ("Reordered view=2,2 relative=2,3 direction=above", |
| 855 SingleChangeToDescription(*changes1())); | 827 SingleChangeToDescription(*changes1())); |
| 856 } | 828 } |
| 857 | 829 |
| 858 { | 830 { |
| 859 changes1()->clear(); | 831 changes1()->clear(); |
| 860 ASSERT_TRUE(ReorderView(vm2(), view2_id, view3_id, ORDER_DIRECTION_BELOW)); | 832 ASSERT_TRUE(ReorderView(vm2(), view2_id, view3_id, ORDER_DIRECTION_BELOW)); |
| 861 | 833 |
| 862 vm_client1_.WaitForChangeCount(1); | 834 vm_client1_->WaitForChangeCount(1); |
| 863 EXPECT_EQ("Reordered view=2,2 relative=2,3 direction=below", | 835 EXPECT_EQ("Reordered view=2,2 relative=2,3 direction=below", |
| 864 SingleChangeToDescription(*changes1())); | 836 SingleChangeToDescription(*changes1())); |
| 865 } | 837 } |
| 866 | 838 |
| 867 // view2 is already below view3. | 839 // view2 is already below view3. |
| 868 EXPECT_FALSE(ReorderView(vm2(), view2_id, view3_id, ORDER_DIRECTION_BELOW)); | 840 EXPECT_FALSE(ReorderView(vm2(), view2_id, view3_id, ORDER_DIRECTION_BELOW)); |
| 869 | 841 |
| 870 // view4 & 5 are unknown to connection2_. | 842 // view4 & 5 are unknown to connection2_. |
| 871 EXPECT_FALSE(ReorderView(vm2(), view4_id, view5_id, ORDER_DIRECTION_ABOVE)); | 843 EXPECT_FALSE(ReorderView(vm2(), view4_id, view5_id, ORDER_DIRECTION_ABOVE)); |
| 872 | 844 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 883 | 855 |
| 884 // Verifies DeleteView works. | 856 // Verifies DeleteView works. |
| 885 TEST_F(ViewManagerServiceAppTest, DeleteView) { | 857 TEST_F(ViewManagerServiceAppTest, DeleteView) { |
| 886 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 858 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 887 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); | 859 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); |
| 888 | 860 |
| 889 // Make 2 a child of 1. | 861 // Make 2 a child of 1. |
| 890 { | 862 { |
| 891 changes1()->clear(); | 863 changes1()->clear(); |
| 892 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); | 864 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); |
| 893 vm_client1_.WaitForChangeCount(1); | 865 vm_client1_->WaitForChangeCount(1); |
| 894 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", | 866 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", |
| 895 SingleChangeToDescription(*changes1())); | 867 SingleChangeToDescription(*changes1())); |
| 896 } | 868 } |
| 897 | 869 |
| 898 // Delete 2. | 870 // Delete 2. |
| 899 { | 871 { |
| 900 changes1()->clear(); | 872 changes1()->clear(); |
| 901 changes2()->clear(); | 873 changes2()->clear(); |
| 902 ASSERT_TRUE(DeleteView(vm2(), BuildViewId(2, 2))); | 874 ASSERT_TRUE(DeleteView(vm2(), BuildViewId(2, 2))); |
| 903 EXPECT_TRUE(changes2()->empty()); | 875 EXPECT_TRUE(changes2()->empty()); |
| 904 | 876 |
| 905 vm_client1_.WaitForChangeCount(1); | 877 vm_client1_->WaitForChangeCount(1); |
| 906 EXPECT_EQ("ViewDeleted view=2,2", SingleChangeToDescription(*changes1())); | 878 EXPECT_EQ("ViewDeleted view=2,2", SingleChangeToDescription(*changes1())); |
| 907 } | 879 } |
| 908 } | 880 } |
| 909 | 881 |
| 910 // Verifies DeleteView isn't allowed from a separate connection. | 882 // Verifies DeleteView isn't allowed from a separate connection. |
| 911 TEST_F(ViewManagerServiceAppTest, DeleteViewFromAnotherConnectionDisallowed) { | 883 TEST_F(ViewManagerServiceAppTest, DeleteViewFromAnotherConnectionDisallowed) { |
| 912 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 884 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 913 EXPECT_FALSE(DeleteView(vm2(), BuildViewId(1, 1))); | 885 EXPECT_FALSE(DeleteView(vm2(), BuildViewId(1, 1))); |
| 914 } | 886 } |
| 915 | 887 |
| 916 // Verifies if a view was deleted and then reused that other clients are | 888 // Verifies if a view was deleted and then reused that other clients are |
| 917 // properly notified. | 889 // properly notified. |
| 918 TEST_F(ViewManagerServiceAppTest, ReuseDeletedViewId) { | 890 TEST_F(ViewManagerServiceAppTest, ReuseDeletedViewId) { |
| 919 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 891 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 920 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); | 892 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); |
| 921 | 893 |
| 922 // Add 2 to 1. | 894 // Add 2 to 1. |
| 923 { | 895 { |
| 924 changes1()->clear(); | 896 changes1()->clear(); |
| 925 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); | 897 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); |
| 926 | 898 |
| 927 vm_client1_.WaitForChangeCount(1); | 899 vm_client1_->WaitForChangeCount(1); |
| 928 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", | 900 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", |
| 929 SingleChangeToDescription(*changes1())); | 901 SingleChangeToDescription(*changes1())); |
| 930 EXPECT_EQ("[view=2,2 parent=1,1]", ChangeViewDescription(*changes1())); | 902 EXPECT_EQ("[view=2,2 parent=1,1]", ChangeViewDescription(*changes1())); |
| 931 } | 903 } |
| 932 | 904 |
| 933 // Delete 2. | 905 // Delete 2. |
| 934 { | 906 { |
| 935 changes1()->clear(); | 907 changes1()->clear(); |
| 936 ASSERT_TRUE(DeleteView(vm2(), BuildViewId(2, 2))); | 908 ASSERT_TRUE(DeleteView(vm2(), BuildViewId(2, 2))); |
| 937 | 909 |
| 938 vm_client1_.WaitForChangeCount(1); | 910 vm_client1_->WaitForChangeCount(1); |
| 939 EXPECT_EQ("ViewDeleted view=2,2", SingleChangeToDescription(*changes1())); | 911 EXPECT_EQ("ViewDeleted view=2,2", SingleChangeToDescription(*changes1())); |
| 940 } | 912 } |
| 941 | 913 |
| 942 // Create 2 again, and add it back to 1. Should get the same notification. | 914 // Create 2 again, and add it back to 1. Should get the same notification. |
| 943 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); | 915 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); |
| 944 { | 916 { |
| 945 changes1()->clear(); | 917 changes1()->clear(); |
| 946 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); | 918 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); |
| 947 | 919 |
| 948 vm_client1_.WaitForChangeCount(1); | 920 vm_client1_->WaitForChangeCount(1); |
| 949 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", | 921 EXPECT_EQ("HierarchyChanged view=2,2 new_parent=1,1 old_parent=null", |
| 950 SingleChangeToDescription(*changes1())); | 922 SingleChangeToDescription(*changes1())); |
| 951 EXPECT_EQ("[view=2,2 parent=1,1]", ChangeViewDescription(*changes1())); | 923 EXPECT_EQ("[view=2,2 parent=1,1]", ChangeViewDescription(*changes1())); |
| 952 } | 924 } |
| 953 } | 925 } |
| 954 | 926 |
| 955 // Assertions for GetViewTree. | 927 // Assertions for GetViewTree. |
| 956 TEST_F(ViewManagerServiceAppTest, GetViewTree) { | 928 TEST_F(ViewManagerServiceAppTest, GetViewTree) { |
| 957 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 929 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 958 | 930 |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1126 // Connection2 should have been told the view was deleted. | 1098 // Connection2 should have been told the view was deleted. |
| 1127 vm_client2_->WaitForChangeCount(1); | 1099 vm_client2_->WaitForChangeCount(1); |
| 1128 changes2()->clear(); | 1100 changes2()->clear(); |
| 1129 | 1101 |
| 1130 // Create a view in the third connection and parent it to the root. | 1102 // Create a view in the third connection and parent it to the root. |
| 1131 ASSERT_TRUE(CreateView(vm3(), BuildViewId(3, 1))); | 1103 ASSERT_TRUE(CreateView(vm3(), BuildViewId(3, 1))); |
| 1132 ASSERT_TRUE(AddView(vm3(), BuildViewId(1, 1), BuildViewId(3, 1))); | 1104 ASSERT_TRUE(AddView(vm3(), BuildViewId(1, 1), BuildViewId(3, 1))); |
| 1133 | 1105 |
| 1134 // Connection 1 should have been told about the add (it owns the view). | 1106 // Connection 1 should have been told about the add (it owns the view). |
| 1135 { | 1107 { |
| 1136 vm_client1_.WaitForChangeCount(1); | 1108 vm_client1_->WaitForChangeCount(1); |
| 1137 EXPECT_EQ("HierarchyChanged view=3,1 new_parent=1,1 old_parent=null", | 1109 EXPECT_EQ("HierarchyChanged view=3,1 new_parent=1,1 old_parent=null", |
| 1138 SingleChangeToDescription(*changes1())); | 1110 SingleChangeToDescription(*changes1())); |
| 1139 } | 1111 } |
| 1140 | 1112 |
| 1141 // Embed 1,1 again. | 1113 // Embed 1,1 again. |
| 1142 { | 1114 { |
| 1143 changes3()->clear(); | 1115 changes3()->clear(); |
| 1144 | 1116 |
| 1145 // We should get a new connection for the new embedding. | 1117 // We should get a new connection for the new embedding. |
| 1146 scoped_ptr<ViewManagerClientImpl> connection4( | 1118 scoped_ptr<ViewManagerClientImpl> connection4( |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1269 { | 1241 { |
| 1270 vm_client2_->WaitForChangeCount(1); | 1242 vm_client2_->WaitForChangeCount(1); |
| 1271 EXPECT_EQ("VisibilityChanged view=1,2 visible=false", | 1243 EXPECT_EQ("VisibilityChanged view=1,2 visible=false", |
| 1272 SingleChangeToDescription(*changes2())); | 1244 SingleChangeToDescription(*changes2())); |
| 1273 } | 1245 } |
| 1274 | 1246 |
| 1275 changes1()->clear(); | 1247 changes1()->clear(); |
| 1276 // Show 1,2 from connection 2, connection 1 should be notified. | 1248 // Show 1,2 from connection 2, connection 1 should be notified. |
| 1277 ASSERT_TRUE(SetViewVisibility(vm2(), BuildViewId(1, 2), true)); | 1249 ASSERT_TRUE(SetViewVisibility(vm2(), BuildViewId(1, 2), true)); |
| 1278 { | 1250 { |
| 1279 vm_client1_.WaitForChangeCount(1); | 1251 vm_client1_->WaitForChangeCount(1); |
| 1280 EXPECT_EQ("VisibilityChanged view=1,2 visible=true", | 1252 EXPECT_EQ("VisibilityChanged view=1,2 visible=true", |
| 1281 SingleChangeToDescription(*changes1())); | 1253 SingleChangeToDescription(*changes1())); |
| 1282 } | 1254 } |
| 1283 | 1255 |
| 1284 changes2()->clear(); | 1256 changes2()->clear(); |
| 1285 // Hide 1,1, connection 2 should be told the draw state changed. | 1257 // Hide 1,1, connection 2 should be told the draw state changed. |
| 1286 ASSERT_TRUE(SetViewVisibility(vm1(), BuildViewId(1, 1), false)); | 1258 ASSERT_TRUE(SetViewVisibility(vm1(), BuildViewId(1, 1), false)); |
| 1287 { | 1259 { |
| 1288 vm_client2_->WaitForChangeCount(1); | 1260 vm_client2_->WaitForChangeCount(1); |
| 1289 EXPECT_EQ("DrawnStateChanged view=1,2 drawn=false", | 1261 EXPECT_EQ("DrawnStateChanged view=1,2 drawn=false", |
| 1290 SingleChangeToDescription(*changes2())); | 1262 SingleChangeToDescription(*changes2())); |
| 1291 } | 1263 } |
| 1292 | 1264 |
| 1293 changes2()->clear(); | 1265 changes2()->clear(); |
| 1294 // Show 1,1 from connection 1. Connection 2 should see this. | 1266 // Show 1,1 from connection 1. Connection 2 should see this. |
| 1295 ASSERT_TRUE(SetViewVisibility(vm1(), BuildViewId(1, 1), true)); | 1267 ASSERT_TRUE(SetViewVisibility(vm1(), BuildViewId(1, 1), true)); |
| 1296 { | 1268 { |
| 1297 vm_client2_->WaitForChangeCount(1); | 1269 vm_client2_->WaitForChangeCount(1); |
| 1298 EXPECT_EQ("DrawnStateChanged view=1,2 drawn=true", | 1270 EXPECT_EQ("DrawnStateChanged view=1,2 drawn=true", |
| 1299 SingleChangeToDescription(*changes2())); | 1271 SingleChangeToDescription(*changes2())); |
| 1300 } | 1272 } |
| 1301 | 1273 |
| 1302 // Change visibility of 2,3, connection 1 should see this. | 1274 // Change visibility of 2,3, connection 1 should see this. |
| 1303 changes1()->clear(); | 1275 changes1()->clear(); |
| 1304 ASSERT_TRUE(SetViewVisibility(vm2(), BuildViewId(2, 3), false)); | 1276 ASSERT_TRUE(SetViewVisibility(vm2(), BuildViewId(2, 3), false)); |
| 1305 { | 1277 { |
| 1306 vm_client1_.WaitForChangeCount(1); | 1278 vm_client1_->WaitForChangeCount(1); |
| 1307 EXPECT_EQ("VisibilityChanged view=2,3 visible=false", | 1279 EXPECT_EQ("VisibilityChanged view=2,3 visible=false", |
| 1308 SingleChangeToDescription(*changes1())); | 1280 SingleChangeToDescription(*changes1())); |
| 1309 } | 1281 } |
| 1310 | 1282 |
| 1311 changes2()->clear(); | 1283 changes2()->clear(); |
| 1312 // Remove 1,1 from the root, connection 2 should see drawn state changed. | 1284 // Remove 1,1 from the root, connection 2 should see drawn state changed. |
| 1313 ASSERT_TRUE(RemoveViewFromParent(vm1(), BuildViewId(1, 1))); | 1285 ASSERT_TRUE(RemoveViewFromParent(vm1(), BuildViewId(1, 1))); |
| 1314 { | 1286 { |
| 1315 vm_client2_->WaitForChangeCount(1); | 1287 vm_client2_->WaitForChangeCount(1); |
| 1316 EXPECT_EQ("DrawnStateChanged view=1,2 drawn=false", | 1288 EXPECT_EQ("DrawnStateChanged view=1,2 drawn=false", |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1408 EXPECT_EQ("ViewDeleted view=2,3", SingleChangeToDescription(*changes3())); | 1380 EXPECT_EQ("ViewDeleted view=2,3", SingleChangeToDescription(*changes3())); |
| 1409 } | 1381 } |
| 1410 | 1382 |
| 1411 // Verifies ViewManagerServiceImpl doesn't incorrectly erase from its internal | 1383 // Verifies ViewManagerServiceImpl doesn't incorrectly erase from its internal |
| 1412 // map when a view from another connection with the same view_id is removed. | 1384 // map when a view from another connection with the same view_id is removed. |
| 1413 TEST_F(ViewManagerServiceAppTest, DontCleanMapOnDestroy) { | 1385 TEST_F(ViewManagerServiceAppTest, DontCleanMapOnDestroy) { |
| 1414 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 1386 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 1415 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 1))); | 1387 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 1))); |
| 1416 changes1()->clear(); | 1388 changes1()->clear(); |
| 1417 vm_client2_.reset(); | 1389 vm_client2_.reset(); |
| 1418 vm_client1_.WaitForChangeCount(1); | 1390 vm_client1_->WaitForChangeCount(1); |
| 1419 EXPECT_EQ("OnEmbeddedAppDisconnected view=1,1", | 1391 EXPECT_EQ("OnEmbeddedAppDisconnected view=1,1", |
| 1420 SingleChangeToDescription(*changes1())); | 1392 SingleChangeToDescription(*changes1())); |
| 1421 std::vector<TestView> views; | 1393 std::vector<TestView> views; |
| 1422 GetViewTree(vm1(), BuildViewId(1, 1), &views); | 1394 GetViewTree(vm1(), BuildViewId(1, 1), &views); |
| 1423 EXPECT_FALSE(views.empty()); | 1395 EXPECT_FALSE(views.empty()); |
| 1424 } | 1396 } |
| 1425 | 1397 |
| 1426 TEST_F(ViewManagerServiceAppTest, CloneAndAnimate) { | 1398 TEST_F(ViewManagerServiceAppTest, CloneAndAnimate) { |
| 1427 // Create connection 2 and 3. | 1399 // Create connection 2 and 3. |
| 1428 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 1400 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 1429 ASSERT_TRUE(AddView(vm1(), BuildViewId(0, 1), BuildViewId(1, 1))); | 1401 ASSERT_TRUE(AddView(vm1(), BuildViewId(0, 1), BuildViewId(1, 1))); |
| 1430 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); | 1402 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 2))); |
| 1431 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 3))); | 1403 ASSERT_TRUE(CreateView(vm2(), BuildViewId(2, 3))); |
| 1432 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); | 1404 ASSERT_TRUE(AddView(vm2(), BuildViewId(1, 1), BuildViewId(2, 2))); |
| 1433 ASSERT_TRUE(AddView(vm2(), BuildViewId(2, 2), BuildViewId(2, 3))); | 1405 ASSERT_TRUE(AddView(vm2(), BuildViewId(2, 2), BuildViewId(2, 3))); |
| 1434 changes2()->clear(); | 1406 changes2()->clear(); |
| 1435 | 1407 |
| 1436 ASSERT_TRUE(WaitForAllMessages(vm1())); | 1408 ASSERT_TRUE(WaitForAllMessages(vm1())); |
| 1437 changes1()->clear(); | 1409 changes1()->clear(); |
| 1438 | 1410 |
| 1439 wm_internal_client_->CloneAndAnimate(BuildViewId(2, 3)); | 1411 view_manager_root_->CloneAndAnimate(BuildViewId(2, 3)); |
| 1440 ASSERT_TRUE(WaitForAllMessages(vm1())); | 1412 ASSERT_TRUE(WaitForAllMessages(vm1())); |
| 1441 | 1413 |
| 1442 ASSERT_TRUE(WaitForAllMessages(vm1())); | 1414 ASSERT_TRUE(WaitForAllMessages(vm1())); |
| 1443 ASSERT_TRUE(WaitForAllMessages(vm2())); | 1415 ASSERT_TRUE(WaitForAllMessages(vm2())); |
| 1444 | 1416 |
| 1445 // No messages should have been received. | 1417 // No messages should have been received. |
| 1446 EXPECT_TRUE(changes1()->empty()); | 1418 EXPECT_TRUE(changes1()->empty()); |
| 1447 EXPECT_TRUE(changes2()->empty()); | 1419 EXPECT_TRUE(changes2()->empty()); |
| 1448 | 1420 |
| 1449 // No one should be able to see the cloned tree. | 1421 // No one should be able to see the cloned tree. |
| 1450 std::vector<TestView> views; | 1422 std::vector<TestView> views; |
| 1451 GetViewTree(vm1(), BuildViewId(1, 1), &views); | 1423 GetViewTree(vm1(), BuildViewId(1, 1), &views); |
| 1452 EXPECT_FALSE(HasClonedView(views)); | 1424 EXPECT_FALSE(HasClonedView(views)); |
| 1453 views.clear(); | 1425 views.clear(); |
| 1454 | 1426 |
| 1455 GetViewTree(vm2(), BuildViewId(1, 1), &views); | 1427 GetViewTree(vm2(), BuildViewId(1, 1), &views); |
| 1456 EXPECT_FALSE(HasClonedView(views)); | 1428 EXPECT_FALSE(HasClonedView(views)); |
| 1457 } | 1429 } |
| 1458 | 1430 |
| 1459 // Verifies Embed() works when supplying a ViewManagerClient. | 1431 // Verifies Embed() works when supplying a ViewManagerClient. |
| 1460 TEST_F(ViewManagerServiceAppTest, EmbedSupplyingViewManagerClient) { | 1432 TEST_F(ViewManagerServiceAppTest, EmbedSupplyingViewManagerClient) { |
| 1461 ASSERT_TRUE(CreateView(vm1(), BuildViewId(1, 1))); | 1433 ASSERT_TRUE(CreateView(vm1(), BuildViewId(1, 1))); |
| 1462 | 1434 |
| 1463 ViewManagerClientImpl client2; | 1435 ViewManagerClientImpl client2; |
| 1464 mojo::ViewManagerClientPtr client2_ptr; | 1436 mojo::ViewManagerClientPtr client2_ptr; |
| 1465 mojo::Binding<ViewManagerClient> client2_binding(&client2, &client2_ptr); | 1437 mojo::Binding<ViewManagerClient> client2_binding(&client2, &client2_ptr); |
| 1466 ASSERT_TRUE(Embed(vm1(), BuildViewId(1, 1), client2_ptr.Pass())); | 1438 ASSERT_TRUE(Embed(vm1(), BuildViewId(1, 1), client2_ptr.Pass())); |
| 1467 client2.WaitForOnEmbed(); | 1439 client2.WaitForOnEmbed(); |
| 1468 EXPECT_EQ("OnEmbed creator=mojo:window_manager", | 1440 EXPECT_EQ("OnEmbed creator=" + application_impl()->url(), |
| 1469 SingleChangeToDescription(*client2.tracker()->changes())); | 1441 SingleChangeToDescription(*client2.tracker()->changes())); |
| 1470 } | 1442 } |
| 1471 | 1443 |
| 1472 // TODO(sky): need to better track changes to initial connection. For example, | 1444 // TODO(sky): need to better track changes to initial connection. For example, |
| 1473 // that SetBounsdViews/AddView and the like don't result in messages to the | 1445 // that SetBounsdViews/AddView and the like don't result in messages to the |
| 1474 // originating connection. | 1446 // originating connection. |
| 1475 | 1447 |
| 1476 // TODO(sky): make sure coverage of what was | 1448 // TODO(sky): make sure coverage of what was |
| 1477 // ViewManagerTest.SecondEmbedRoot_InitService and | 1449 // ViewManagerTest.SecondEmbedRoot_InitService and |
| 1478 // ViewManagerTest.MultipleEmbedRootsBeforeWTHReady gets added to window manager | 1450 // ViewManagerTest.MultipleEmbedRootsBeforeWTHReady gets added to window manager |
| 1479 // tests. | 1451 // tests. |
| 1480 | 1452 |
| 1481 } // namespace view_manager | 1453 } // namespace view_manager |
| OLD | NEW |