@@ -28,9 +28,21 @@ import 'renderer.dart';
28
28
/// Entrypoint into the CanvasKit API.
29
29
late CanvasKit canvasKit;
30
30
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
+
34
46
35
47
/// Sets the [CanvasKit] object on `window` so we can use `@JS()` to bind to
36
48
/// static APIs.
@@ -1872,13 +1884,6 @@ extension SkParagraphBuilderNamespaceExtension on SkParagraphBuilderNamespace {
1872
1884
SkParagraphStyle paragraphStyle,
1873
1885
TypefaceFontProvider ? fontManager,
1874
1886
);
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
- }
1882
1887
}
1883
1888
1884
1889
@JS ()
@@ -2694,26 +2699,47 @@ void patchCanvasKitModule(DomHTMLScriptElement canvasKitScript) {
2694
2699
}
2695
2700
}
2696
2701
2702
+ String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;
2703
+
2697
2704
const String _kFullCanvasKitJsFileName = 'canvaskit.js' ;
2698
2705
const String _kChromiumCanvasKitJsFileName = 'chromium/canvaskit.js' ;
2699
2706
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 {
2702
2730
switch (configuration.canvasKitVariant) {
2703
2731
case CanvasKitVariant .auto:
2704
- return < String > [
2705
- if (_enableCanvasKitChromiumInAutoMode) _kChromiumCanvasKitJsFileName ,
2706
- _kFullCanvasKitJsFileName ,
2732
+ return < _CanvasKitVariantUrl > [
2733
+ if (browserSupportsCanvaskitChromium) _CanvasKitVariantUrl .chromium ,
2734
+ _CanvasKitVariantUrl .full ,
2707
2735
];
2708
2736
case CanvasKitVariant .full:
2709
- return < String > [_kFullCanvasKitJsFileName ];
2737
+ return < _CanvasKitVariantUrl > [ _CanvasKitVariantUrl .full ];
2710
2738
case CanvasKitVariant .chromium:
2711
- return < String > [_kChromiumCanvasKitJsFileName ];
2739
+ return < _CanvasKitVariantUrl > [ _CanvasKitVariantUrl .chromium ];
2712
2740
}
2713
2741
}
2714
- Iterable <String > get _canvasKitJsUrls {
2715
- return _canvasKitJsFileNames.map ((String filename) => '$_canvasKitBaseUrl $filename ' );
2716
- }
2742
+
2717
2743
@visibleForTesting
2718
2744
String canvasKitWasmModuleUrl (String file, String canvasKitBase) =>
2719
2745
canvasKitBase + file;
@@ -2723,29 +2749,23 @@ String canvasKitWasmModuleUrl(String file, String canvasKitBase) =>
2723
2749
/// Downloads the CanvasKit JavaScript, then calls `CanvasKitInit` to download
2724
2750
/// and intialize the CanvasKit wasm.
2725
2751
Future <CanvasKit > downloadCanvasKit () async {
2726
- await _downloadOneOf (_canvasKitJsUrls );
2752
+ await _downloadOneOf (_canvasKitUrls );
2727
2753
2728
- final CanvasKit canvasKit = await CanvasKitInit (CanvasKitInitOptions (
2754
+ return CanvasKitInit (CanvasKitInitOptions (
2729
2755
locateFile: allowInterop (canvasKitWasmModuleUrl),
2730
2756
));
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;
2740
2757
}
2741
2758
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
2743
2760
/// downloads it.
2744
2761
///
2745
2762
/// 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;
2749
2769
return ;
2750
2770
}
2751
2771
}
0 commit comments