diff --git a/lib/web_ui/lib/src/engine/canvaskit/surface.dart b/lib/web_ui/lib/src/engine/canvaskit/surface.dart index 7e859ba394864..9b9edf38c30c4 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/surface.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/surface.dart @@ -178,6 +178,9 @@ class Surface { // new canvas larger than required to avoid many canvas creations. final ui.Size newSize = previousCanvasSize == null ? size : size * 1.4; + // If we have a surface, send a dummy command to its canvas to make its context + // current or else disposing the context could fail below. + _surface?.getCanvas().clear(const ui.Color(0x00000000)); _surface?.dispose(); _surface = null; _addedToScene = false; diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index e72bc0df0c6bb..f39e03ebb5e27 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -10,6 +10,7 @@ import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; import 'common.dart'; +import 'test_data.dart'; void main() { internalBootstrapBrowserTest(() => testMain); @@ -618,6 +619,52 @@ void testMain() { ); }); + test('does not crash when resizing the window after textures have been registered', () async { + ui.platformViewRegistry.registerViewFactory( + 'test-platform-view', + (int viewId) => createDomHTMLDivElement()..id = 'view-0', + ); + await createPlatformView(0, 'test-platform-view'); + + final CkBrowserImageDecoder image = await CkBrowserImageDecoder.create( + data: kAnimatedGif, + debugSource: 'test', + ); + final ui.FrameInfo frame = await image.getNextFrame(); + final CkImage ckImage = frame.image as CkImage; + + final LayerSceneBuilder sb = LayerSceneBuilder(); + sb.pushOffset(0, 0); + final CkPictureRecorder recorder = CkPictureRecorder(); + final CkCanvas canvas = recorder.beginRecording(ui.Rect.largest); + canvas.drawImage(ckImage, ui.Offset.zero, CkPaint()); + final CkPicture picture = recorder.endRecording(); + sb.addPicture(ui.Offset.zero, picture); + sb.addPlatformView(0, width: 10, height: 10); + + window.webOnlyDebugPhysicalSizeOverride = const ui.Size(100, 100); + window.debugForceResize(); + CanvasKitRenderer.instance.rasterizer.draw(sb.build().layerTree); + _expectSceneMatches(<_EmbeddedViewMarker>[ + _overlay, + _platformView, + _overlay, + ]); + + window.webOnlyDebugPhysicalSizeOverride = const ui.Size(200, 200); + window.debugForceResize(); + CanvasKitRenderer.instance.rasterizer.draw(sb.build().layerTree); + _expectSceneMatches(<_EmbeddedViewMarker>[ + _overlay, + _platformView, + _overlay, + ]); + + window.webOnlyDebugPhysicalSizeOverride = null; + window.debugForceResize(); + // ImageDecoder is not supported in Safari or Firefox. + }, skip: isSafari || isFirefox); + test('removed the DOM node of an unrendered platform view', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; ui.platformViewRegistry.registerViewFactory(