@@ -261,4 +261,40 @@ TEST(
261261 auto no_discard = [](LayerTree&) { return false ; };
262262 rasterizer->Draw (pipeline, no_discard);
263263}
264+
265+ TEST (RasterizerTest, externalViewEmbedderDoesntEndFrameWhenNoSurfaceIsSet) {
266+ std::string test_name =
267+ ::testing::UnitTest::GetInstance ()->current_test_info()->name();
268+ ThreadHost thread_host (" io.flutter.test." + test_name + " ." ,
269+ ThreadHost::Type::Platform | ThreadHost::Type::GPU |
270+ ThreadHost::Type::IO | ThreadHost::Type::UI);
271+ TaskRunners task_runners (" test" , thread_host.platform_thread ->GetTaskRunner (),
272+ thread_host.raster_thread ->GetTaskRunner (),
273+ thread_host.ui_thread ->GetTaskRunner (),
274+ thread_host.io_thread ->GetTaskRunner ());
275+ MockDelegate delegate;
276+ EXPECT_CALL (delegate, GetTaskRunners ())
277+ .WillRepeatedly (ReturnRef (task_runners));
278+ auto rasterizer = std::make_unique<Rasterizer>(delegate);
279+
280+ std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
281+ std::make_shared<MockExternalViewEmbedder>();
282+ rasterizer->SetExternalViewEmbedder (external_view_embedder);
283+
284+ EXPECT_CALL (
285+ *external_view_embedder,
286+ EndFrame (/* should_resubmit_frame=*/ false ,
287+ /* raster_thread_merger=*/ fml::RefPtr<fml::RasterThreadMerger>(
288+ nullptr )))
289+ .Times (0 );
290+
291+ fml::AutoResetWaitableEvent latch;
292+ thread_host.raster_thread ->GetTaskRunner ()->PostTask ([&] {
293+ auto pipeline = fml::AdoptRef (new Pipeline<LayerTree>(/* depth=*/ 10 ));
294+ auto no_discard = [](LayerTree&) { return false ; };
295+ rasterizer->Draw (pipeline, no_discard);
296+ latch.Signal ();
297+ });
298+ latch.Wait ();
299+ }
264300} // namespace flutter
0 commit comments