Index: cc/surfaces/compositor_frame_sink_support_unittest.cc |
diff --git a/cc/surfaces/compositor_frame_sink_support_unittest.cc b/cc/surfaces/compositor_frame_sink_support_unittest.cc |
index 44771bfffaaa919917cefdf9d9ddd0cc19da079f..319471a9296c4d5b16daf5527727ca74d117b386 100644 |
--- a/cc/surfaces/compositor_frame_sink_support_unittest.cc |
+++ b/cc/surfaces/compositor_frame_sink_support_unittest.cc |
@@ -71,30 +71,41 @@ SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) { |
LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u))); |
} |
-CompositorFrame MakeCompositorFrame() { |
+CompositorFrame MakeCompositorFrame(std::vector<SurfaceId> embedded_surfaces, |
+ std::vector<SurfaceId> referenced_surfaces, |
+ TransferableResourceArray resource_list) { |
CompositorFrame compositor_frame; |
compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true); |
+ compositor_frame.metadata.embedded_surfaces = std::move(embedded_surfaces); |
+ compositor_frame.metadata.referenced_surfaces = |
+ std::move(referenced_surfaces); |
+ compositor_frame.resource_list = std::move(resource_list); |
return compositor_frame; |
} |
+CompositorFrame MakeCompositorFrame() { |
+ return MakeCompositorFrame(empty_surface_ids(), empty_surface_ids(), |
+ TransferableResourceArray()); |
+} |
+ |
+CompositorFrame MakeCompositorFrame(std::vector<SurfaceId> embedded_surfaces) { |
+ return MakeCompositorFrame(embedded_surfaces, embedded_surfaces, |
+ TransferableResourceArray()); |
+} |
+ |
CompositorFrame MakeCompositorFrame( |
+ std::vector<SurfaceId> embedded_surfaces, |
std::vector<SurfaceId> referenced_surfaces) { |
- CompositorFrame compositor_frame; |
- compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true); |
- compositor_frame.metadata.referenced_surfaces = |
- std::move(referenced_surfaces); |
- return compositor_frame; |
+ return MakeCompositorFrame(std::move(embedded_surfaces), |
+ std::move(referenced_surfaces), |
+ TransferableResourceArray()); |
} |
CompositorFrame MakeCompositorFrameWithResources( |
- std::vector<SurfaceId> referenced_surfaces, |
+ std::vector<SurfaceId> embedded_surfaces, |
TransferableResourceArray resource_list) { |
- CompositorFrame compositor_frame; |
- compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true); |
- compositor_frame.metadata.referenced_surfaces = |
- std::move(referenced_surfaces); |
- compositor_frame.resource_list = std::move(resource_list); |
- return compositor_frame; |
+ return MakeCompositorFrame(embedded_surfaces, embedded_surfaces, |
+ std::move(resource_list)); |
} |
TransferableResource MakeResource(ResourceId id, |
@@ -1194,5 +1205,42 @@ TEST_F(CompositorFrameSinkSupportTest, GarbageCollectionOnDeadline) { |
EXPECT_FALSE(dependency_tracker().has_deadline()); |
} |
+// This test verifies that a CompositorFrame will only blocked on embedded |
+// surfaces but not on other retained surface IDs in the CompositorFrame. |
+TEST_F(CompositorFrameSinkSupportTest, OnlyBlockOnEmbeddedSurfaces) { |
+ const SurfaceId display_id = MakeSurfaceId(kDisplayFrameSink, 1); |
+ const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1); |
+ const SurfaceId parent_id2 = MakeSurfaceId(kParentFrameSink, 2); |
+ |
+ display_support().SubmitCompositorFrame( |
+ display_id.local_surface_id(), |
+ MakeCompositorFrame({parent_id1}, {parent_id1, parent_id2})); |
+ |
+ EXPECT_TRUE(display_surface()->HasPendingFrame()); |
+ EXPECT_FALSE(display_surface()->HasActiveFrame()); |
+ EXPECT_TRUE(dependency_tracker().has_deadline()); |
+ |
+ // Verify that the display CompositorFrame will only block on |parent_id1| but |
+ // not |parent_id2|. |
+ EXPECT_THAT(display_surface()->blocking_surfaces(), |
+ UnorderedElementsAre(parent_id1)); |
+ // Verify that the display CompositorFrame holds refernces to both |
+ // |parent_id1| and |parent_id2|. |
+ EXPECT_THAT(GetChildReferences(display_id), |
+ UnorderedElementsAre(parent_id1, parent_id2)); |
+ |
+ // Submitting a CompositorFrame with |parent_id1| should unblock the display |
+ // CompositorFrame. |
+ parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
+ MakeCompositorFrame()); |
+ |
+ EXPECT_FALSE(dependency_tracker().has_deadline()); |
+ EXPECT_FALSE(display_surface()->HasPendingFrame()); |
+ EXPECT_TRUE(display_surface()->HasActiveFrame()); |
+ EXPECT_THAT(display_surface()->blocking_surfaces(), IsEmpty()); |
+ EXPECT_THAT(GetChildReferences(display_id), |
+ UnorderedElementsAre(parent_id1, parent_id2)); |
+} |
+ |
} // namespace test |
} // namespace cc |