@@ -617,8 +617,7 @@ TEST_F(ShellTest,
617
617
};
618
618
auto external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
619
619
end_frame_callback, PostPrerollResult::kSuccess , true );
620
- // Set resubmit once to trigger thread merging.
621
- external_view_embedder->SetResubmitOnce ();
620
+
622
621
auto shell = CreateShell (std::move (settings), GetTaskRunnersForFixture (),
623
622
false , external_view_embedder);
624
623
@@ -674,18 +673,25 @@ TEST_F(ShellTest,
674
673
const size_t ThreadMergingLease = 10 ;
675
674
auto settings = CreateSettingsForFixture ();
676
675
fml::AutoResetWaitableEvent end_frame_latch;
676
+ std::shared_ptr<ShellTestExternalViewEmbedder> external_view_embedder;
677
+
677
678
auto end_frame_callback =
678
679
[&](bool should_resubmit_frame,
679
680
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
680
681
if (should_resubmit_frame && !raster_thread_merger->IsMerged ()) {
681
682
raster_thread_merger->MergeWithLease (ThreadMergingLease);
683
+
684
+ ASSERT_TRUE (raster_thread_merger->IsMerged ());
685
+ external_view_embedder->UpdatePostPrerollResult (
686
+ PostPrerollResult::kSuccess );
682
687
}
683
688
end_frame_latch.Signal ();
684
689
};
685
- auto external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
690
+ external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
686
691
end_frame_callback, PostPrerollResult::kSuccess , true );
687
692
// Set resubmit once to trigger thread merging.
688
- external_view_embedder->SetResubmitOnce ();
693
+ external_view_embedder->UpdatePostPrerollResult (
694
+ PostPrerollResult::kResubmitFrame );
689
695
auto shell = CreateShell (std::move (settings), GetTaskRunnersForFixture (),
690
696
false , external_view_embedder);
691
697
@@ -796,7 +802,8 @@ TEST_F(ShellTest,
796
802
797
803
// Pump a frame with `PostPrerollResult::kResubmitFrame` to start merging
798
804
// threads
799
- external_view_embedder->SetResubmitOnce ();
805
+ external_view_embedder->UpdatePostPrerollResult (
806
+ PostPrerollResult::kResubmitFrame );
800
807
PumpOneFrame (shell.get (), 100 , 100 , builder);
801
808
802
809
// Now destroy the platform view immediately.
@@ -988,6 +995,96 @@ TEST_F(ShellTest,
988
995
DestroyShell (std::move (shell), std::move (task_runners));
989
996
}
990
997
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
+
991
1088
TEST (SettingsTest, FrameTimingSetsAndGetsProperly) {
992
1089
// Ensure that all phases are in kPhases.
993
1090
ASSERT_EQ (sizeof (FrameTiming::kPhases ),
0 commit comments