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