| 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 <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" |
| 11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
| 13 #include "components/mus/public/interfaces/window_tree.mojom.h" | 13 #include "components/mus/public/interfaces/window_tree.mojom.h" |
| 14 #include "components/mus/public/interfaces/window_tree_host.mojom.h" | 14 #include "components/mus/public/interfaces/window_tree_host.mojom.h" |
| 15 #include "components/mus/ws/ids.h" | 15 #include "components/mus/ws/ids.h" |
| 16 #include "components/mus/ws/test_change_tracker.h" | 16 #include "components/mus/ws/test_change_tracker.h" |
| 17 #include "mojo/converters/geometry/geometry_type_converters.h" | 17 #include "mojo/converters/geometry/geometry_type_converters.h" |
| 18 #include "mojo/public/cpp/bindings/associated_binding.h" | 18 #include "mojo/public/cpp/bindings/associated_binding.h" |
| 19 #include "mojo/shell/public/cpp/application_delegate.h" | 19 #include "mojo/shell/public/cpp/application_delegate.h" |
| 20 #include "mojo/shell/public/cpp/application_impl.h" | |
| 21 #include "mojo/shell/public/cpp/application_test_base.h" | 20 #include "mojo/shell/public/cpp/application_test_base.h" |
| 22 | 21 |
| 23 using mojo::ApplicationConnection; | 22 using mojo::ApplicationConnection; |
| 24 using mojo::ApplicationDelegate; | 23 using mojo::ApplicationDelegate; |
| 25 using mojo::Array; | 24 using mojo::Array; |
| 26 using mojo::Callback; | 25 using mojo::Callback; |
| 27 using mojo::InterfaceRequest; | 26 using mojo::InterfaceRequest; |
| 28 using mojo::RectPtr; | 27 using mojo::RectPtr; |
| 29 using mojo::String; | 28 using mojo::String; |
| 30 using mus::mojom::ErrorCode; | 29 using mus::mojom::ErrorCode; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 58 void EmbedCallbackImpl(base::RunLoop* run_loop, | 57 void EmbedCallbackImpl(base::RunLoop* run_loop, |
| 59 bool* result_cache, | 58 bool* result_cache, |
| 60 bool result, | 59 bool result, |
| 61 ConnectionSpecificId connection_id) { | 60 ConnectionSpecificId connection_id) { |
| 62 *result_cache = result; | 61 *result_cache = result; |
| 63 run_loop->Quit(); | 62 run_loop->Quit(); |
| 64 } | 63 } |
| 65 | 64 |
| 66 // ----------------------------------------------------------------------------- | 65 // ----------------------------------------------------------------------------- |
| 67 | 66 |
| 68 bool EmbedUrl(mojo::ApplicationImpl* app, | 67 bool EmbedUrl(mojo::Shell* shell, |
| 69 WindowTree* ws, | 68 WindowTree* ws, |
| 70 const String& url, | 69 const String& url, |
| 71 Id root_id) { | 70 Id root_id) { |
| 72 bool result = false; | 71 bool result = false; |
| 73 base::RunLoop run_loop; | 72 base::RunLoop run_loop; |
| 74 { | 73 { |
| 75 mojom::WindowTreeClientPtr client; | 74 mojom::WindowTreeClientPtr client; |
| 76 app->ConnectToService(url.get(), &client); | 75 shell->ConnectToService(url.get(), &client); |
| 77 ws->Embed(root_id, std::move(client), | 76 ws->Embed(root_id, std::move(client), |
| 78 mojom::WindowTree::kAccessPolicyDefault, | 77 mojom::WindowTree::kAccessPolicyDefault, |
| 79 base::Bind(&EmbedCallbackImpl, &run_loop, &result)); | 78 base::Bind(&EmbedCallbackImpl, &run_loop, &result)); |
| 80 } | 79 } |
| 81 run_loop.Run(); | 80 run_loop.Run(); |
| 82 return result; | 81 return result; |
| 83 } | 82 } |
| 84 | 83 |
| 85 bool Embed(WindowTree* ws, Id root_id, mojom::WindowTreeClientPtr client) { | 84 bool Embed(WindowTree* ws, Id root_id, mojom::WindowTreeClientPtr client) { |
| 86 bool result = false; | 85 bool result = false; |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 int* connection_id) { | 534 int* connection_id) { |
| 536 return EstablishConnectionViaEmbedWithPolicyBitmask( | 535 return EstablishConnectionViaEmbedWithPolicyBitmask( |
| 537 owner, root_id, mojom::WindowTree::kAccessPolicyDefault, connection_id); | 536 owner, root_id, mojom::WindowTree::kAccessPolicyDefault, connection_id); |
| 538 } | 537 } |
| 539 | 538 |
| 540 scoped_ptr<TestWindowTreeClientImpl> | 539 scoped_ptr<TestWindowTreeClientImpl> |
| 541 EstablishConnectionViaEmbedWithPolicyBitmask(WindowTree* owner, | 540 EstablishConnectionViaEmbedWithPolicyBitmask(WindowTree* owner, |
| 542 Id root_id, | 541 Id root_id, |
| 543 uint32_t policy_bitmask, | 542 uint32_t policy_bitmask, |
| 544 int* connection_id) { | 543 int* connection_id) { |
| 545 if (!EmbedUrl(application_impl(), owner, application_impl()->url(), | 544 if (!EmbedUrl(shell(), owner, shell_url(), root_id)) { |
| 546 root_id)) { | |
| 547 ADD_FAILURE() << "Embed() failed"; | 545 ADD_FAILURE() << "Embed() failed"; |
| 548 return nullptr; | 546 return nullptr; |
| 549 } | 547 } |
| 550 scoped_ptr<TestWindowTreeClientImpl> client = | 548 scoped_ptr<TestWindowTreeClientImpl> client = |
| 551 client_factory_->WaitForInstance(); | 549 client_factory_->WaitForInstance(); |
| 552 if (!client.get()) { | 550 if (!client.get()) { |
| 553 ADD_FAILURE() << "WaitForInstance failed"; | 551 ADD_FAILURE() << "WaitForInstance failed"; |
| 554 return nullptr; | 552 return nullptr; |
| 555 } | 553 } |
| 556 client->WaitForOnEmbed(); | 554 client->WaitForOnEmbed(); |
| 557 | 555 |
| 558 EXPECT_EQ("OnEmbed", | 556 EXPECT_EQ("OnEmbed", |
| 559 SingleChangeToDescription(*client->tracker()->changes())); | 557 SingleChangeToDescription(*client->tracker()->changes())); |
| 560 if (connection_id) | 558 if (connection_id) |
| 561 *connection_id = (*client->tracker()->changes())[0].connection_id; | 559 *connection_id = (*client->tracker()->changes())[0].connection_id; |
| 562 return client; | 560 return client; |
| 563 } | 561 } |
| 564 | 562 |
| 565 // ApplicationTestBase: | 563 // ApplicationTestBase: |
| 566 ApplicationDelegate* GetApplicationDelegate() override { return this; } | 564 ApplicationDelegate* GetApplicationDelegate() override { return this; } |
| 567 void SetUp() override { | 565 void SetUp() override { |
| 568 ApplicationTestBase::SetUp(); | 566 ApplicationTestBase::SetUp(); |
| 569 client_factory_.reset(new WindowTreeClientFactory()); | 567 client_factory_.reset(new WindowTreeClientFactory()); |
| 570 | 568 |
| 571 mojom::WindowTreeHostFactoryPtr factory; | 569 mojom::WindowTreeHostFactoryPtr factory; |
| 572 application_impl()->ConnectToService("mojo:mus", &factory); | 570 shell()->ConnectToService("mojo:mus", &factory); |
| 573 | 571 |
| 574 mojom::WindowTreeClientPtr tree_client_ptr; | 572 mojom::WindowTreeClientPtr tree_client_ptr; |
| 575 ws_client1_.reset(new TestWindowTreeClientImpl()); | 573 ws_client1_.reset(new TestWindowTreeClientImpl()); |
| 576 ws_client1_->Bind(GetProxy(&tree_client_ptr)); | 574 ws_client1_->Bind(GetProxy(&tree_client_ptr)); |
| 577 | 575 |
| 578 factory->CreateWindowTreeHost(GetProxy(&host_), | 576 factory->CreateWindowTreeHost(GetProxy(&host_), |
| 579 std::move(tree_client_ptr)); | 577 std::move(tree_client_ptr)); |
| 580 | 578 |
| 581 // Next we should get an embed call on the "window manager" client. | 579 // Next we should get an embed call on the "window manager" client. |
| 582 ws_client1_->WaitForIncomingMethodCall(); | 580 ws_client1_->WaitForIncomingMethodCall(); |
| (...skipping 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1713 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); | 1711 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
| 1714 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1)); | 1712 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws2(), window_2_1)); |
| 1715 | 1713 |
| 1716 Id window_3_3 = ws_client3()->NewWindow(3); | 1714 Id window_3_3 = ws_client3()->NewWindow(3); |
| 1717 ASSERT_TRUE(window_3_3); | 1715 ASSERT_TRUE(window_3_3); |
| 1718 ASSERT_TRUE(ws_client3()->AddWindow(window_2_1, window_3_3)); | 1716 ASSERT_TRUE(ws_client3()->AddWindow(window_2_1, window_3_3)); |
| 1719 | 1717 |
| 1720 // 2 should not be able to embed in window_3_3 as window_3_3 was not created | 1718 // 2 should not be able to embed in window_3_3 as window_3_3 was not created |
| 1721 // by | 1719 // by |
| 1722 // 2. | 1720 // 2. |
| 1723 EXPECT_FALSE(EmbedUrl(application_impl(), ws2(), application_impl()->url(), | 1721 EXPECT_FALSE(EmbedUrl(shell(), ws2(), shell_url(), window_3_3)); |
| 1724 window_3_3)); | |
| 1725 } | 1722 } |
| 1726 | 1723 |
| 1727 // Verifies Embed() from window manager on another connections window works. | 1724 // Verifies Embed() from window manager on another connections window works. |
| 1728 TEST_F(WindowTreeAppTest, EmbedFromOtherConnection) { | 1725 TEST_F(WindowTreeAppTest, EmbedFromOtherConnection) { |
| 1729 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 1726 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 1730 | 1727 |
| 1731 Id window_1_1 = BuildWindowId(connection_id_1(), 1); | 1728 Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
| 1732 Id window_2_1 = ws_client2()->NewWindow(1); | 1729 Id window_2_1 = ws_client2()->NewWindow(1); |
| 1733 ASSERT_TRUE(window_2_1); | 1730 ASSERT_TRUE(window_2_1); |
| 1734 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); | 1731 ASSERT_TRUE(ws_client2()->AddWindow(window_1_1, window_2_1)); |
| 1735 | 1732 |
| 1736 changes2()->clear(); | 1733 changes2()->clear(); |
| 1737 | 1734 |
| 1738 // Establish a third connection in window_2_1. | 1735 // Establish a third connection in window_2_1. |
| 1739 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws1(), window_2_1)); | 1736 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(ws1(), window_2_1)); |
| 1740 | 1737 |
| 1741 ASSERT_TRUE(ws_client2()->WaitForAllMessages()); | 1738 ASSERT_TRUE(ws_client2()->WaitForAllMessages()); |
| 1742 EXPECT_EQ(std::string(), SingleChangeToDescription(*changes2())); | 1739 EXPECT_EQ(std::string(), SingleChangeToDescription(*changes2())); |
| 1743 } | 1740 } |
| 1744 | 1741 |
| 1745 TEST_F(WindowTreeAppTest, CantEmbedFromConnectionRoot) { | 1742 TEST_F(WindowTreeAppTest, CantEmbedFromConnectionRoot) { |
| 1746 // Shouldn't be able to embed into the root. | 1743 // Shouldn't be able to embed into the root. |
| 1747 ASSERT_FALSE(EmbedUrl(application_impl(), ws1(), application_impl()->url(), | 1744 ASSERT_FALSE(EmbedUrl(shell(), ws1(), shell_url(), root_window_id())); |
| 1748 root_window_id())); | |
| 1749 | 1745 |
| 1750 // Even though the call above failed a WindowTreeClient was obtained. We need | 1746 // Even though the call above failed a WindowTreeClient was obtained. We need |
| 1751 // to | 1747 // to |
| 1752 // wait for it else we throw off the next connect. | 1748 // wait for it else we throw off the next connect. |
| 1753 WaitForWindowTreeClient(); | 1749 WaitForWindowTreeClient(); |
| 1754 | 1750 |
| 1755 // Don't allow a connection to embed into its own root. | 1751 // Don't allow a connection to embed into its own root. |
| 1756 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 1752 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 1757 EXPECT_FALSE(EmbedUrl(application_impl(), ws2(), application_impl()->url(), | 1753 EXPECT_FALSE(EmbedUrl(shell(), ws2(), shell_url(), |
| 1758 BuildWindowId(connection_id_1(), 1))); | 1754 BuildWindowId(connection_id_1(), 1))); |
| 1759 | 1755 |
| 1760 // Need to wait for a WindowTreeClient for same reason as above. | 1756 // Need to wait for a WindowTreeClient for same reason as above. |
| 1761 WaitForWindowTreeClient(); | 1757 WaitForWindowTreeClient(); |
| 1762 | 1758 |
| 1763 Id window_1_2 = ws_client1()->NewWindow(2); | 1759 Id window_1_2 = ws_client1()->NewWindow(2); |
| 1764 ASSERT_TRUE(window_1_2); | 1760 ASSERT_TRUE(window_1_2); |
| 1765 ASSERT_TRUE( | 1761 ASSERT_TRUE( |
| 1766 ws_client1()->AddWindow(BuildWindowId(connection_id_1(), 1), window_1_2)); | 1762 ws_client1()->AddWindow(BuildWindowId(connection_id_1(), 1), window_1_2)); |
| 1767 ASSERT_TRUE(ws_client3_.get() == nullptr); | 1763 ASSERT_TRUE(ws_client3_.get() == nullptr); |
| 1768 ws_client3_ = EstablishConnectionViaEmbedWithPolicyBitmask( | 1764 ws_client3_ = EstablishConnectionViaEmbedWithPolicyBitmask( |
| 1769 ws1(), window_1_2, mojom::WindowTree::kAccessPolicyEmbedRoot, nullptr); | 1765 ws1(), window_1_2, mojom::WindowTree::kAccessPolicyEmbedRoot, nullptr); |
| 1770 ASSERT_TRUE(ws_client3_.get() != nullptr); | 1766 ASSERT_TRUE(ws_client3_.get() != nullptr); |
| 1771 | 1767 |
| 1772 // window_1_2 is ws3's root, so even though v3 is an embed root it should not | 1768 // window_1_2 is ws3's root, so even though v3 is an embed root it should not |
| 1773 // be able to Embed into itself. | 1769 // be able to Embed into itself. |
| 1774 ASSERT_FALSE(EmbedUrl(application_impl(), ws3(), application_impl()->url(), | 1770 ASSERT_FALSE(EmbedUrl(shell(), ws3(), shell_url(), window_1_2)); |
| 1775 window_1_2)); | |
| 1776 } | 1771 } |
| 1777 | 1772 |
| 1778 // Verifies that a transient window tracks its parent's lifetime. | 1773 // Verifies that a transient window tracks its parent's lifetime. |
| 1779 TEST_F(WindowTreeAppTest, TransientWindowTracksTransientParentLifetime) { | 1774 TEST_F(WindowTreeAppTest, TransientWindowTracksTransientParentLifetime) { |
| 1780 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 1775 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 1781 Id window_1_1 = BuildWindowId(connection_id_1(), 1); | 1776 Id window_1_1 = BuildWindowId(connection_id_1(), 1); |
| 1782 | 1777 |
| 1783 Id window_2_1 = ws_client2()->NewWindow(1); | 1778 Id window_2_1 = ws_client2()->NewWindow(1); |
| 1784 Id window_2_2 = ws_client2()->NewWindow(2); | 1779 Id window_2_2 = ws_client2()->NewWindow(2); |
| 1785 Id window_2_3 = ws_client2()->NewWindow(3); | 1780 Id window_2_3 = ws_client2()->NewWindow(3); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1870 // originating connection. | 1865 // originating connection. |
| 1871 | 1866 |
| 1872 // TODO(sky): make sure coverage of what was | 1867 // TODO(sky): make sure coverage of what was |
| 1873 // WindowManagerTest.SecondEmbedRoot_InitService and | 1868 // WindowManagerTest.SecondEmbedRoot_InitService and |
| 1874 // WindowManagerTest.MultipleEmbedRootsBeforeWTHReady gets added to window | 1869 // WindowManagerTest.MultipleEmbedRootsBeforeWTHReady gets added to window |
| 1875 // manager | 1870 // manager |
| 1876 // tests. | 1871 // tests. |
| 1877 | 1872 |
| 1878 } // namespace ws | 1873 } // namespace ws |
| 1879 } // namespace mus | 1874 } // namespace mus |
| OLD | NEW |