@@ -617,8 +617,7 @@ TEST_F(ShellTest,
617617 };
618618 auto external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
619619 end_frame_callback, PostPrerollResult::kSuccess , true );
620- // Set resubmit once to trigger thread merging.
621- external_view_embedder->SetResubmitOnce ();
620+
622621 auto shell = CreateShell (std::move (settings), GetTaskRunnersForFixture (),
623622 false , external_view_embedder);
624623
@@ -674,18 +673,25 @@ TEST_F(ShellTest,
674673 const size_t ThreadMergingLease = 10 ;
675674 auto settings = CreateSettingsForFixture ();
676675 fml::AutoResetWaitableEvent end_frame_latch;
676+ std::shared_ptr<ShellTestExternalViewEmbedder> external_view_embedder;
677+
677678 auto end_frame_callback =
678679 [&](bool should_resubmit_frame,
679680 fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
680681 if (should_resubmit_frame && !raster_thread_merger->IsMerged ()) {
681682 raster_thread_merger->MergeWithLease (ThreadMergingLease);
683+
684+ ASSERT_TRUE (raster_thread_merger->IsMerged ());
685+ external_view_embedder->UpdatePostPrerollResult (
686+ PostPrerollResult::kSuccess );
682687 }
683688 end_frame_latch.Signal ();
684689 };
685- auto external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
690+ external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
686691 end_frame_callback, PostPrerollResult::kSuccess , true );
687692 // Set resubmit once to trigger thread merging.
688- external_view_embedder->SetResubmitOnce ();
693+ external_view_embedder->UpdatePostPrerollResult (
694+ PostPrerollResult::kResubmitFrame );
689695 auto shell = CreateShell (std::move (settings), GetTaskRunnersForFixture (),
690696 false , external_view_embedder);
691697
@@ -796,7 +802,8 @@ TEST_F(ShellTest,
796802
797803 // Pump a frame with `PostPrerollResult::kResubmitFrame` to start merging
798804 // threads
799- external_view_embedder->SetResubmitOnce ();
805+ external_view_embedder->UpdatePostPrerollResult (
806+ PostPrerollResult::kResubmitFrame );
800807 PumpOneFrame (shell.get (), 100 , 100 , builder);
801808
802809 // Now destroy the platform view immediately.
@@ -988,6 +995,96 @@ TEST_F(ShellTest,
988995 DestroyShell (std::move (shell), std::move (task_runners));
989996}
990997
998+ // TODO(https://github.com/flutter/flutter/issues/59816): Enable on fuchsia.
999+ TEST_F (ShellTest,
1000+ #if defined(OS_FUCHSIA)
1001+ DISABLED_SkipAndSubmitFrame
1002+ #else
1003+ SkipAndSubmitFrame
1004+ #endif
1005+ ) {
1006+ auto settings = CreateSettingsForFixture ();
1007+ fml::AutoResetWaitableEvent end_frame_latch;
1008+ std::shared_ptr<ShellTestExternalViewEmbedder> external_view_embedder;
1009+
1010+ auto end_frame_callback =
1011+ [&](bool should_resubmit_frame,
1012+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
1013+ external_view_embedder->UpdatePostPrerollResult (
1014+ PostPrerollResult::kSuccess );
1015+ end_frame_latch.Signal ();
1016+ };
1017+ external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
1018+ end_frame_callback, PostPrerollResult::kSkipAndRetryFrame , true );
1019+
1020+ auto shell = CreateShell (std::move (settings), GetTaskRunnersForFixture (),
1021+ false , external_view_embedder);
1022+
1023+ PlatformViewNotifyCreated (shell.get ());
1024+
1025+ auto configuration = RunConfiguration::InferFromSettings (settings);
1026+ configuration.SetEntrypoint (" emptyMain" );
1027+ RunEngine (shell.get (), std::move (configuration));
1028+
1029+ ASSERT_EQ (0 , external_view_embedder->GetSubmittedFrameCount ());
1030+
1031+ PumpOneFrame (shell.get ());
1032+
1033+ // `EndFrame` changed the post preroll result to `kSuccess`.
1034+ end_frame_latch.Wait ();
1035+ ASSERT_EQ (0 , external_view_embedder->GetSubmittedFrameCount ());
1036+
1037+ PumpOneFrame (shell.get ());
1038+ end_frame_latch.Wait ();
1039+ ASSERT_EQ (1 , external_view_embedder->GetSubmittedFrameCount ());
1040+
1041+ DestroyShell (std::move (shell));
1042+ }
1043+
1044+ // TODO(https://github.com/flutter/flutter/issues/59816): Enable on fuchsia.
1045+ TEST_F (ShellTest,
1046+ #if defined(OS_FUCHSIA)
1047+ DISABLED_ResubmitFrame
1048+ #else
1049+ ResubmitFrame
1050+ #endif
1051+ ) {
1052+ auto settings = CreateSettingsForFixture ();
1053+ fml::AutoResetWaitableEvent end_frame_latch;
1054+ std::shared_ptr<ShellTestExternalViewEmbedder> external_view_embedder;
1055+
1056+ auto end_frame_callback =
1057+ [&](bool should_resubmit_frame,
1058+ fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
1059+ external_view_embedder->UpdatePostPrerollResult (
1060+ PostPrerollResult::kSuccess );
1061+ end_frame_latch.Signal ();
1062+ };
1063+ external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
1064+ end_frame_callback, PostPrerollResult::kResubmitFrame , true );
1065+
1066+ auto shell = CreateShell (std::move (settings), GetTaskRunnersForFixture (),
1067+ false , external_view_embedder);
1068+
1069+ PlatformViewNotifyCreated (shell.get ());
1070+
1071+ auto configuration = RunConfiguration::InferFromSettings (settings);
1072+ configuration.SetEntrypoint (" emptyMain" );
1073+ RunEngine (shell.get (), std::move (configuration));
1074+
1075+ ASSERT_EQ (0 , external_view_embedder->GetSubmittedFrameCount ());
1076+
1077+ PumpOneFrame (shell.get ());
1078+ // `EndFrame` changed the post preroll result to `kSuccess`.
1079+ end_frame_latch.Wait ();
1080+ ASSERT_EQ (1 , external_view_embedder->GetSubmittedFrameCount ());
1081+
1082+ end_frame_latch.Wait ();
1083+ ASSERT_EQ (2 , external_view_embedder->GetSubmittedFrameCount ());
1084+
1085+ DestroyShell (std::move (shell));
1086+ }
1087+
9911088TEST (SettingsTest, FrameTimingSetsAndGetsProperly) {
9921089 // Ensure that all phases are in kPhases.
9931090 ASSERT_EQ (sizeof (FrameTiming::kPhases ),
0 commit comments