@@ -259,13 +259,12 @@ extension CanvasKitExtension on CanvasKit {
259259 );
260260}
261261
262- @JS ()
263- @staticInterop
264- class CanvasKitModule {}
262+ @JS ('window.CanvasKitInit' )
263+ external JSAny _CanvasKitInit (CanvasKitInitOptions options);
265264
266- extension CanvasKitModuleExtension on CanvasKitModule {
267- @JS ( 'default' )
268- external JSPromise < JSAny > defaultExport ( CanvasKitInitOptions options);
265+ Future < CanvasKit > CanvasKitInit ( CanvasKitInitOptions options) {
266+ return js_util. promiseToFuture < CanvasKit >(
267+ _CanvasKitInit ( options).toObjectShallow );
269268}
270269
271270typedef LocateFileCallback = String Function (String file, String unusedBase);
@@ -3662,11 +3661,11 @@ String canvasKitWasmModuleUrl(String file, String canvasKitBase) =>
36623661/// Downloads the CanvasKit JavaScript, then calls `CanvasKitInit` to download
36633662/// and intialize the CanvasKit wasm.
36643663Future <CanvasKit > downloadCanvasKit () async {
3665- final CanvasKitModule canvasKitModule = await _downloadOneOf (_canvasKitJsUrls);
3664+ await _downloadOneOf (_canvasKitJsUrls);
36663665
3667- final CanvasKit canvasKit = ( await canvasKitModule. defaultExport (CanvasKitInitOptions (
3666+ final CanvasKit canvasKit = await CanvasKitInit (CanvasKitInitOptions (
36683667 locateFile: createLocateFileCallback (canvasKitWasmModuleUrl),
3669- )).toDart) as CanvasKit ;
3668+ ));
36703669
36713670 if (canvasKit.ParagraphBuilder .RequiresClientICU () && ! browserSupportsCanvaskitChromium) {
36723671 throw Exception (
@@ -3682,12 +3681,10 @@ Future<CanvasKit> downloadCanvasKit() async {
36823681/// downloads it.
36833682///
36843683/// If none of the URLs can be downloaded, throws an [Exception] .
3685- Future <CanvasKitModule > _downloadOneOf (Iterable <String > urls) async {
3684+ Future <void > _downloadOneOf (Iterable <String > urls) async {
36863685 for (final String url in urls) {
3687- try {
3688- return await _downloadCanvasKitJs (url);
3689- } catch (_) {
3690- continue ;
3686+ if (await _downloadCanvasKitJs (url)) {
3687+ return ;
36913688 }
36923689 }
36933690
@@ -3701,7 +3698,32 @@ Future<CanvasKitModule> _downloadOneOf(Iterable<String> urls) async {
37013698///
37023699/// Returns a [Future] that completes with `true` if the CanvasKit JavaScript
37033700/// file was successfully downloaded, or `false` if it failed.
3704- Future <CanvasKitModule > _downloadCanvasKitJs (String url) async {
3705- final JSAny scriptUrl = createTrustedScriptUrl (url);
3706- return (await importModule (scriptUrl).toDart) as CanvasKitModule ;
3701+ Future <bool > _downloadCanvasKitJs (String url) {
3702+ final DomHTMLScriptElement canvasKitScript =
3703+ createDomHTMLScriptElement (configuration.nonce);
3704+ canvasKitScript.src = createTrustedScriptUrl (url);
3705+
3706+ final Completer <bool > canvasKitLoadCompleter = Completer <bool >();
3707+
3708+ late final DomEventListener loadCallback;
3709+ late final DomEventListener errorCallback;
3710+
3711+ void loadEventHandler (DomEvent _) {
3712+ canvasKitScript.remove ();
3713+ canvasKitLoadCompleter.complete (true );
3714+ }
3715+ void errorEventHandler (DomEvent errorEvent) {
3716+ canvasKitScript.remove ();
3717+ canvasKitLoadCompleter.complete (false );
3718+ }
3719+
3720+ loadCallback = createDomEventListener (loadEventHandler);
3721+ errorCallback = createDomEventListener (errorEventHandler);
3722+
3723+ canvasKitScript.addEventListener ('load' , loadCallback);
3724+ canvasKitScript.addEventListener ('error' , errorCallback);
3725+
3726+ domDocument.head! .appendChild (canvasKitScript);
3727+
3728+ return canvasKitLoadCompleter.future;
37073729}
0 commit comments