| 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 28cb3448c1a1ce316f880ac07b32587d04f4d084..dfb12b93ecdf5c8788d0abd833fa52d4fd2d11dc 100644
|
| --- a/cc/surfaces/compositor_frame_sink_support_unittest.cc
|
| +++ b/cc/surfaces/compositor_frame_sink_support_unittest.cc
|
| @@ -155,6 +155,15 @@ class CompositorFrameSinkSupportTest : public testing::Test {
|
| return begin_frame_source_.get();
|
| }
|
|
|
| + std::unique_ptr<CompositorFrameSinkSupport> CreateCompositorFrameSinkSupport(
|
| + FrameSinkId frame_sink_id,
|
| + bool is_root = false) {
|
| + return base::MakeUnique<CompositorFrameSinkSupport>(
|
| + &support_client_, &surface_manager_, frame_sink_id, is_root,
|
| + true /* handles_frame_sink_id_invalidation */,
|
| + true /* needs_sync_points */);
|
| + }
|
| +
|
| // testing::Test:
|
| void SetUp() override {
|
| testing::Test::SetUp();
|
| @@ -164,23 +173,11 @@ class CompositorFrameSinkSupportTest : public testing::Test {
|
| new SurfaceDependencyTracker(&surface_manager_,
|
| begin_frame_source_.get()));
|
| surface_manager_.SetDependencyTracker(std::move(dependency_tracker));
|
| - supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
|
| - &support_client_, &surface_manager_, kDisplayFrameSink,
|
| - true /* is_root */, true /* handles_frame_sink_id_invalidation */,
|
| - true /* needs_sync_points */));
|
| - supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
|
| - &support_client_, &surface_manager_, kParentFrameSink,
|
| - false /* is_root */, true /* handles_frame_sink_id_invalidation */,
|
| - true /* needs_sync_points */));
|
| - supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
|
| - &support_client_, &surface_manager_, kChildFrameSink1,
|
| - false /* is_root */, true /* handles_frame_sink_id_invalidation */,
|
| - true /* needs_sync_points */));
|
| - supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
|
| - &support_client_, &surface_manager_, kChildFrameSink2,
|
| - false /* is_root */, true /* handles_frame_sink_id_invalidation */,
|
| - true /* needs_sync_points */));
|
| -
|
| + supports_.push_back(CreateCompositorFrameSinkSupport(kDisplayFrameSink,
|
| + true /* is_root */));
|
| + supports_.push_back(CreateCompositorFrameSinkSupport(kParentFrameSink));
|
| + supports_.push_back(CreateCompositorFrameSinkSupport(kChildFrameSink1));
|
| + supports_.push_back(CreateCompositorFrameSinkSupport(kChildFrameSink2));
|
| // Normally, the BeginFrameSource would be registered by the Display. We
|
| // register it here so that BeginFrames are received by the display support,
|
| // for use in the PassesOnBeginFrameAcks test. Other supports do not receive
|
| @@ -1052,5 +1049,44 @@ TEST_F(CompositorFrameSinkSupportTest, LocalSurfaceIdIsReusable) {
|
| EXPECT_NE(nullptr, surface_manager().GetSurfaceForId(child_id));
|
| }
|
|
|
| +// Checks whether a LocalSurfaceId can be reused after the
|
| +// CompositorFrameSinkSupport is destroyed and recreated with the same
|
| +// FrameSinkId.
|
| +TEST_F(CompositorFrameSinkSupportTest, ReuseSurfaceAfterSupportDestroyed) {
|
| + const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
|
| + const SurfaceId child_id = MakeSurfaceId(kArbitraryFrameSink, 1);
|
| + std::unique_ptr<CompositorFrameSinkSupport> child_support =
|
| + CreateCompositorFrameSinkSupport(kArbitraryFrameSink);
|
| +
|
| + // Add a reference from parent to child to preserve the child surface.
|
| + parent_support().SubmitCompositorFrame(parent_id.local_surface_id(),
|
| + MakeCompositorFrame({child_id}));
|
| +
|
| + // Submit the first frame. A surface must be created.
|
| + child_support->SubmitCompositorFrame(
|
| + child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
|
| + Surface* surface = surface_manager().GetSurfaceForId(child_id);
|
| + ASSERT_TRUE(surface);
|
| + base::WeakPtr<SurfaceFactory> factory = surface->factory();
|
| + EXPECT_TRUE(factory);
|
| + EXPECT_FALSE(surface->destroyed());
|
| +
|
| + // Recreate child_support. The surface must be marked as destroyed and its
|
| + // factory must be gone.
|
| + child_support.reset();
|
| + child_support = CreateCompositorFrameSinkSupport(kArbitraryFrameSink);
|
| + EXPECT_EQ(surface, surface_manager().GetSurfaceForId(child_id));
|
| + EXPECT_FALSE(factory);
|
| + EXPECT_TRUE(surface->destroyed());
|
| +
|
| + // Submit another frame for the same local surface id. The same surface must
|
| + // be used and destroyed() must return false. The surface must have a factory.
|
| + child_support->SubmitCompositorFrame(
|
| + child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids()));
|
| + EXPECT_EQ(surface, surface_manager().GetSurfaceForId(child_id));
|
| + EXPECT_TRUE(surface->factory());
|
| + EXPECT_FALSE(surface->destroyed());
|
| +}
|
| +
|
| } // namespace test
|
| } // namespace cc
|
|
|