From 8dbef3c9e0bb6cf80284c106020c6e7008160894 Mon Sep 17 00:00:00 2001 From: Angjie Li Date: Wed, 14 Oct 2020 16:27:37 -0700 Subject: [PATCH 1/7] Auto detect mode to determine which rendering backend to use. --- .../src/engine/canvaskit/initialization.dart | 24 +++- .../lib/src/engine/canvaskit/shader.dart | 6 +- lib/web_ui/lib/src/engine/dom_renderer.dart | 4 +- .../lib/src/engine/html/shaders/shader.dart | 2 +- lib/web_ui/lib/src/engine/window.dart | 6 +- lib/web_ui/lib/src/ui/canvas.dart | 8 +- lib/web_ui/lib/src/ui/compositing.dart | 2 +- lib/web_ui/lib/src/ui/initialization.dart | 10 +- lib/web_ui/lib/src/ui/painting.dart | 20 +-- lib/web_ui/lib/src/ui/path.dart | 6 +- lib/web_ui/lib/src/ui/text.dart | 8 +- .../test/canvaskit/canvaskit_api_test.dart | 2 +- .../test/canvaskit/frame_timings_test.dart | 2 +- lib/web_ui/test/canvaskit/path_test.dart | 2 +- web_sdk/BUILD.gn | 124 +++++++++++++++++- 15 files changed, 178 insertions(+), 48 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart index c1d91ad525925..6d829c99bb07f 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart @@ -5,8 +5,28 @@ // @dart = 2.10 part of engine; -/// EXPERIMENTAL: Enable the Skia-based rendering backend. -const bool experimentalUseSkia = +@JS('window.flutterWebRenderer') +external String get customRenderer; + +bool get useCanvasKit => + _autoDetect ? _detectRenderer() : _useSkia; + +// Returns true if canvaskit is used. Otherwise, returns false. +bool _detectRenderer() { + if (customRenderer != null) { + return customRenderer == 'canvaskit'; + } + // If customRenderer is not specified, use canvaskit for desktop and html for + // mobile. + return isDesktop; +} + +/// Auto detect which rendering backend to use. +const bool _autoDetect = + bool.fromEnvironment('FLUTTER_WEB_AUTO_DETECT', defaultValue: false); + +/// Enable the Skia-based rendering backend. +const bool _useSkia = bool.fromEnvironment('FLUTTER_WEB_USE_SKIA', defaultValue: false); // If set to true, forces CPU-only rendering (i.e. no WebGL). diff --git a/lib/web_ui/lib/src/engine/canvaskit/shader.dart b/lib/web_ui/lib/src/engine/canvaskit/shader.dart index 6b0074b609d4c..d4f4e882a9717 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/shader.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/shader.dart @@ -81,7 +81,7 @@ class CkGradientLinear extends CkShader implements ui.Gradient { @override SkShader createDefault() { - assert(experimentalUseSkia); + assert(useCanvasKit); return canvasKit.SkShader.MakeLinearGradient( toSkPoint(from), @@ -109,7 +109,7 @@ class CkGradientRadial extends CkShader implements ui.Gradient { @override SkShader createDefault() { - assert(experimentalUseSkia); + assert(useCanvasKit); return canvasKit.SkShader.MakeRadialGradient( toSkPoint(center), @@ -141,7 +141,7 @@ class CkGradientConical extends CkShader implements ui.Gradient { @override SkShader createDefault() { - assert(experimentalUseSkia); + assert(useCanvasKit); return canvasKit.SkShader.MakeTwoPointConicalGradient( toSkPoint(focal), focalRadius, diff --git a/lib/web_ui/lib/src/engine/dom_renderer.dart b/lib/web_ui/lib/src/engine/dom_renderer.dart index 415ea66c86190..712a842fded3a 100644 --- a/lib/web_ui/lib/src/engine/dom_renderer.dart +++ b/lib/web_ui/lib/src/engine/dom_renderer.dart @@ -45,7 +45,7 @@ class DomRenderer { html.MetaElement? _viewportMeta; /// The canvaskit script, downloaded from a CDN. Only created if - /// [experimentalUseSkia] is set to true. + /// [useCanvasKit] is set to true. html.ScriptElement? get canvasKitScript => _canvasKitScript; html.ScriptElement? _canvasKitScript; @@ -451,7 +451,7 @@ flt-glass-pane * { }); } - if (experimentalUseSkia) { + if (useCanvasKit) { _canvasKitScript?.remove(); _canvasKitScript = html.ScriptElement(); _canvasKitScript!.src = canvasKitBaseUrl + 'canvaskit.js'; diff --git a/lib/web_ui/lib/src/engine/html/shaders/shader.dart b/lib/web_ui/lib/src/engine/html/shaders/shader.dart index 4dae88f674bf9..1225dec8ab006 100644 --- a/lib/web_ui/lib/src/engine/html/shaders/shader.dart +++ b/lib/web_ui/lib/src/engine/html/shaders/shader.dart @@ -116,7 +116,7 @@ class GradientRadial extends EngineGradient { @override Object createPaintStyle(html.CanvasRenderingContext2D? ctx) { - if (!experimentalUseSkia) { + if (!useCanvasKit) { if (tileMode != ui.TileMode.clamp) { throw UnimplementedError( 'TileMode not supported in GradientRadial shader'); diff --git a/lib/web_ui/lib/src/engine/window.dart b/lib/web_ui/lib/src/engine/window.dart index 19597f6ae32de..52116112ac450 100644 --- a/lib/web_ui/lib/src/engine/window.dart +++ b/lib/web_ui/lib/src/engine/window.dart @@ -610,7 +610,7 @@ class EngineWindow extends ui.Window { return; case 'flutter/platform_views': - if (experimentalUseSkia) { + if (useCanvasKit) { rasterizer!.surface.viewEmbedder .handlePlatformViewCall(data, callback); } else { @@ -789,7 +789,7 @@ class EngineWindow extends ui.Window { @override void render(ui.Scene scene) { - if (experimentalUseSkia) { + if (useCanvasKit) { // "Build finish" and "raster start" happen back-to-back because we // render on the same thread, so there's no overhead from hopping to // another thread. @@ -811,7 +811,7 @@ class EngineWindow extends ui.Window { @visibleForTesting late Rasterizer? rasterizer = - experimentalUseSkia ? Rasterizer(Surface(HtmlViewEmbedder())) : null; + useCanvasKit ? Rasterizer(Surface(HtmlViewEmbedder())) : null; } bool _handleWebTestEnd2EndMessage(MethodCodec codec, ByteData? data) { diff --git a/lib/web_ui/lib/src/ui/canvas.dart b/lib/web_ui/lib/src/ui/canvas.dart index 1699a1a287410..7c00dbc53c1d0 100644 --- a/lib/web_ui/lib/src/ui/canvas.dart +++ b/lib/web_ui/lib/src/ui/canvas.dart @@ -30,7 +30,7 @@ class Vertices { List? colors, List? indices, }) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkVertices( mode, positions, @@ -53,7 +53,7 @@ class Vertices { Int32List? colors, Uint16List? indices, }) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkVertices.raw( mode, positions, @@ -73,7 +73,7 @@ class Vertices { abstract class PictureRecorder { factory PictureRecorder() { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkPictureRecorder(); } else { return engine.EnginePictureRecorder(); @@ -85,7 +85,7 @@ abstract class PictureRecorder { abstract class Canvas { factory Canvas(PictureRecorder recorder, [Rect? cullRect]) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CanvasKitCanvas(recorder, cullRect); } else { return engine.SurfaceCanvas(recorder as engine.EnginePictureRecorder, cullRect); diff --git a/lib/web_ui/lib/src/ui/compositing.dart b/lib/web_ui/lib/src/ui/compositing.dart index 665ebbe14c68d..6850caeaec73f 100644 --- a/lib/web_ui/lib/src/ui/compositing.dart +++ b/lib/web_ui/lib/src/ui/compositing.dart @@ -34,7 +34,7 @@ abstract class PhysicalShapeEngineLayer implements EngineLayer {} abstract class SceneBuilder { factory SceneBuilder() { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.LayerSceneBuilder(); } else { return engine.SurfaceSceneBuilder(); diff --git a/lib/web_ui/lib/src/ui/initialization.dart b/lib/web_ui/lib/src/ui/initialization.dart index ca317304ec79b..06bd1eb80ba27 100644 --- a/lib/web_ui/lib/src/ui/initialization.dart +++ b/lib/web_ui/lib/src/ui/initialization.dart @@ -25,13 +25,13 @@ Future _initializePlatform({ // This needs to be after `webOnlyInitializeEngine` because that is where the // canvaskit script is added to the page. - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { await engine.initializeCanvasKit(); } assetManager ??= const engine.AssetManager(); await webOnlySetAssetManager(assetManager); - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { await engine.skiaFontCollection.ensureFontsLoaded(); } else { await _fontCollection!.ensureFontsLoaded(); @@ -54,7 +54,7 @@ Future webOnlySetAssetManager(engine.AssetManager assetManager) async { _assetManager = assetManager; - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { engine.ensureSkiaFontCollectionInitialized(); } else { _fontCollection ??= engine.FontCollection(); @@ -62,14 +62,14 @@ Future webOnlySetAssetManager(engine.AssetManager assetManager) async { } if (_assetManager != null) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { await engine.skiaFontCollection.registerFonts(_assetManager!); } else { await _fontCollection!.registerFonts(_assetManager!); } } - if (debugEmulateFlutterTesterEnvironment && !engine.experimentalUseSkia) { + if (debugEmulateFlutterTesterEnvironment && !engine.useCanvasKit) { _fontCollection!.debugRegisterTestFonts(); } } diff --git a/lib/web_ui/lib/src/ui/painting.dart b/lib/web_ui/lib/src/ui/painting.dart index a76cddb602714..0809c3f1bc4ad 100644 --- a/lib/web_ui/lib/src/ui/painting.dart +++ b/lib/web_ui/lib/src/ui/painting.dart @@ -230,7 +230,7 @@ enum Clip { } abstract class Paint { - factory Paint() => engine.experimentalUseSkia ? engine.CkPaint() : engine.SurfacePaint(); + factory Paint() => engine.useCanvasKit ? engine.CkPaint() : engine.SurfacePaint(); static bool enableDithering = false; BlendMode get blendMode; set blendMode(BlendMode value); @@ -278,7 +278,7 @@ abstract class Gradient extends Shader { List? colorStops, TileMode tileMode = TileMode.clamp, Float64List? matrix4, - ]) => engine.experimentalUseSkia + ]) => engine.useCanvasKit ? engine.CkGradientLinear(from, to, colors, colorStops, tileMode, matrix4) : engine.GradientLinear(from, to, colors, colorStops, tileMode, matrix4); factory Gradient.radial( @@ -296,13 +296,13 @@ abstract class Gradient extends Shader { // If focal == center and the focal radius is 0.0, it's still a regular radial gradient final Float32List? matrix32 = matrix4 != null ? engine.toMatrix32(matrix4) : null; if (focal == null || (focal == center && focalRadius == 0.0)) { - return engine.experimentalUseSkia + return engine.useCanvasKit ? engine.CkGradientRadial(center, radius, colors, colorStops, tileMode, matrix32) : engine.GradientRadial(center, radius, colors, colorStops, tileMode, matrix32); } else { assert(center != Offset.zero || focal != Offset.zero); // will result in exception(s) in Skia side - return engine.experimentalUseSkia + return engine.useCanvasKit ? engine.CkGradientConical( focal, focalRadius, center, radius, colors, colorStops, tileMode, matrix32) : engine.GradientConical( @@ -317,7 +317,7 @@ abstract class Gradient extends Shader { double startAngle = 0.0, double endAngle = math.pi * 2, Float64List? matrix4, - ]) => engine.experimentalUseSkia + ]) => engine.useCanvasKit ? engine.CkGradientSweep(center, colors, colorStops, tileMode, startAngle, endAngle, matrix4 != null ? engine.toMatrix32(matrix4) : null) : engine.GradientSweep(center, colors, colorStops, tileMode, startAngle, @@ -393,7 +393,7 @@ enum FilterQuality { class ImageFilter { factory ImageFilter.blur({double sigmaX = 0.0, double sigmaY = 0.0}) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkImageFilter.blur(sigmaX: sigmaX, sigmaY: sigmaY); } return engine.EngineImageFilter.blur(sigmaX: sigmaX, sigmaY: sigmaY); @@ -451,7 +451,7 @@ Future instantiateImageCodec( } String? _instantiateImageCodec(Uint8List list, engine.Callback callback) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { engine.skiaInstantiateImageCodec(list, callback); return null; } @@ -471,7 +471,7 @@ String? _instantiateImageCodecFromUrl( engine.WebOnlyImageCodecChunkCallback? chunkCallback, engine.Callback callback, ) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { engine.skiaInstantiateWebImageCodec(uri.toString(), callback, chunkCallback); return null; } else { @@ -576,7 +576,7 @@ void decodeImageFromPixels( int? targetHeight, bool allowUpscaling = true, }) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { engine.skiaInstantiateImageCodec( pixels, (Codec codec) { @@ -695,7 +695,7 @@ class Shadow { class ImageShader extends Shader { factory ImageShader(Image image, TileMode tmx, TileMode tmy, Float64List matrix4) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkImageShader(image, tmx, tmy, matrix4); } throw UnsupportedError('ImageShader not implemented for web platform.'); diff --git a/lib/web_ui/lib/src/ui/path.dart b/lib/web_ui/lib/src/ui/path.dart index 02d4e40d73484..f612de56d0228 100644 --- a/lib/web_ui/lib/src/ui/path.dart +++ b/lib/web_ui/lib/src/ui/path.dart @@ -7,14 +7,14 @@ part of ui; abstract class Path { factory Path() { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkPath(); } else { return engine.SurfacePath(); } } factory Path.from(Path source) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkPath.from(source as engine.CkPath); } else { return engine.SurfacePath.from(source as engine.SurfacePath); @@ -64,7 +64,7 @@ abstract class Path { static Path combine(PathOperation operation, Path path1, Path path2) { assert(path1 != null); // ignore: unnecessary_null_comparison assert(path2 != null); // ignore: unnecessary_null_comparison - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkPath.combine(operation, path1, path2); } throw UnimplementedError(); diff --git a/lib/web_ui/lib/src/ui/text.dart b/lib/web_ui/lib/src/ui/text.dart index abf00f154674b..16ee9feb1e5dd 100644 --- a/lib/web_ui/lib/src/ui/text.dart +++ b/lib/web_ui/lib/src/ui/text.dart @@ -255,7 +255,7 @@ abstract class TextStyle { List? shadows, List? fontFeatures, }) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkTextStyle( color: color, decoration: decoration, @@ -319,7 +319,7 @@ abstract class ParagraphStyle { String? ellipsis, Locale? locale, }) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkParagraphStyle( textAlign: textAlign, textDirection: textDirection, @@ -586,7 +586,7 @@ abstract class Paragraph { abstract class ParagraphBuilder { factory ParagraphBuilder(ParagraphStyle style) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.CkParagraphBuilder(style); } else { return engine.EngineParagraphBuilder(style as engine.EngineParagraphStyle); @@ -609,7 +609,7 @@ abstract class ParagraphBuilder { } Future loadFontFromList(Uint8List list, {String? fontFamily}) { - if (engine.experimentalUseSkia) { + if (engine.useCanvasKit) { return engine.skiaFontCollection.loadFontFromList(list, fontFamily: fontFamily).then( (_) => engine.sendFontChangeMessage() ); diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index b03f3526db149..e433d9e800791 100644 --- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -25,7 +25,7 @@ void testMain() { }); test('Using CanvasKit', () { - expect(experimentalUseSkia, true); + expect(useCanvasKit, true); }); _blendModeTests(); diff --git a/lib/web_ui/test/canvaskit/frame_timings_test.dart b/lib/web_ui/test/canvaskit/frame_timings_test.dart index 57a91a4231bbf..38d775476be8e 100644 --- a/lib/web_ui/test/canvaskit/frame_timings_test.dart +++ b/lib/web_ui/test/canvaskit/frame_timings_test.dart @@ -22,7 +22,7 @@ void testMain() { }); test('Using CanvasKit', () { - expect(experimentalUseSkia, true); + expect(useCanvasKit, true); }); test('collects frame timings', () async { diff --git a/lib/web_ui/test/canvaskit/path_test.dart b/lib/web_ui/test/canvaskit/path_test.dart index 4266afa5046e7..70073bfb9e729 100644 --- a/lib/web_ui/test/canvaskit/path_test.dart +++ b/lib/web_ui/test/canvaskit/path_test.dart @@ -22,7 +22,7 @@ void testMain() { }); test('Using CanvasKit', () { - expect(experimentalUseSkia, true); + expect(useCanvasKit, true); }); test(CkPathMetrics, () { diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 4536f2670cb31..36c7a2e48b07e 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -34,6 +34,8 @@ group("web_sdk") { deps = [ ":flutter_dartdevc_canvaskit_kernel_sdk", ":flutter_dartdevc_canvaskit_kernel_sdk_sound", + ":flutter_dartdevc_canvaskit_html_kernel_sdk", + ":flutter_dartdevc_canvaskit_html_kernel_sdk_sound", ":flutter_dartdevc_kernel_sdk", ":flutter_dartdevc_kernel_sdk_outline", ":flutter_dartdevc_kernel_sdk_outline_sound", @@ -244,6 +246,113 @@ prebuilt_dart_action("flutter_dartdevc_canvaskit_kernel_sdk") { ] } +# Compiles the DDC CanvasKit and Html SDK's JS code. +prebuilt_dart_action("flutter_dartdevc_canvaskit_html_kernel_sdk") { + deps = [ + "//third_party/dart:create_sdk", + "//third_party/dart/pkg:pkg_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_sdk_patch_stamp", + ] + + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + packages = dart_sdk_package_config + + script = "//third_party/dart/pkg/dev_compiler/bin/dartdevc.dart" + + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html/dart_sdk.js.map", + ] + + args = [ + "--enable-experiment=non-nullable", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "-DFLUTTER_WEB_AUTO_DETECT=true", + "--modules", + "amd", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html/dart_sdk.js"), + ] +} + +# Compiles the DDC SDK's JS code for null safety. +prebuilt_dart_action("flutter_dartdevc_kernel_sdk_sound") { + deps = [ + "//third_party/dart:create_sdk", + "//third_party/dart/pkg:pkg_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_sdk_patch_stamp", + ] + + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + packages = dart_sdk_package_config + + script = "//third_party/dart/pkg/dev_compiler/bin/dartdevc.dart" + + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js.map", + ] + + args = [ + "--enable-experiment=non-nullable", + "--sound-null-safety", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "--modules", + "amd", + "-o", + rebase_path("$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/legacy-sound/dart_sdk.js"), + ] +} + # Compiles the DDC CanvasKit SDK's JS code for null safety. prebuilt_dart_action("flutter_dartdevc_canvaskit_kernel_sdk_sound") { deps = [ @@ -299,8 +408,8 @@ prebuilt_dart_action("flutter_dartdevc_canvaskit_kernel_sdk_sound") { ] } -# Compiles the DDC SDK's JS code for null safety. -prebuilt_dart_action("flutter_dartdevc_kernel_sdk_sound") { +# Compiles the DDC CanvasKit and Html SDK's JS code for null safety. +prebuilt_dart_action("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { deps = [ "//third_party/dart:create_sdk", "//third_party/dart/pkg:pkg_files_stamp", @@ -315,8 +424,8 @@ prebuilt_dart_action("flutter_dartdevc_kernel_sdk_sound") { script = "//third_party/dart/pkg/dev_compiler/bin/dartdevc.dart" outputs = [ - "$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js", - "$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js.map", + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js.map", ] args = [ @@ -340,15 +449,16 @@ prebuilt_dart_action("flutter_dartdevc_kernel_sdk_sound") { "--libraries-file", "org-dartlang-sdk:///flutter_web_sdk/libraries.json", "--inline-source-map", + "-DFLUTTER_WEB_AUTO_DETECT=true", "--modules", "amd", "-o", - rebase_path("$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js"), + rebase_path("$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js"), "--modules", "legacy", "-o", rebase_path( - "$root_out_dir/flutter_web_sdk/kernel/legacy-sound/dart_sdk.js"), + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html-sound/dart_sdk.js"), ] } @@ -369,7 +479,7 @@ prebuilt_dart_action("flutter_dartdevc_kernel_sdk_outline_sound") { args = [ "--enable-experiment=non-nullable", - "--sound-null-safety", + "--sound-null-safety ", "--summary-only", "--target", "ddc", From f5340b837d4f3934c34652be055a0e6da4d25bfa Mon Sep 17 00:00:00 2001 From: Angjie Li Date: Wed, 14 Oct 2020 17:11:03 -0700 Subject: [PATCH 2/7] Null-safe fix. --- lib/web_ui/lib/src/engine/canvaskit/initialization.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart index 6d829c99bb07f..1256c026e6d2e 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart @@ -6,7 +6,7 @@ part of engine; @JS('window.flutterWebRenderer') -external String get customRenderer; +external String? get customRenderer; bool get useCanvasKit => _autoDetect ? _detectRenderer() : _useSkia; @@ -14,7 +14,7 @@ bool get useCanvasKit => // Returns true if canvaskit is used. Otherwise, returns false. bool _detectRenderer() { if (customRenderer != null) { - return customRenderer == 'canvaskit'; + return customRenderer! == 'canvaskit'; } // If customRenderer is not specified, use canvaskit for desktop and html for // mobile. From 013bca2eb66fd00441bb2b1c9a3f8c2ac7d5a1e7 Mon Sep 17 00:00:00 2001 From: Angjie Li Date: Fri, 16 Oct 2020 17:27:44 -0700 Subject: [PATCH 3/7] Add dartdoc. --- .../src/engine/canvaskit/initialization.dart | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart index 1256c026e6d2e..39d2bee6c692c 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart @@ -5,27 +5,38 @@ // @dart = 2.10 part of engine; +/// A JavaScript entrypoint that allows developer to set rendering backend +/// at runtime before launching the application. @JS('window.flutterWebRenderer') -external String? get customRenderer; +external String? get requestedRendererType; +/// Whether to use CanvasKit as the rendering backend. bool get useCanvasKit => _autoDetect ? _detectRenderer() : _useSkia; -// Returns true if canvaskit is used. Otherwise, returns false. +/// Returns true if CanvasKit is used. +/// Otherwise, returns false. bool _detectRenderer() { - if (customRenderer != null) { - return customRenderer! == 'canvaskit'; + if (requestedRendererType != null) { + return requestedRendererType! == 'canvaskit'; } - // If customRenderer is not specified, use canvaskit for desktop and html for - // mobile. + // If requestedRendererType is not specified, use CanvasKit for desktop and + // html for mobile. return isDesktop; } /// Auto detect which rendering backend to use. +/// +/// Using flutter tools option "--web-render=auto" would set the value to true. +/// Otherwise, it would be false. const bool _autoDetect = bool.fromEnvironment('FLUTTER_WEB_AUTO_DETECT', defaultValue: false); /// Enable the Skia-based rendering backend. +/// +/// Using flutter tools option "--web-render=cavanskit" would set the value to +/// true. +/// Using flutter tools option "--web-render=html" would set the value to false. const bool _useSkia = bool.fromEnvironment('FLUTTER_WEB_USE_SKIA', defaultValue: false); From baf3b718eb871cab28ab20e7d9f4ea2c2a4dd0f3 Mon Sep 17 00:00:00 2001 From: Angjie Li Date: Mon, 19 Oct 2020 12:21:00 -0700 Subject: [PATCH 4/7] Remove unnecessary trailing space. --- web_sdk/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 36c7a2e48b07e..0383e590fe5fb 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -479,7 +479,7 @@ prebuilt_dart_action("flutter_dartdevc_kernel_sdk_outline_sound") { args = [ "--enable-experiment=non-nullable", - "--sound-null-safety ", + "--sound-null-safety", "--summary-only", "--target", "ddc", From baf043281263d685a3aba470f2df7b35fddf21d4 Mon Sep 17 00:00:00 2001 From: Angjie Li Date: Mon, 19 Oct 2020 16:56:33 -0700 Subject: [PATCH 5/7] format BUILD.gn. --- web_sdk/BUILD.gn | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 0383e590fe5fb..e6ca7f55dd12c 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -32,10 +32,10 @@ web_engine_sources += [ "//flutter/lib/web_ui/lib/src/engine.dart" ] group("web_sdk") { deps = [ - ":flutter_dartdevc_canvaskit_kernel_sdk", - ":flutter_dartdevc_canvaskit_kernel_sdk_sound", ":flutter_dartdevc_canvaskit_html_kernel_sdk", ":flutter_dartdevc_canvaskit_html_kernel_sdk_sound", + ":flutter_dartdevc_canvaskit_kernel_sdk", + ":flutter_dartdevc_canvaskit_kernel_sdk_sound", ":flutter_dartdevc_kernel_sdk", ":flutter_dartdevc_kernel_sdk_outline", ":flutter_dartdevc_kernel_sdk_outline_sound", @@ -453,7 +453,8 @@ prebuilt_dart_action("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { "--modules", "amd", "-o", - rebase_path("$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js"), + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js"), "--modules", "legacy", "-o", From f8bb10d63db43d861e7378b0abebb421af8ced55 Mon Sep 17 00:00:00 2001 From: Angjie Li Date: Tue, 20 Oct 2020 11:15:50 -0700 Subject: [PATCH 6/7] Fix typo and doc issue. --- lib/web_ui/lib/src/engine/canvaskit/initialization.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart index 2b991957699dc..131eef0bcea67 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/initialization.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/initialization.dart @@ -15,6 +15,7 @@ bool get useCanvasKit => _autoDetect ? _detectRenderer() : _useSkia; /// Returns true if CanvasKit is used. +/// /// Otherwise, returns false. bool _detectRenderer() { if (requestedRendererType != null) { @@ -34,7 +35,7 @@ const bool _autoDetect = /// Enable the Skia-based rendering backend. /// -/// Using flutter tools option "--web-render=cavanskit" would set the value to +/// Using flutter tools option "--web-render=canvaskit" would set the value to /// true. /// Using flutter tools option "--web-render=html" would set the value to false. const bool _useSkia = From 7b349236cc05579e1ed34e2449e9ce678c04f602 Mon Sep 17 00:00:00 2001 From: Angjie Li Date: Thu, 22 Oct 2020 15:12:03 -0700 Subject: [PATCH 7/7] Fix platform_dispatcher. --- lib/web_ui/lib/src/engine/platform_dispatcher.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/web_ui/lib/src/engine/platform_dispatcher.dart b/lib/web_ui/lib/src/engine/platform_dispatcher.dart index d1e72189df398..0222e4432478f 100644 --- a/lib/web_ui/lib/src/engine/platform_dispatcher.dart +++ b/lib/web_ui/lib/src/engine/platform_dispatcher.dart @@ -377,7 +377,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { return; case 'flutter/platform_views': - if (experimentalUseSkia) { + if (useCanvasKit) { rasterizer!.surface.viewEmbedder .handlePlatformViewCall(data, callback); } else { @@ -482,7 +482,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { /// painting. @override void render(ui.Scene scene, [ui.FlutterView? view]) { - if (experimentalUseSkia) { + if (useCanvasKit) { // "Build finish" and "raster start" happen back-to-back because we // render on the same thread, so there's no overhead from hopping to // another thread. @@ -839,7 +839,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { @visibleForTesting late Rasterizer? rasterizer = - experimentalUseSkia ? Rasterizer(Surface(HtmlViewEmbedder())) : null; + useCanvasKit ? Rasterizer(Surface(HtmlViewEmbedder())) : null; /// In Flutter, platform messages are exchanged between threads so the /// messages and responses have to be exchanged asynchronously. We simulate