From e6967bd51b8e9c90510befade87de18cb786d0c2 Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Wed, 6 Dec 2023 15:58:07 -0800 Subject: [PATCH 1/4] Only clear fragmentProgramCache on hot restart --- .../src/engine/canvaskit/embedded_views.dart | 5 +++-- .../lib/src/engine/canvaskit/renderer.dart | 3 +++ lib/web_ui/lib/src/engine/html/renderer.dart | 1 + .../engine/skwasm/skwasm_impl/renderer.dart | 1 + lib/web_ui/lib/src/engine/window.dart | 4 +--- .../test/canvaskit/embedded_views_test.dart | 20 ++++++++++++++----- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart index f7a8dcfaa5e65..b38345cba5fd6 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart @@ -440,8 +440,7 @@ class HtmlViewEmbedder { sceneHost.insertBefore(platformViewRoot, elementToInsertBefore); final RenderCanvas? overlay = _overlays[viewId]; if (overlay != null) { - sceneHost.insertBefore( - overlay.htmlElement, elementToInsertBefore); + sceneHost.insertBefore(overlay.htmlElement, elementToInsertBefore); } } else { final DomElement platformViewRoot = _viewClipChains[viewId]!.root; @@ -651,6 +650,8 @@ class HtmlViewEmbedder { } } _svgClipDefs.clear(); + _svgPathDefs?.remove(); + _svgPathDefs = null; } static void removeElement(DomElement element) { diff --git a/lib/web_ui/lib/src/engine/canvaskit/renderer.dart b/lib/web_ui/lib/src/engine/canvaskit/renderer.dart index 1caf88ffaa80e..1d892bd98afab 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/renderer.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/renderer.dart @@ -66,6 +66,7 @@ class CanvasKitRenderer implements Renderer { } _instance = this; }(); + registerHotRestartListener(debugClear); return _initialized; } @@ -425,6 +426,8 @@ class CanvasKitRenderer implements Renderer { rasterizer.renderCanvasFactory.debugClear(); rasterizer.viewEmbedder.debugClear(); } + _rasterizers.clear(); + clearFragmentProgramCache(); } @override diff --git a/lib/web_ui/lib/src/engine/html/renderer.dart b/lib/web_ui/lib/src/engine/html/renderer.dart index 7e74faefc09a0..f7acee4871c90 100644 --- a/lib/web_ui/lib/src/engine/html/renderer.dart +++ b/lib/web_ui/lib/src/engine/html/renderer.dart @@ -31,6 +31,7 @@ class HtmlRenderer implements Renderer { // to make the unpacking happen while we are waiting for network requests. lineLookup; }); + registerHotRestartListener(clearFragmentProgramCache); _instance = this; } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart index 292994ec18122..df4cf213a33a3 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart @@ -349,6 +349,7 @@ class SkwasmRenderer implements Renderer { FutureOr initialize() { surface = SkwasmSurface(); sceneView = EngineSceneView(SkwasmPictureRenderer(surface)); + registerHotRestartListener(clearFragmentProgramCache); } @override diff --git a/lib/web_ui/lib/src/engine/window.dart b/lib/web_ui/lib/src/engine/window.dart index d0f67582b7031..a7c6fed3fc278 100644 --- a/lib/web_ui/lib/src/engine/window.dart +++ b/lib/web_ui/lib/src/engine/window.dart @@ -9,7 +9,7 @@ import 'package:meta/meta.dart'; import 'package:ui/ui.dart' as ui; import 'package:ui/ui_web/src/ui_web.dart' as ui_web; -import '../engine.dart' show DimensionsProvider, registerHotRestartListener, renderer; +import '../engine.dart' show DimensionsProvider, registerHotRestartListener; import 'display.dart'; import 'dom.dart'; import 'mouse/context_menu.dart'; @@ -91,8 +91,6 @@ base class EngineFlutterView implements ui.FlutterView { isDisposed = true; dimensionsProvider.close(); dom.rootElement.remove(); - // TODO(harryterkelsen): What should we do about this in multi-view? - renderer.clearFragmentProgramCache(); semantics.reset(); } diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index 7884b85aeb8a8..33aa18c5d749c 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -189,8 +189,7 @@ void testMain() { CanvasKitRenderer.instance.renderScene(sb.build(), implicitView); // Transformations happen on the slot element. - DomElement slotHost = - sceneHost.querySelector('flt-platform-view-slot')!; + DomElement slotHost = sceneHost.querySelector('flt-platform-view-slot')!; expect( getTransformChain(slotHost), @@ -715,12 +714,23 @@ void testMain() { CanvasKitRenderer.instance.renderScene(sb.build(), implicitView); } - final DomNode skPathDefs = sceneHost.querySelector('#sk_path_defs')!; + DomElement? skPathDefs = sceneHost.querySelector('#sk_path_defs'); - expect(skPathDefs.childNodes, hasLength(0)); + expect( + skPathDefs, + isNull, + reason: 'Rasterizer should not make SVG paths node before first render', + ); renderTestScene(); - expect(skPathDefs.childNodes, hasLength(1)); + + skPathDefs = sceneHost.querySelector('#sk_path_defs'); + expect( + skPathDefs, + isNotNull, + reason: 'Should have created SVG paths after rendering the scene', + ); + expect(skPathDefs!.childNodes, hasLength(1)); await Future.delayed(Duration.zero); renderTestScene(); From e5cd4b0707da9c8b7b9c84ecbb703bea844dcbba Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Tue, 19 Dec 2023 16:24:33 -0800 Subject: [PATCH 2/4] fix formatting --- .../lib/src/engine/canvaskit/renderer.dart | 439 ++++++++++-------- 1 file changed, 234 insertions(+), 205 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/renderer.dart b/lib/web_ui/lib/src/engine/canvaskit/renderer.dart index 0e0a6df24ddaa..df9ae2fa20b54 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/renderer.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/renderer.dart @@ -104,11 +104,12 @@ class CanvasKitRenderer implements Renderer { List? textureCoordinates, List? colors, List? indices, - }) => - CkVertices(mode, positions, - textureCoordinates: textureCoordinates, - colors: colors, - indices: indices); + }) => CkVertices( + mode, + positions, + textureCoordinates: textureCoordinates, + colors: colors, + indices: indices); @override ui.Vertices createVerticesRaw( @@ -117,23 +118,26 @@ class CanvasKitRenderer implements Renderer { Float32List? textureCoordinates, Int32List? colors, Uint16List? indices, - }) => - CkVertices.raw(mode, positions, - textureCoordinates: textureCoordinates, - colors: colors, - indices: indices); + }) => CkVertices.raw( + mode, + positions, + textureCoordinates: textureCoordinates, + colors: colors, + indices: indices); @override ui.Canvas createCanvas(ui.PictureRecorder recorder, [ui.Rect? cullRect]) => - CanvasKitCanvas(recorder, cullRect); + CanvasKitCanvas(recorder, cullRect); @override ui.Gradient createLinearGradient( - ui.Offset from, ui.Offset to, List colors, - [List? colorStops, - ui.TileMode tileMode = ui.TileMode.clamp, - Float32List? matrix4]) => - CkGradientLinear(from, to, colors, colorStops, tileMode, matrix4); + ui.Offset from, + ui.Offset to, + List colors, [ + List? colorStops, + ui.TileMode tileMode = ui.TileMode.clamp, + Float32List? matrix4 + ]) => CkGradientLinear(from, to, colors, colorStops, tileMode, matrix4); @override ui.Gradient createRadialGradient( @@ -143,27 +147,38 @@ class CanvasKitRenderer implements Renderer { List? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4, - ]) => - CkGradientRadial(center, radius, colors, colorStops, tileMode, matrix4); + ]) => CkGradientRadial(center, radius, colors, colorStops, tileMode, matrix4); @override - ui.Gradient createConicalGradient(ui.Offset focal, double focalRadius, - ui.Offset center, double radius, List colors, - [List? colorStops, - ui.TileMode tileMode = ui.TileMode.clamp, - Float32List? matrix]) => - CkGradientConical(focal, focalRadius, center, radius, colors, colorStops, - tileMode, matrix); - - @override - ui.Gradient createSweepGradient(ui.Offset center, List colors, - [List? colorStops, - ui.TileMode tileMode = ui.TileMode.clamp, - double startAngle = 0.0, - double endAngle = math.pi * 2, - Float32List? matrix4]) => - CkGradientSweep( - center, colors, colorStops, tileMode, startAngle, endAngle, matrix4); + ui.Gradient createConicalGradient( + ui.Offset focal, + double focalRadius, + ui.Offset center, + double radius, + List colors, + [List? colorStops, + ui.TileMode tileMode = ui.TileMode.clamp, + Float32List? matrix] + ) => CkGradientConical( + focal, + focalRadius, + center, + radius, + colors, + colorStops, + tileMode, + matrix); + + @override + ui.Gradient createSweepGradient( + ui.Offset center, + List colors, [ + List? colorStops, + ui.TileMode tileMode = ui.TileMode.clamp, + double startAngle = 0.0, + double endAngle = math.pi * 2, + Float32List? matrix4 + ]) => CkGradientSweep(center, colors, colorStops, tileMode, startAngle, endAngle, matrix4); @override ui.PictureRecorder createPictureRecorder() => CkPictureRecorder(); @@ -172,32 +187,29 @@ class CanvasKitRenderer implements Renderer { ui.SceneBuilder createSceneBuilder() => LayerSceneBuilder(); @override - ui.ImageFilter createBlurImageFilter( - {double sigmaX = 0.0, - double sigmaY = 0.0, - ui.TileMode tileMode = ui.TileMode.clamp}) => - CkImageFilter.blur(sigmaX: sigmaX, sigmaY: sigmaY, tileMode: tileMode); + ui.ImageFilter createBlurImageFilter({ + double sigmaX = 0.0, + double sigmaY = 0.0, + ui.TileMode tileMode = ui.TileMode.clamp + }) => CkImageFilter.blur(sigmaX: sigmaX, sigmaY: sigmaY, tileMode: tileMode); @override - ui.ImageFilter createDilateImageFilter( - {double radiusX = 0.0, double radiusY = 0.0}) { + ui.ImageFilter createDilateImageFilter({double radiusX = 0.0, double radiusY = 0.0}) { // TODO(fzyzcjy): implement dilate. https://github.com/flutter/flutter/issues/101085 - throw UnimplementedError( - 'ImageFilter.dilate not implemented for CanvasKit.'); + throw UnimplementedError('ImageFilter.dilate not implemented for CanvasKit.'); } @override - ui.ImageFilter createErodeImageFilter( - {double radiusX = 0.0, double radiusY = 0.0}) { + ui.ImageFilter createErodeImageFilter({double radiusX = 0.0, double radiusY = 0.0}) { // TODO(fzyzcjy): implement erode. https://github.com/flutter/flutter/issues/101085 - throw UnimplementedError( - 'ImageFilter.erode not implemented for CanvasKit.'); + throw UnimplementedError('ImageFilter.erode not implemented for CanvasKit.'); } @override - ui.ImageFilter createMatrixImageFilter(Float64List matrix4, - {ui.FilterQuality filterQuality = ui.FilterQuality.low}) => - CkImageFilter.matrix(matrix: matrix4, filterQuality: filterQuality); + ui.ImageFilter createMatrixImageFilter( + Float64List matrix4, { + ui.FilterQuality filterQuality = ui.FilterQuality.low + }) => CkImageFilter.matrix(matrix: matrix4, filterQuality: filterQuality); @override ui.ImageFilter composeImageFilters( @@ -211,25 +223,33 @@ class CanvasKitRenderer implements Renderer { inner = CkColorFilterImageFilter(colorFilter: colorFilter); } return CkImageFilter.compose( - outer: outer as CkImageFilter, inner: inner as CkImageFilter); + outer: outer as CkImageFilter, inner: inner as CkImageFilter); } @override - Future instantiateImageCodec(Uint8List list, - {int? targetWidth, - int? targetHeight, - bool allowUpscaling = true}) async => - skiaInstantiateImageCodec(list, targetWidth, targetHeight); + Future instantiateImageCodec( + Uint8List list, { + int? targetWidth, + int? targetHeight, + bool allowUpscaling = true + }) async => skiaInstantiateImageCodec( + list, + targetWidth, + targetHeight + ); @override - Future instantiateImageCodecFromUrl(Uri uri, - {ui_web.ImageCodecChunkCallback? chunkCallback}) => - skiaInstantiateWebImageCodec(uri.toString(), chunkCallback); + Future instantiateImageCodecFromUrl( + Uri uri, { + ui_web.ImageCodecChunkCallback? chunkCallback + }) => skiaInstantiateWebImageCodec(uri.toString(), chunkCallback); @override ui.Image createImageFromImageBitmap(DomImageBitmap imageBitmap) { - final SkImage? skImage = - canvasKit.MakeLazyImageFromImageBitmap(imageBitmap, true); + final SkImage? skImage = canvasKit.MakeLazyImageFromImageBitmap( + imageBitmap, + true + ); if (skImage == null) { throw Exception('Failed to convert image bitmap to an SkImage.'); } @@ -237,26 +257,36 @@ class CanvasKitRenderer implements Renderer { } @override - void decodeImageFromPixels(Uint8List pixels, int width, int height, - ui.PixelFormat format, ui.ImageDecoderCallback callback, - {int? rowBytes, - int? targetWidth, - int? targetHeight, - bool allowUpscaling = true}) => - skiaDecodeImageFromPixels(pixels, width, height, format, callback, - rowBytes: rowBytes, - targetWidth: targetWidth, - targetHeight: targetHeight, - allowUpscaling: allowUpscaling); + void decodeImageFromPixels( + Uint8List pixels, + int width, + int height, + ui.PixelFormat format, + ui.ImageDecoderCallback callback, { + int? rowBytes, + int? targetWidth, + int? targetHeight, + bool allowUpscaling = true + }) => skiaDecodeImageFromPixels( + pixels, + width, + height, + format, + callback, + rowBytes: rowBytes, + targetWidth: targetWidth, + targetHeight: targetHeight, + allowUpscaling: allowUpscaling + ); @override ui.ImageShader createImageShader( - ui.Image image, - ui.TileMode tmx, - ui.TileMode tmy, - Float64List matrix4, - ui.FilterQuality? filterQuality) => - CkImageShader(image, tmx, tmy, matrix4, filterQuality); + ui.Image image, + ui.TileMode tmx, + ui.TileMode tmy, + Float64List matrix4, + ui.FilterQuality? filterQuality + ) => CkImageShader(image, tmx, tmy, matrix4, filterQuality); @override ui.Path createPath() => CkPath(); @@ -266,111 +296,111 @@ class CanvasKitRenderer implements Renderer { @override ui.Path combinePaths(ui.PathOperation op, ui.Path path1, ui.Path path2) => - CkPath.combine(op, path1, path2); - - @override - ui.TextStyle createTextStyle( - {ui.Color? color, - ui.TextDecoration? decoration, - ui.Color? decorationColor, - ui.TextDecorationStyle? decorationStyle, - double? decorationThickness, - ui.FontWeight? fontWeight, - ui.FontStyle? fontStyle, - ui.TextBaseline? textBaseline, - String? fontFamily, - List? fontFamilyFallback, - double? fontSize, - double? letterSpacing, - double? wordSpacing, - double? height, - ui.TextLeadingDistribution? leadingDistribution, - ui.Locale? locale, - ui.Paint? background, - ui.Paint? foreground, - List? shadows, - List? fontFeatures, - List? fontVariations}) => - CkTextStyle( - color: color, - decoration: decoration, - decorationColor: decorationColor, - decorationStyle: decorationStyle, - decorationThickness: decorationThickness, - fontWeight: fontWeight, - fontStyle: fontStyle, - textBaseline: textBaseline, - fontFamily: fontFamily, - fontFamilyFallback: fontFamilyFallback, - fontSize: fontSize, - letterSpacing: letterSpacing, - wordSpacing: wordSpacing, - height: height, - leadingDistribution: leadingDistribution, - locale: locale, - background: background as CkPaint?, - foreground: foreground as CkPaint?, - shadows: shadows, - fontFeatures: fontFeatures, - fontVariations: fontVariations, - ); - - @override - ui.ParagraphStyle createParagraphStyle( - {ui.TextAlign? textAlign, - ui.TextDirection? textDirection, - int? maxLines, - String? fontFamily, - double? fontSize, - double? height, - ui.TextHeightBehavior? textHeightBehavior, - ui.FontWeight? fontWeight, - ui.FontStyle? fontStyle, - ui.StrutStyle? strutStyle, - String? ellipsis, - ui.Locale? locale}) => - CkParagraphStyle( - textAlign: textAlign, - textDirection: textDirection, - maxLines: maxLines, - fontFamily: fontFamily, - fontSize: fontSize, - height: height, - textHeightBehavior: textHeightBehavior, - fontWeight: fontWeight, - fontStyle: fontStyle, - strutStyle: strutStyle, - ellipsis: ellipsis, - locale: locale, - applyRoundingHack: !ui.ParagraphBuilder.shouldDisableRoundingHack, - ); - - @override - ui.StrutStyle createStrutStyle( - {String? fontFamily, - List? fontFamilyFallback, - double? fontSize, - double? height, - ui.TextLeadingDistribution? leadingDistribution, - double? leading, - ui.FontWeight? fontWeight, - ui.FontStyle? fontStyle, - bool? forceStrutHeight}) => - CkStrutStyle( - fontFamily: fontFamily, - fontFamilyFallback: fontFamilyFallback, - fontSize: fontSize, - height: height, - leadingDistribution: leadingDistribution, - leading: leading, - fontWeight: fontWeight, - fontStyle: fontStyle, - forceStrutHeight: forceStrutHeight, - ); + CkPath.combine(op, path1, path2); + + @override + ui.TextStyle createTextStyle({ + ui.Color? color, + ui.TextDecoration? decoration, + ui.Color? decorationColor, + ui.TextDecorationStyle? decorationStyle, + double? decorationThickness, + ui.FontWeight? fontWeight, + ui.FontStyle? fontStyle, + ui.TextBaseline? textBaseline, + String? fontFamily, + List? fontFamilyFallback, + double? fontSize, + double? letterSpacing, + double? wordSpacing, + double? height, + ui.TextLeadingDistribution? leadingDistribution, + ui.Locale? locale, + ui.Paint? background, + ui.Paint? foreground, + List? shadows, + List? fontFeatures, + List? fontVariations + }) => CkTextStyle( + color: color, + decoration: decoration, + decorationColor: decorationColor, + decorationStyle: decorationStyle, + decorationThickness: decorationThickness, + fontWeight: fontWeight, + fontStyle: fontStyle, + textBaseline: textBaseline, + fontFamily: fontFamily, + fontFamilyFallback: fontFamilyFallback, + fontSize: fontSize, + letterSpacing: letterSpacing, + wordSpacing: wordSpacing, + height: height, + leadingDistribution: leadingDistribution, + locale: locale, + background: background as CkPaint?, + foreground: foreground as CkPaint?, + shadows: shadows, + fontFeatures: fontFeatures, + fontVariations: fontVariations, + ); + + @override + ui.ParagraphStyle createParagraphStyle({ + ui.TextAlign? textAlign, + ui.TextDirection? textDirection, + int? maxLines, + String? fontFamily, + double? fontSize, + double? height, + ui.TextHeightBehavior? textHeightBehavior, + ui.FontWeight? fontWeight, + ui.FontStyle? fontStyle, + ui.StrutStyle? strutStyle, + String? ellipsis, + ui.Locale? locale + }) => CkParagraphStyle( + textAlign: textAlign, + textDirection: textDirection, + maxLines: maxLines, + fontFamily: fontFamily, + fontSize: fontSize, + height: height, + textHeightBehavior: textHeightBehavior, + fontWeight: fontWeight, + fontStyle: fontStyle, + strutStyle: strutStyle, + ellipsis: ellipsis, + locale: locale, + applyRoundingHack: !ui.ParagraphBuilder.shouldDisableRoundingHack, + ); + + @override + ui.StrutStyle createStrutStyle({ + String? fontFamily, + List? fontFamilyFallback, + double? fontSize, + double? height, + ui.TextLeadingDistribution? leadingDistribution, + double? leading, + ui.FontWeight? fontWeight, + ui.FontStyle? fontStyle, + bool? forceStrutHeight + }) => CkStrutStyle( + fontFamily: fontFamily, + fontFamilyFallback: fontFamilyFallback, + fontSize: fontSize, + height: height, + leadingDistribution: leadingDistribution, + leading: leading, + fontWeight: fontWeight, + fontStyle: fontStyle, + forceStrutHeight: forceStrutHeight, + ); @override ui.ParagraphBuilder createParagraphBuilder(ui.ParagraphStyle style) => - CkParagraphBuilder(style); + CkParagraphBuilder(style); @override Future renderScene(ui.Scene scene, ui.FlutterView view) async { @@ -430,39 +460,38 @@ class CanvasKitRenderer implements Renderer { _programs.clear(); } - static final Map> _programs = - >{}; + static final Map> _programs = >{}; @override Future createFragmentProgram(String assetKey) { if (_programs.containsKey(assetKey)) { return _programs[assetKey]!; } - return _programs[assetKey] = - ui_web.assetManager.load(assetKey).then((ByteData data) { + return _programs[assetKey] = ui_web.assetManager.load(assetKey).then((ByteData data) { return CkFragmentProgram.fromBytes(assetKey, data.buffer.asUint8List()); }); } @override - ui.LineMetrics createLineMetrics( - {required bool hardBreak, - required double ascent, - required double descent, - required double unscaledAscent, - required double height, - required double width, - required double left, - required double baseline, - required int lineNumber}) => - EngineLineMetrics( - hardBreak: hardBreak, - ascent: ascent, - descent: descent, - unscaledAscent: unscaledAscent, - height: height, - width: width, - left: left, - baseline: baseline, - lineNumber: lineNumber); + ui.LineMetrics createLineMetrics({ + required bool hardBreak, + required double ascent, + required double descent, + required double unscaledAscent, + required double height, + required double width, + required double left, + required double baseline, + required int lineNumber + }) => EngineLineMetrics( + hardBreak: hardBreak, + ascent: ascent, + descent: descent, + unscaledAscent: unscaledAscent, + height: height, + width: width, + left: left, + baseline: baseline, + lineNumber: lineNumber + ); } From 3b7b12c173842cb3985761eec9ede72ec4d0cf5e Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Tue, 19 Dec 2023 16:39:44 -0800 Subject: [PATCH 3/4] Fix test since we don't dispose the Renderer after every test --- lib/web_ui/test/canvaskit/embedded_views_test.dart | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index bf0a175fec742..9aa12486c5f3a 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -731,17 +731,9 @@ void testMain() { await renderScene(sb.build()); } - DomElement? skPathDefs = sceneHost.querySelector('#sk_path_defs'); - - expect( - skPathDefs, - isNull, - reason: 'Rasterizer should not make SVG paths node before first render', - ); - await renderTestScene(); - skPathDefs = sceneHost.querySelector('#sk_path_defs'); + DomElement? skPathDefs = sceneHost.querySelector('#sk_path_defs'); expect( skPathDefs, isNotNull, From ed7753d2a5b3e63e085cd30bd49cf09ba88f94ca Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Wed, 20 Dec 2023 10:17:18 -0800 Subject: [PATCH 4/4] fix analysis errors --- lib/web_ui/test/canvaskit/embedded_views_test.dart | 2 +- 1 file changed, 1 insertion(+), 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 9aa12486c5f3a..c90a9e00b318b 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -733,7 +733,7 @@ void testMain() { await renderTestScene(); - DomElement? skPathDefs = sceneHost.querySelector('#sk_path_defs'); + final DomElement? skPathDefs = sceneHost.querySelector('#sk_path_defs'); expect( skPathDefs, isNotNull,