From 03acf8c63567e97ba4f1d14005787af47c3e26b4 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Wed, 11 Dec 2024 09:14:14 -0800 Subject: [PATCH] Dispose pictures created in HtmlViewEmbedder.submitFrame (flutter/engine#57102) See https://github.com/flutter/flutter/issues/153678 --- .../src/engine/canvaskit/embedded_views.dart | 1 + .../test/canvaskit/embedded_views_test.dart | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart index e493c8a36cc58..26af188fd047b 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart @@ -394,6 +394,7 @@ class HtmlViewEmbedder { .endRecording(); await rasterizer.rasterizeToCanvas( renderCanvas.displayCanvas!, [renderPicture]); + renderPicture.dispose(); } for (final CkPictureRecorder recorder diff --git a/engine/src/flutter/lib/web_ui/test/canvaskit/embedded_views_test.dart b/engine/src/flutter/lib/web_ui/test/canvaskit/embedded_views_test.dart index cf71addabe271..231aa8ea2ff35 100644 --- a/engine/src/flutter/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/engine/src/flutter/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -35,6 +35,7 @@ void testMain() { tearDown(() { PlatformViewManager.instance.debugClear(); CanvasKitRenderer.instance.debugClear(); + Instrumentation.enabled = false; }); test('embeds interactive platform views', () async { @@ -1574,6 +1575,36 @@ void testMain() { expect(picturesPerCanvasInSecondRendering, [19]); debugOverrideJsConfiguration(null); }); + + test('disposes render pictures', () async { + Instrumentation.enabled = true; + Instrumentation.instance.debugCounters.clear(); + + ui_web.platformViewRegistry.registerViewFactory( + 'test-view', + (int viewId) => createDomHTMLDivElement()..className = 'platform-view', + ); + + CkPicture rectPicture(ui.Rect rect) { + return paintPicture(rect, (CkCanvas canvas) { + canvas.drawRect( + rect, CkPaint()..color = const ui.Color.fromARGB(255, 255, 0, 0)); + }); + } + final CkPicture picture = rectPicture(const ui.Rect.fromLTWH(0, 0, 20, 20)); + + await createPlatformView(0, 'test-view'); + + final LayerSceneBuilder sb = LayerSceneBuilder(); + sb.addPicture(ui.Offset.zero, picture); + sb.addPlatformView(0, width: 20, height: 20); + final LayerScene scene = sb.build(); + await renderScene(scene); + + picture.dispose(); + final Map debugCounters = Instrumentation.instance.debugCounters; + expect(debugCounters['Picture Created'], debugCounters['Picture Deleted']); + }); }); }