Index: mojo/services/view_manager/view_manager_unittest.cc |
diff --git a/mojo/services/view_manager/view_manager_unittest.cc b/mojo/services/view_manager/view_manager_unittest.cc |
index a6ceca8c2087bb58796a03d2fdffdd156daf1750..eb9d4cb03159f6e6ca1fcfb1323de44296a13958 100644 |
--- a/mojo/services/view_manager/view_manager_unittest.cc |
+++ b/mojo/services/view_manager/view_manager_unittest.cc |
@@ -201,6 +201,17 @@ class ViewManagerProxy : public TestChangeTracker::Delegate { |
RunMainLoop(); |
return result; |
} |
+ bool SetViewVisibility(Id view_id, bool visible) { |
+ changes_.clear(); |
+ bool result = false; |
+ view_manager_->SetViewVisibility( |
+ view_id, |
+ visible, |
+ base::Bind( |
+ &ViewManagerProxy::GotResult, base::Unretained(this), &result)); |
+ RunMainLoop(); |
+ return result; |
+ } |
private: |
friend class TestViewManagerClientConnection; |
@@ -329,6 +340,12 @@ class TestViewManagerClientConnection |
tracker_.OnViewReordered(view_id, relative_view_id, direction); |
} |
virtual void OnViewDeleted(Id view) OVERRIDE { tracker_.OnViewDeleted(view); } |
+ virtual void OnViewVisibilityChanged(uint32_t view, bool visible) OVERRIDE { |
+ tracker_.OnViewVisibilityChanged(view, visible); |
+ } |
+ virtual void OnViewDrawnStateChanged(uint32_t view, bool drawn) OVERRIDE { |
+ tracker_.OnViewDrawnStateChanged(view, drawn); |
+ } |
virtual void OnViewInputEvent(Id view_id, |
EventPtr event, |
const Callback<void()>& callback) OVERRIDE { |
@@ -479,9 +496,8 @@ class ViewManagerTest : public testing::Test { |
ASSERT_EQ(1u, changes.size()); |
EXPECT_EQ("OnEmbed creator=mojo:test_url", |
ChangesToDescription1(changes)[0]); |
- if (create_initial_view) { |
+ if (create_initial_view) |
EXPECT_EQ("[view=1,1 parent=null]", ChangeViewDescription(changes)); |
- } |
} |
void EstablishThirdConnection(ViewManagerProxy* owner, Id root_id) { |
@@ -780,22 +796,24 @@ TEST_F(ViewManagerTest, ViewHierarchyChangedViews) { |
// 0,1->1,1->1,2->1,11. |
{ |
- // Again, client 2 should not get anything. |
- connection2_->ClearChanges(); |
+ // Client 2 is now connected to the root, so it should have gotten a drawn |
+ // notification. |
ASSERT_TRUE(connection_->AddView(BuildViewId(0, 1), BuildViewId(1, 1))); |
- ASSERT_TRUE(connection2_->CreateView(BuildViewId(2, 101))); |
- connection2_->CopyChangesFromTracker(); |
- EXPECT_TRUE(connection2_->changes().empty()); |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("DrawnStateChanged view=1,1 drawn=true", |
+ ChangesToDescription1(connection2_->changes())[0]); |
} |
// 1,1->1,2->1,11. |
{ |
- connection2_->ClearChanges(); |
+ // Client 2 is no longer connected to the root, should get drawn state |
+ // changed. |
ASSERT_TRUE(connection_->RemoveViewFromParent(BuildViewId(1, 1))); |
- EXPECT_TRUE(connection_->changes().empty()); |
- ASSERT_TRUE(connection2_->CreateView(BuildViewId(2, 102))); |
- connection2_->CopyChangesFromTracker(); |
- EXPECT_TRUE(connection2_->changes().empty()); |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("DrawnStateChanged view=1,1 drawn=false", |
+ ChangesToDescription1(connection2_->changes())[0]); |
} |
// 1,1->1,2->1,11->1,111. |
@@ -812,9 +830,10 @@ TEST_F(ViewManagerTest, ViewHierarchyChangedViews) { |
{ |
connection2_->ClearChanges(); |
ASSERT_TRUE(connection_->AddView(BuildViewId(0, 1), BuildViewId(1, 1))); |
- ASSERT_TRUE(connection2_->CreateView(BuildViewId(2, 104))); |
- connection2_->CopyChangesFromTracker(); |
- EXPECT_TRUE(connection2_->changes().empty()); |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("DrawnStateChanged view=1,1 drawn=true", |
+ ChangesToDescription1(connection2_->changes())[0]); |
} |
} |
@@ -1278,6 +1297,141 @@ TEST_F(ViewManagerTest, EmbedWithSameViewId2) { |
} |
} |
+// Assertions for SetViewVisibility. |
+TEST_F(ViewManagerTest, SetViewVisibility) { |
+ // Create 1 and 2 in the first connection and parent both to the root. |
+ ASSERT_TRUE(connection_->CreateView(BuildViewId(1, 1))); |
+ ASSERT_TRUE(connection_->CreateView(BuildViewId(1, 2))); |
+ |
+ ASSERT_TRUE(connection_->AddView(BuildViewId(0, 1), BuildViewId(1, 1))); |
+ { |
+ std::vector<TestView> views; |
+ connection_->GetViewTree(BuildViewId(0, 1), &views); |
+ ASSERT_EQ(2u, views.size()); |
+ EXPECT_EQ("view=0,1 parent=null visible=true drawn=true", |
+ views[0].ToString2()); |
+ EXPECT_EQ("view=1,1 parent=0,1 visible=true drawn=true", |
+ views[1].ToString2()); |
+ } |
+ |
+ // Hide 1. |
+ ASSERT_TRUE(connection_->SetViewVisibility(BuildViewId(1, 1), false)); |
+ { |
+ std::vector<TestView> views; |
+ connection_->GetViewTree(BuildViewId(1, 1), &views); |
+ ASSERT_EQ(1u, views.size()); |
+ EXPECT_EQ("view=1,1 parent=0,1 visible=false drawn=false", |
+ views[0].ToString2()); |
+ } |
+ |
+ // Attach 2 to 1. |
+ ASSERT_TRUE(connection_->AddView(BuildViewId(1, 1), BuildViewId(1, 2))); |
+ { |
+ std::vector<TestView> views; |
+ connection_->GetViewTree(BuildViewId(1, 1), &views); |
+ ASSERT_EQ(2u, views.size()); |
+ EXPECT_EQ("view=1,1 parent=0,1 visible=false drawn=false", |
+ views[0].ToString2()); |
+ EXPECT_EQ("view=1,2 parent=1,1 visible=true drawn=false", |
+ views[1].ToString2()); |
+ } |
+ |
+ // Show 1. |
+ ASSERT_TRUE(connection_->SetViewVisibility(BuildViewId(1, 1), true)); |
+ { |
+ std::vector<TestView> views; |
+ connection_->GetViewTree(BuildViewId(1, 1), &views); |
+ ASSERT_EQ(2u, views.size()); |
+ EXPECT_EQ("view=1,1 parent=0,1 visible=true drawn=true", |
+ views[0].ToString2()); |
+ EXPECT_EQ("view=1,2 parent=1,1 visible=true drawn=true", |
+ views[1].ToString2()); |
+ } |
+} |
+ |
+// Assertions for SetViewVisibility sending notifications. |
+TEST_F(ViewManagerTest, SetViewVisibilityNotifications) { |
+ // Create 1,1 and 1,2, 1,2 and child of 1,1 and 1,1 a child of the root. |
+ ASSERT_TRUE(connection_->CreateView(BuildViewId(1, 1))); |
+ ASSERT_TRUE(connection_->CreateView(BuildViewId(1, 2))); |
+ ASSERT_TRUE(connection_->AddView(BuildViewId(0, 1), BuildViewId(1, 1))); |
+ ASSERT_TRUE(connection_->AddView(BuildViewId(1, 1), BuildViewId(1, 2))); |
+ |
+ // Establish the second connection at 1,2. |
+ ASSERT_NO_FATAL_FAILURE( |
+ EstablishSecondConnectionWithRoot(BuildViewId(1, 2))); |
+ |
+ // Add 2,3 as a child of 1,2. |
+ ASSERT_TRUE(connection2_->CreateView(BuildViewId(2, 3))); |
+ connection_->ClearChanges(); |
+ ASSERT_TRUE(connection2_->AddView(BuildViewId(1, 2), BuildViewId(2, 3))); |
+ connection_->DoRunLoopUntilChangesCount(1); |
+ |
+ // Hide 1,2 from connection 1. Connection 2 should see this. |
+ ASSERT_TRUE(connection_->SetViewVisibility(BuildViewId(1, 2), false)); |
+ { |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("VisibilityChanged view=1,2 visible=false", |
+ ChangesToDescription1(connection2_->changes())[0]); |
+ } |
+ |
+ // Show 1,2 from connection 2, connection 1 should be notified. |
+ ASSERT_TRUE(connection2_->SetViewVisibility(BuildViewId(1, 2), true)); |
+ { |
+ connection_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection_->changes().size()); |
+ EXPECT_EQ("VisibilityChanged view=1,2 visible=true", |
+ ChangesToDescription1(connection_->changes())[0]); |
+ } |
+ |
+ // Hide 1,1, connection 2 should be told the draw state changed. |
+ ASSERT_TRUE(connection_->SetViewVisibility(BuildViewId(1, 1), false)); |
+ { |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("DrawnStateChanged view=1,2 drawn=false", |
+ ChangesToDescription1(connection2_->changes())[0]); |
+ } |
+ |
+ // Show 1,1 from connection 1. Connection 2 should see this. |
+ ASSERT_TRUE(connection_->SetViewVisibility(BuildViewId(1, 1), true)); |
+ { |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("DrawnStateChanged view=1,2 drawn=true", |
+ ChangesToDescription1(connection2_->changes())[0]); |
+ } |
+ |
+ // Change visibility of 2,3, connection 1 should see this. |
+ connection_->ClearChanges(); |
+ ASSERT_TRUE(connection2_->SetViewVisibility(BuildViewId(2, 3), false)); |
+ { |
+ connection_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection_->changes().size()); |
+ EXPECT_EQ("VisibilityChanged view=2,3 visible=false", |
+ ChangesToDescription1(connection_->changes())[0]); |
+ } |
+ |
+ // Remove 1,1 from the root, connection 2 should see drawn state changed. |
+ ASSERT_TRUE(connection_->RemoveViewFromParent(BuildViewId(1, 1))); |
+ { |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("DrawnStateChanged view=1,2 drawn=false", |
+ ChangesToDescription1(connection2_->changes())[0]); |
+ } |
+ |
+ // Add 1,1 back to the root, connection 2 should see drawn state changed. |
+ ASSERT_TRUE(connection_->AddView(BuildViewId(0, 1), BuildViewId(1, 1))); |
+ { |
+ connection2_->DoRunLoopUntilChangesCount(1); |
+ ASSERT_EQ(1u, connection2_->changes().size()); |
+ EXPECT_EQ("DrawnStateChanged view=1,2 drawn=true", |
+ ChangesToDescription1(connection2_->changes())[0]); |
+ } |
+} |
+ |
// TODO(sky): add coverage of test that destroys connections and ensures other |
// connections get deletion notification. |