| Index: mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc b/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc
|
| index e69be9c6b13263b339c4efc4e229399ad2f32bea..6ce1b20746e9592a3ce84f0f3efc2073eb8fc91b 100644
|
| --- a/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc
|
| +++ b/mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc
|
| @@ -50,15 +50,14 @@ void WaitForAllChangesToBeAcked(ViewManager* manager) {
|
| ViewManagerPrivate(manager).synchronizer()->ClearChangesAckedCallback();
|
| }
|
|
|
| -// Used with IViewManager::Connect(). Creates a TestViewManagerClientConnection,
|
| -// which creates and owns the ViewManagerProxy.
|
| class ConnectServiceLoader : public ServiceLoader {
|
| public:
|
| explicit ConnectServiceLoader(base::Callback<void(ViewManager*)> callback)
|
| : callback_(callback) {}
|
| virtual ~ConnectServiceLoader() {}
|
|
|
| - // ServiceLoader:
|
| + private:
|
| + // Overridden from ServiceLoader:
|
| virtual void LoadService(ServiceManager* manager,
|
| const GURL& url,
|
| ScopedMessagePipeHandle shell_handle) OVERRIDE {
|
| @@ -70,7 +69,6 @@ class ConnectServiceLoader : public ServiceLoader {
|
| const GURL& url) OVERRIDE {
|
| }
|
|
|
| - private:
|
| ScopedVector<Application> apps_;
|
| base::Callback<void(ViewManager*)> callback_;
|
|
|
| @@ -322,6 +320,10 @@ class ViewManagerTest : public testing::Test {
|
| return view_manager;
|
| }
|
|
|
| + void UnloadApplication(const GURL& url) {
|
| + test_helper_.SetLoaderForURL(scoped_ptr<ServiceLoader>(), url);
|
| + }
|
| +
|
| private:
|
| // Overridden from testing::Test:
|
| virtual void SetUp() OVERRIDE {
|
| @@ -476,19 +478,20 @@ TEST_F(ViewManagerTest, NodeDestroyed) {
|
| EXPECT_EQ(NULL, embedded->GetNodeById(id));
|
| }
|
|
|
| -// TODO(beng): provide a way to terminate an application.
|
| -TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupNode) {
|
| - ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
|
| - WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
|
| +TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNode) {
|
| + ViewTreeNode* node = ViewTreeNode::Create(window_manager());
|
| + window_manager()->tree()->AddChild(node);
|
| + ViewManager* embedded = Embed(window_manager(), node);
|
| +
|
| + TransportNodeId node_id = node->id();
|
| +
|
| + UnloadApplication(GURL(kTestServiceURL));
|
|
|
| - TransportNodeId id = node1->id();
|
| - DestroyViewManager1();
|
| std::set<TransportNodeId> nodes;
|
| - nodes.insert(id);
|
| - WaitForDestruction(view_manager_2(), &nodes, NULL);
|
| + nodes.insert(node_id);
|
| + WaitForDestruction(embedded, &nodes, NULL);
|
|
|
| - // tree() should still be valid, since it's owned by neither connection.
|
| - EXPECT_TRUE(view_manager_2()->tree()->children().empty());
|
| + EXPECT_EQ(NULL, embedded->tree());
|
| }
|
|
|
| TEST_F(ViewManagerTest, SetActiveView) {
|
| @@ -530,30 +533,27 @@ TEST_F(ViewManagerTest, DestroyView) {
|
|
|
| // Destroying the connection that created a node and view should result in that
|
| // node and view disappearing from all connections that see them.
|
| -TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupNodeAndView) {
|
| - ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
|
| - WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
|
| -
|
| - View* view1 = View::Create(view_manager_1());
|
| - node1->SetActiveView(view1);
|
| +TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNodeAndView) {
|
| + ViewTreeNode* node = ViewTreeNode::Create(window_manager());
|
| + window_manager()->tree()->AddChild(node);
|
| + View* view = View::Create(window_manager());
|
| + node->SetActiveView(view);
|
| + ViewManager* embedded = Embed(window_manager(), node);
|
|
|
| - ViewTreeNode* node1_2 = view_manager_2()->tree()->GetChildById(node1->id());
|
| - WaitForActiveViewToChange(node1_2);
|
| + TransportNodeId node_id = node->id();
|
| + TransportViewId view_id = view->id();
|
|
|
| - TransportNodeId node1_id = node1->id();
|
| - TransportViewId view1_id = view1->id();
|
| + UnloadApplication(GURL(kTestServiceURL));
|
|
|
| - DestroyViewManager1();
|
| std::set<TransportNodeId> observed_nodes;
|
| - observed_nodes.insert(node1_id);
|
| + observed_nodes.insert(node_id);
|
| std::set<TransportViewId> observed_views;
|
| - observed_views.insert(view1_id);
|
| - WaitForDestruction(view_manager_2(), &observed_nodes, &observed_views);
|
| + observed_views.insert(view_id);
|
| + WaitForDestruction(embedded, &observed_nodes, &observed_views);
|
|
|
| - // tree() should still be valid, since it's owned by neither connection.
|
| - EXPECT_TRUE(view_manager_2()->tree()->children().empty());
|
| - EXPECT_EQ(NULL, view_manager_2()->GetNodeById(node1_id));
|
| - EXPECT_EQ(NULL, view_manager_2()->GetViewById(view1_id));
|
| + EXPECT_EQ(NULL, embedded->tree());
|
| + EXPECT_EQ(NULL, embedded->GetNodeById(node_id));
|
| + EXPECT_EQ(NULL, embedded->GetViewById(view_id));
|
| }
|
|
|
| // This test validates the following scenario:
|
| @@ -563,32 +563,31 @@ TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupNodeAndView) {
|
| // -> the view should still exist (since the second connection is live) but
|
| // should be disconnected from any nodes.
|
| TEST_F(ViewManagerTest,
|
| - DISABLED_ViewManagerDestroyed_CleanupNodeAndViewFromDifferentConnections) {
|
| - ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
|
| - WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
|
| + ViewManagerDestroyed_CleanupNodeAndViewFromDifferentConnections) {
|
| + ViewTreeNode* node = ViewTreeNode::Create(window_manager());
|
| + window_manager()->tree()->AddChild(node);
|
| + ViewManager* embedded = Embed(window_manager(), node);
|
| + View* view_in_embedded = View::Create(embedded);
|
| + ViewTreeNode* node_in_embedded = embedded->GetNodeById(node->id());
|
| + node_in_embedded->SetActiveView(view_in_embedded);
|
|
|
| - View* view1_2 = View::Create(view_manager_2());
|
| - ViewTreeNode* node1_2 = view_manager_2()->tree()->GetChildById(node1->id());
|
| - node1_2->SetActiveView(view1_2);
|
| - WaitForActiveViewToChange(node1);
|
| + WaitForActiveViewToChange(node);
|
|
|
| - TransportNodeId node1_id = node1->id();
|
| - TransportViewId view1_2_id = view1_2->id();
|
| + TransportNodeId node_id = node->id();
|
| + TransportViewId view_id = view_in_embedded->id();
|
|
|
| - DestroyViewManager1();
|
| + UnloadApplication(GURL(kTestServiceURL));
|
| std::set<TransportNodeId> nodes;
|
| - nodes.insert(node1_id);
|
| - WaitForDestruction(view_manager_2(), &nodes, NULL);
|
| -
|
| - // tree() should still be valid, since it's owned by neither connection.
|
| - EXPECT_TRUE(view_manager_2()->tree()->children().empty());
|
| - // node1 was owned by the first connection, so it should be gone.
|
| - EXPECT_EQ(NULL, view_manager_2()->GetNodeById(node1_id));
|
| - // view1_2 was owned by the second connection, so it should still exist, but
|
| - // disconnected from the node tree.
|
| - View* another_view1_2 = view_manager_2()->GetViewById(view1_2_id);
|
| - EXPECT_EQ(view1_2, another_view1_2);
|
| - EXPECT_EQ(NULL, view1_2->node());
|
| + nodes.insert(node_id);
|
| + WaitForDestruction(embedded, &nodes, NULL);
|
| +
|
| + EXPECT_EQ(NULL, embedded->tree());
|
| + // node was owned by the window manager, so it should be gone.
|
| + EXPECT_EQ(NULL, embedded->GetNodeById(node_id));
|
| + // view_in_embedded was owned by the embedded app, so it should still exist,
|
| + // but disconnected from the node tree.
|
| + EXPECT_EQ(view_in_embedded, embedded->GetViewById(view_id));
|
| + EXPECT_EQ(NULL, view_in_embedded->node());
|
| }
|
|
|
| // This test verifies that it is not possible to set the active view to a view
|
|
|