Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 804ccac

Browse files
author
Emmanuel Garcia
committed
Handle case where there aren't overlays
1 parent 5f4deeb commit 804ccac

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

shell/platform/android/external_view_embedder/external_view_embedder.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,16 @@ void AndroidExternalViewEmbedder::SubmitFrame(
168168
params.sizePoints().height() * device_pixel_ratio_,
169169
params.mutatorsStack() //
170170
);
171-
const SkRect& overlay_rect = overlay_layers.at(view_id);
171+
std::unordered_map<int64_t, SkRect>::const_iterator overlay =
172+
overlay_layers.find(view_id);
173+
if (overlay == overlay_layers.end()) {
174+
continue;
175+
}
172176
std::unique_ptr<SurfaceFrame> frame =
173177
CreateSurfaceIfNeeded(context, //
174178
view_id, //
175179
pictures.at(view_id), //
176-
overlay_rect //
180+
overlay->second //
177181
);
178182
if (should_submit_current_frame) {
179183
frame->Submit();

shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,73 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame__overlayComposition) {
579579
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
580580
}
581581

582+
TEST(AndroidExternalViewEmbedder, SubmitFrame__platformViewWithoutAnyOverlay) {
583+
auto jni_mock = std::make_shared<JNIMock>();
584+
auto android_context =
585+
std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
586+
587+
auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
588+
auto gr_context = GrDirectContext::MakeMock(nullptr);
589+
auto frame_size = SkISize::Make(1000, 1000);
590+
auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
591+
[&android_context, gr_context, window, frame_size]() {
592+
auto surface_frame_1 = std::make_unique<SurfaceFrame>(
593+
SkSurface::MakeNull(1000, 1000), false,
594+
[](const SurfaceFrame& surface_frame, SkCanvas* canvas) {
595+
return true;
596+
});
597+
598+
auto surface_mock = std::make_unique<SurfaceMock>();
599+
EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
600+
.Times(1 /* frames */)
601+
.WillOnce(Return(ByMove(std::move(surface_frame_1))));
602+
603+
auto android_surface_mock =
604+
std::make_unique<AndroidSurfaceMock>(android_context);
605+
EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
606+
607+
EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
608+
.WillOnce(Return(ByMove(std::move(surface_mock))));
609+
610+
EXPECT_CALL(*android_surface_mock, SetNativeWindow(window));
611+
return android_surface_mock;
612+
});
613+
auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
614+
*android_context, jni_mock, surface_factory);
615+
616+
auto raster_thread_merger =
617+
GetThreadMergerFromPlatformThread(/*merged=*/true);
618+
619+
EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
620+
embedder->BeginFrame(frame_size, nullptr, 1.5, raster_thread_merger);
621+
622+
{
623+
// Add Android view.
624+
SkMatrix matrix;
625+
MutatorsStack stack;
626+
stack.PushTransform(SkMatrix::Translate(0, 0));
627+
628+
embedder->PrerollCompositeEmbeddedView(
629+
0, std::make_unique<EmbeddedViewParams>(matrix, SkSize::Make(200, 200),
630+
stack));
631+
EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(0, 0, 0, 200, 200,
632+
300, 300, stack));
633+
}
634+
635+
EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()).Times(0);
636+
637+
auto surface_frame = std::make_unique<SurfaceFrame>(
638+
SkSurface::MakeNull(1000, 1000), false,
639+
[](const SurfaceFrame& surface_frame, SkCanvas* canvas) mutable {
640+
return true;
641+
});
642+
643+
embedder->SubmitFrame(gr_context.get(), std::move(surface_frame), nullptr);
644+
645+
EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
646+
embedder->EndFrame(/*should_resubmit_frame=*/false, raster_thread_merger);
647+
}
648+
582649
TEST(AndroidExternalViewEmbedder, DoesNotCallJNIPlatformThreadOnlyMethods) {
583650
auto jni_mock = std::make_shared<JNIMock>();
584651

0 commit comments

Comments
 (0)