@@ -21,6 +21,7 @@ import 'package:ui/ui.dart' as ui;
2121import '../configuration.dart' ;
2222import '../dom.dart' ;
2323import '../profiler.dart' ;
24+ import 'renderer.dart' ;
2425
2526/// Entrypoint into the CanvasKit API.
2627late CanvasKit canvasKit;
@@ -2678,45 +2679,90 @@ void patchCanvasKitModule(DomHTMLScriptElement canvasKitScript) {
26782679 js_util.callMethod (objectConstructor,
26792680 'defineProperty' , < dynamic > [domWindow, 'module' , moduleAccessor]);
26802681 }
2681- domDocument.head! .appendChild (canvasKitScript);
26822682}
26832683
2684- String get canvasKitBuildUrl => configuration.canvasKitBaseUrl;
2685- String get canvasKitJavaScriptBindingsUrl =>
2686- '${canvasKitBuildUrl }canvaskit.js' ;
2687- String canvasKitWasmModuleUrl (String canvasKitBase, String file) =>
2684+ const String _kFullCanvasKitJsFileName = 'canvaskit.js' ;
2685+ const String _kChromiumCanvasKitJsFileName = 'chromium/canvaskit.js' ;
2686+
2687+ String get _canvasKitBaseUrl => configuration.canvasKitBaseUrl;
2688+ List <String > get _canvasKitJsFileNames {
2689+ switch (configuration.canvasKitVariant) {
2690+ case CanvasKitVariant .auto:
2691+ return < String > [
2692+ if (browserSupportsCanvaskitChromium) _kChromiumCanvasKitJsFileName,
2693+ _kFullCanvasKitJsFileName,
2694+ ];
2695+ case CanvasKitVariant .full:
2696+ return < String > [_kFullCanvasKitJsFileName];
2697+ case CanvasKitVariant .chromium:
2698+ return < String > [_kChromiumCanvasKitJsFileName];
2699+ }
2700+ }
2701+ Iterable <String > get _canvasKitJsUrls {
2702+ return _canvasKitJsFileNames.map ((String filename) => '$_canvasKitBaseUrl $filename ' );
2703+ }
2704+ String canvasKitWasmModuleUrl (String file, String canvasKitBase) =>
26882705 canvasKitBase + file;
26892706
26902707/// Download and initialize the CanvasKit module.
26912708///
26922709/// Downloads the CanvasKit JavaScript, then calls `CanvasKitInit` to download
26932710/// and intialize the CanvasKit wasm.
26942711Future <CanvasKit > downloadCanvasKit () async {
2695- await _downloadCanvasKitJs ( );
2712+ await _downloadOneOf (_canvasKitJsUrls );
26962713
26972714 return CanvasKitInit (CanvasKitInitOptions (
2698- locateFile: allowInterop ((String file, String unusedBase) =>
2699- canvasKitWasmModuleUrl (canvasKitBuildUrl, file)),
2715+ locateFile: allowInterop (canvasKitWasmModuleUrl),
27002716 ));
27012717}
27022718
2703- /// Downloads the CanvasKit JavaScript file at [canvasKitBase] .
2704- Future <void > _downloadCanvasKitJs () {
2705- final String canvasKitJavaScriptUrl = canvasKitJavaScriptBindingsUrl;
2719+ /// Finds the first URL in [urls] that can be downloaded successfully, and
2720+ /// downloads it.
2721+ ///
2722+ /// If none of the URLs can be downloaded, throws an [Exception] .
2723+ Future <void > _downloadOneOf (Iterable <String > urls) async {
2724+ for (final String url in urls) {
2725+ if (await _downloadCanvasKitJs (url)) {
2726+ return ;
2727+ }
2728+ }
27062729
2730+ // Reaching this point means that all URLs failed to download.
2731+ throw Exception (
2732+ 'Failed to download any of the following CanvasKit URLs: $urls ' ,
2733+ );
2734+ }
2735+
2736+ /// Downloads the CanvasKit JavaScript file at [url] .
2737+ ///
2738+ /// Returns a [Future] that completes with `true` if the CanvasKit JavaScript
2739+ /// file was successfully downloaded, or `false` if it failed.
2740+ Future <bool > _downloadCanvasKitJs (String url) {
27072741 final DomHTMLScriptElement canvasKitScript = createDomHTMLScriptElement ();
2708- canvasKitScript.src = createTrustedScriptUrl (canvasKitJavaScriptUrl);
2742+ canvasKitScript.src = createTrustedScriptUrl (url);
2743+
2744+ final Completer <bool > canvasKitLoadCompleter = Completer <bool >();
2745+
2746+ late final DomEventListener loadCallback;
2747+ late final DomEventListener errorCallback;
27092748
2710- final Completer <void > canvasKitLoadCompleter = Completer <void >();
2711- late DomEventListener callback;
27122749 void loadEventHandler (DomEvent _) {
2713- canvasKitLoadCompleter. complete ();
2714- canvasKitScript. removeEventListener ( 'load' , callback );
2750+ canvasKitScript. remove ();
2751+ canvasKitLoadCompleter. complete ( true );
27152752 }
2716- callback = allowInterop (loadEventHandler);
2717- canvasKitScript.addEventListener ('load' , callback);
2753+ void errorEventHandler (DomEvent errorEvent) {
2754+ canvasKitScript.remove ();
2755+ canvasKitLoadCompleter.complete (false );
2756+ }
2757+
2758+ loadCallback = allowInterop (loadEventHandler);
2759+ errorCallback = allowInterop (errorEventHandler);
2760+
2761+ canvasKitScript.addEventListener ('load' , loadCallback);
2762+ canvasKitScript.addEventListener ('error' , errorCallback);
27182763
27192764 patchCanvasKitModule (canvasKitScript);
2765+ domDocument.head! .appendChild (canvasKitScript);
27202766
27212767 return canvasKitLoadCompleter.future;
27222768}
0 commit comments