@@ -28,9 +28,21 @@ import 'renderer.dart';
2828/// Entrypoint into the CanvasKit API.
2929late CanvasKit canvasKit;
3030
31- // TODO(mdebbar): Turn this on when CanvasKit Chromium is ready.
32- // https://github.com/flutter/flutter/issues/122329
33- const bool _enableCanvasKitChromiumInAutoMode = false ;
31+ late CanvasKitVariant _canvasKitVariant;
32+
33+ /// Which variant of CanvasKit we are using.
34+ CanvasKitVariant get canvasKitVariant => _canvasKitVariant;
35+ set canvasKitVariant (CanvasKitVariant value) {
36+ if (value == CanvasKitVariant .auto) {
37+ throw ArgumentError .value (
38+ value,
39+ 'value' ,
40+ 'CanvasKitVariant.auto is not a valid value for canvasKitVariant' ,
41+ );
42+ }
43+ _canvasKitVariant = value;
44+ }
45+
3446
3547/// Sets the [CanvasKit] object on `window` so we can use `@JS()` to bind to
3648/// static APIs.
@@ -1872,13 +1884,6 @@ extension SkParagraphBuilderNamespaceExtension on SkParagraphBuilderNamespace {
18721884 SkParagraphStyle paragraphStyle,
18731885 TypefaceFontProvider ? fontManager,
18741886 );
1875-
1876- bool RequiresClientICU () {
1877- if (! js_util.hasProperty (this , 'RequiresClientICU' )) {
1878- return false ;
1879- }
1880- return js_util.callMethod (this , 'RequiresClientICU' , const < Object > [],) as bool ;
1881- }
18821887}
18831888
18841889@JS ()
@@ -2694,26 +2699,47 @@ void patchCanvasKitModule(DomHTMLScriptElement canvasKitScript) {
26942699 }
26952700}
26962701
2702+ String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;
2703+
26972704const String _kFullCanvasKitJsFileName = 'canvaskit.js' ;
26982705const String _kChromiumCanvasKitJsFileName = 'chromium/canvaskit.js' ;
26992706
2700- String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;
2701- List <String > get _canvasKitJsFileNames {
2707+ // TODO(mdebbar): Replace this with a Record once it's supported in Dart.
2708+ class _CanvasKitVariantUrl {
2709+ const _CanvasKitVariantUrl (this .url, this .variant)
2710+ : assert (
2711+ variant != CanvasKitVariant .auto,
2712+ 'CanvasKitVariant.auto cannot have a url' ,
2713+ );
2714+
2715+ final String url;
2716+ final CanvasKitVariant variant;
2717+
2718+ static _CanvasKitVariantUrl chromium = _CanvasKitVariantUrl (
2719+ '$_canvasKitBaseUrl $_kChromiumCanvasKitJsFileName ' ,
2720+ CanvasKitVariant .chromium,
2721+ );
2722+
2723+ static _CanvasKitVariantUrl full = _CanvasKitVariantUrl (
2724+ '$_canvasKitBaseUrl $_kFullCanvasKitJsFileName ' ,
2725+ CanvasKitVariant .full,
2726+ );
2727+ }
2728+
2729+ List <_CanvasKitVariantUrl > get _canvasKitUrls {
27022730 switch (configuration.canvasKitVariant) {
27032731 case CanvasKitVariant .auto:
2704- return < String > [
2705- if (_enableCanvasKitChromiumInAutoMode) _kChromiumCanvasKitJsFileName ,
2706- _kFullCanvasKitJsFileName ,
2732+ return < _CanvasKitVariantUrl > [
2733+ if (browserSupportsCanvaskitChromium) _CanvasKitVariantUrl .chromium ,
2734+ _CanvasKitVariantUrl .full ,
27072735 ];
27082736 case CanvasKitVariant .full:
2709- return < String > [_kFullCanvasKitJsFileName ];
2737+ return < _CanvasKitVariantUrl > [ _CanvasKitVariantUrl .full ];
27102738 case CanvasKitVariant .chromium:
2711- return < String > [_kChromiumCanvasKitJsFileName ];
2739+ return < _CanvasKitVariantUrl > [ _CanvasKitVariantUrl .chromium ];
27122740 }
27132741}
2714- Iterable <String > get _canvasKitJsUrls {
2715- return _canvasKitJsFileNames.map ((String filename) => '$_canvasKitBaseUrl $filename ' );
2716- }
2742+
27172743@visibleForTesting
27182744String canvasKitWasmModuleUrl (String file, String canvasKitBase) =>
27192745 canvasKitBase + file;
@@ -2723,29 +2749,23 @@ String canvasKitWasmModuleUrl(String file, String canvasKitBase) =>
27232749/// Downloads the CanvasKit JavaScript, then calls `CanvasKitInit` to download
27242750/// and intialize the CanvasKit wasm.
27252751Future <CanvasKit > downloadCanvasKit () async {
2726- await _downloadOneOf (_canvasKitJsUrls );
2752+ await _downloadOneOf (_canvasKitUrls );
27272753
2728- final CanvasKit canvasKit = await CanvasKitInit (CanvasKitInitOptions (
2754+ return CanvasKitInit (CanvasKitInitOptions (
27292755 locateFile: allowInterop (canvasKitWasmModuleUrl),
27302756 ));
2731-
2732- if (canvasKit.ParagraphBuilder .RequiresClientICU () && ! browserSupportsCanvaskitChromium) {
2733- throw Exception (
2734- 'The CanvasKit variant you are using only works on Chromium browsers. '
2735- 'Please use a different CanvasKit variant, or use a Chromium browser.' ,
2736- );
2737- }
2738-
2739- return canvasKit;
27402757}
27412758
2742- /// Finds the first URL in [urls] that can be downloaded successfully, and
2759+ /// Finds the first entry in [urls] that can be downloaded successfully, and
27432760/// downloads it.
27442761///
27452762/// If none of the URLs can be downloaded, throws an [Exception] .
2746- Future <void > _downloadOneOf (Iterable <String > urls) async {
2747- for (final String url in urls) {
2748- if (await _downloadCanvasKitJs (url)) {
2763+ ///
2764+ /// Also sets [canvasKitVariant] to the variant of CanvasKit that was downloaded.
2765+ Future <void > _downloadOneOf (Iterable <_CanvasKitVariantUrl > urls) async {
2766+ for (final _CanvasKitVariantUrl entry in urls) {
2767+ if (await _downloadCanvasKitJs (entry.url)) {
2768+ canvasKitVariant = entry.variant;
27492769 return ;
27502770 }
27512771 }
0 commit comments