From 77319db8bbaefc37043e769ab90d12df61f2f635 Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Fri, 7 Oct 2022 14:19:55 -0700 Subject: [PATCH 1/5] WIP --- .../lib/src/engine/canvaskit/surface.dart | 6 +++ .../test/canvaskit/embedded_views_test.dart | 54 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/lib/web_ui/lib/src/engine/canvaskit/surface.dart b/lib/web_ui/lib/src/engine/canvaskit/surface.dart index 7e859ba394864..6808b1e9f9556 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/surface.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/surface.dart @@ -178,9 +178,15 @@ 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; + if (_grContext != null) { + print('ABOUT TO RELEASE GRCONTEXT!'); + } _grContext?.releaseResourcesAndAbandonContext(); _grContext?.delete(); _grContext = null; diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index e72bc0df0c6bb..605c7663b081a 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,59 @@ 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); + + final CkPictureRecorder recorder2 = CkPictureRecorder(); + final CkCanvas canvas2 = recorder.beginRecording(ui.Rect.largest); + canvas.drawRect(const ui.Rect.fromLTRB(0, 0, 50, 50), CkPaint()..color = const ui.Color(0xffff0000)); + final CkPicture picture2 = recorder.endRecording(); + sb.addPicture(ui.Offset.zero, picture2); + + + + 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(); + }); + test('removed the DOM node of an unrendered platform view', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; ui.platformViewRegistry.registerViewFactory( From 1af9383f46be6a6a761c06a10e21e58da7512f69 Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Fri, 7 Oct 2022 16:52:36 -0700 Subject: [PATCH 2/5] Call canvas.clear() before deleting a Surface to make it current --- lib/web_ui/lib/src/engine/canvaskit/surface.dart | 5 +---- lib/web_ui/test/canvaskit/embedded_views_test.dart | 9 +-------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/surface.dart b/lib/web_ui/lib/src/engine/canvaskit/surface.dart index 6808b1e9f9556..9b9edf38c30c4 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/surface.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/surface.dart @@ -180,13 +180,10 @@ class Surface { // 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?.getCanvas().clear(const ui.Color(0x00000000)); _surface?.dispose(); _surface = null; _addedToScene = false; - if (_grContext != null) { - print('ABOUT TO RELEASE GRCONTEXT!'); - } _grContext?.releaseResourcesAndAbandonContext(); _grContext?.delete(); _grContext = null; diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index 605c7663b081a..6bb2dfc4f31f7 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:typed_data'; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; @@ -642,14 +643,6 @@ void testMain() { sb.addPicture(ui.Offset.zero, picture); sb.addPlatformView(0, width: 10, height: 10); - final CkPictureRecorder recorder2 = CkPictureRecorder(); - final CkCanvas canvas2 = recorder.beginRecording(ui.Rect.largest); - canvas.drawRect(const ui.Rect.fromLTRB(0, 0, 50, 50), CkPaint()..color = const ui.Color(0xffff0000)); - final CkPicture picture2 = recorder.endRecording(); - sb.addPicture(ui.Offset.zero, picture2); - - - window.webOnlyDebugPhysicalSizeOverride = const ui.Size(100, 100); window.debugForceResize(); CanvasKitRenderer.instance.rasterizer.draw(sb.build().layerTree); From ca58bcddd0824434d6205f7b0d09e5f2dbf2782d Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Fri, 21 Oct 2022 10:32:40 -0700 Subject: [PATCH 3/5] Delete unused import --- lib/web_ui/test/canvaskit/embedded_views_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index 6bb2dfc4f31f7..821bd051443bb 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. import 'dart:async'; -import 'dart:typed_data'; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; From ce432611b03b66efa7c1354c8568ede1453ed1e8 Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Fri, 21 Oct 2022 11:01:52 -0700 Subject: [PATCH 4/5] Skip test on Safari --- lib/web_ui/test/canvaskit/embedded_views_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index 821bd051443bb..b3192271ab5e2 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -662,7 +662,8 @@ void testMain() { window.webOnlyDebugPhysicalSizeOverride = null; window.debugForceResize(); - }); + // ImageDecoder is not supported in Safari. + }, skip: isSafari); test('removed the DOM node of an unrendered platform view', () async { final Rasterizer rasterizer = CanvasKitRenderer.instance.rasterizer; From b7cbbd2042f6276774c50f6048d25bd788fb4b0b Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Fri, 21 Oct 2022 12:40:20 -0700 Subject: [PATCH 5/5] Also disable test in Firefox --- lib/web_ui/test/canvaskit/embedded_views_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index b3192271ab5e2..f39e03ebb5e27 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -662,8 +662,8 @@ void testMain() { window.webOnlyDebugPhysicalSizeOverride = null; window.debugForceResize(); - // ImageDecoder is not supported in Safari. - }, skip: isSafari); + // 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;