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

Commit e4bd0b1

Browse files
author
Harry Terkelsen
authored
[canvaskit] Make the context current before disposing it (#36671)
1 parent 6aa683e commit e4bd0b1

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

lib/web_ui/lib/src/engine/canvaskit/surface.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ class Surface {
178178
// new canvas larger than required to avoid many canvas creations.
179179
final ui.Size newSize = previousCanvasSize == null ? size : size * 1.4;
180180

181+
// If we have a surface, send a dummy command to its canvas to make its context
182+
// current or else disposing the context could fail below.
183+
_surface?.getCanvas().clear(const ui.Color(0x00000000));
181184
_surface?.dispose();
182185
_surface = null;
183186
_addedToScene = false;

lib/web_ui/test/canvaskit/embedded_views_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:ui/src/engine.dart';
1010
import 'package:ui/ui.dart' as ui;
1111

1212
import 'common.dart';
13+
import 'test_data.dart';
1314

1415
void main() {
1516
internalBootstrapBrowserTest(() => testMain);
@@ -618,6 +619,52 @@ void testMain() {
618619
);
619620
});
620621

622+
test('does not crash when resizing the window after textures have been registered', () async {
623+
ui.platformViewRegistry.registerViewFactory(
624+
'test-platform-view',
625+
(int viewId) => createDomHTMLDivElement()..id = 'view-0',
626+
);
627+
await createPlatformView(0, 'test-platform-view');
628+
629+
final CkBrowserImageDecoder image = await CkBrowserImageDecoder.create(
630+
data: kAnimatedGif,
631+
debugSource: 'test',
632+
);
633+
final ui.FrameInfo frame = await image.getNextFrame();
634+
final CkImage ckImage = frame.image as CkImage;
635+
636+
final LayerSceneBuilder sb = LayerSceneBuilder();
637+
sb.pushOffset(0, 0);
638+
final CkPictureRecorder recorder = CkPictureRecorder();
639+
final CkCanvas canvas = recorder.beginRecording(ui.Rect.largest);
640+
canvas.drawImage(ckImage, ui.Offset.zero, CkPaint());
641+
final CkPicture picture = recorder.endRecording();
642+
sb.addPicture(ui.Offset.zero, picture);
643+
sb.addPlatformView(0, width: 10, height: 10);
644+
645+
window.webOnlyDebugPhysicalSizeOverride = const ui.Size(100, 100);
646+
window.debugForceResize();
647+
CanvasKitRenderer.instance.rasterizer.draw(sb.build().layerTree);
648+
_expectSceneMatches(<_EmbeddedViewMarker>[
649+
_overlay,
650+
_platformView,
651+
_overlay,
652+
]);
653+
654+
window.webOnlyDebugPhysicalSizeOverride = const ui.Size(200, 200);
655+
window.debugForceResize();
656+
CanvasKitRenderer.instance.rasterizer.draw(sb.build().layerTree);
657+
_expectSceneMatches(<_EmbeddedViewMarker>[
658+
_overlay,
659+
_platformView,
660+
_overlay,
661+
]);
662+
663+
window.webOnlyDebugPhysicalSizeOverride = null;
664+
window.debugForceResize();
665+
// ImageDecoder is not supported in Safari or Firefox.
666+
}, skip: isSafari || isFirefox);
667+
621668
test('removed the DOM node of an unrendered platform view', () async {
622669
final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer;
623670
ui.platformViewRegistry.registerViewFactory(

0 commit comments

Comments
 (0)