From e26575ec5973963d4e78cb024f970fdc4f9da478 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 8 Dec 2022 16:17:52 -0800 Subject: [PATCH 1/3] Massage the JS interop around `didCreateEngineInitializer` to make it work better with dart2wasm. --- lib/web_ui/lib/initialization.dart | 4 ++-- .../lib/src/engine/js_interop/js_loader.dart | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/web_ui/lib/initialization.dart b/lib/web_ui/lib/initialization.dart index 9412fb86b4de4..58f0cd50fda79 100644 --- a/lib/web_ui/lib/initialization.dart +++ b/lib/web_ui/lib/initialization.dart @@ -82,7 +82,7 @@ Future webOnlyWarmupEngine({ // Should the app "autoStart"? bool autoStart = true; if (engine.flutter != null && engine.loader != null) { - autoStart = engine.didCreateEngineInitializer == null; + autoStart = engine.loader!.isAutostart; } if (autoStart) { // The user does not want control of the app, bootstrap immediately. @@ -91,7 +91,7 @@ Future webOnlyWarmupEngine({ } else { // Yield control of the bootstrap procedure to the user. engine.domWindow.console.debug('Flutter Web Bootstrap: Programmatic.'); - engine.didCreateEngineInitializer!(bootstrap.prepareEngineInitializer()); + engine.loader!.didCreateEngineInitializer(bootstrap.prepareEngineInitializer()); } } diff --git a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart index e03a5af4ca3e3..c1b727de843e5 100644 --- a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart +++ b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart @@ -6,6 +6,7 @@ library js_loader; import 'package:js/js.dart'; +import 'package:js/js_util.dart' as js_util; import '../configuration.dart'; import 'js_promise.dart'; @@ -20,11 +21,17 @@ typedef DidCreateEngineInitializerFn = void Function(FlutterEngineInitializer); @JS('_flutter') external Object? get flutter; -@JS('_flutter.loader') -external Object? get loader; +@JS() +@staticInterop +class FlutterLoader {} -@JS('_flutter.loader.didCreateEngineInitializer') -external DidCreateEngineInitializerFn? get didCreateEngineInitializer; +extension FlutterLoaderExtension on FlutterLoader { + external void didCreateEngineInitializer(FlutterEngineInitializer initializer); + bool get isAutostart => !js_util.hasProperty(this, 'didCreateEngineInitializer'); +} + +@JS('_flutter.loader') +external FlutterLoader? get loader; // FlutterEngineInitializer From e3452a2723e46cd2f5dc9dd65341ab6990f5681e Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 8 Dec 2022 17:22:19 -0800 Subject: [PATCH 2/3] Make the whole type hierarchy more explicit. --- lib/web_ui/lib/initialization.dart | 6 +++--- lib/web_ui/lib/src/engine/js_interop/js_loader.dart | 13 +++++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/web_ui/lib/initialization.dart b/lib/web_ui/lib/initialization.dart index 58f0cd50fda79..ef7a08f68b05c 100644 --- a/lib/web_ui/lib/initialization.dart +++ b/lib/web_ui/lib/initialization.dart @@ -81,8 +81,8 @@ Future webOnlyWarmupEngine({ // Should the app "autoStart"? bool autoStart = true; - if (engine.flutter != null && engine.loader != null) { - autoStart = engine.loader!.isAutostart; + if (engine.flutter != null && engine.flutter!.loader != null) { + autoStart = engine.flutter!.loader!.isAutostart; } if (autoStart) { // The user does not want control of the app, bootstrap immediately. @@ -91,7 +91,7 @@ Future webOnlyWarmupEngine({ } else { // Yield control of the bootstrap procedure to the user. engine.domWindow.console.debug('Flutter Web Bootstrap: Programmatic.'); - engine.loader!.didCreateEngineInitializer(bootstrap.prepareEngineInitializer()); + engine.flutter!.loader!.didCreateEngineInitializer(bootstrap.prepareEngineInitializer()); } } diff --git a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart index c1b727de843e5..6c25731e4ed29 100644 --- a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart +++ b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart @@ -16,10 +16,18 @@ import 'js_promise.dart'; /// programmer can control the initialization sequence. typedef DidCreateEngineInitializerFn = void Function(FlutterEngineInitializer); +@JS() +@staticInterop +class FlutterJS {} + +extension FlutterJSExtension on FlutterJS { + external FlutterLoader? get loader; +} + // Both `flutter`, `loader`(_flutter.loader), must be checked for null before // `didCreateEngineInitializer` can be safely accessed. @JS('_flutter') -external Object? get flutter; +external FlutterJS? get flutter; @JS() @staticInterop @@ -30,9 +38,6 @@ extension FlutterLoaderExtension on FlutterLoader { bool get isAutostart => !js_util.hasProperty(this, 'didCreateEngineInitializer'); } -@JS('_flutter.loader') -external FlutterLoader? get loader; - // FlutterEngineInitializer /// An object that allows the user to initialize the Engine of a Flutter App. From 229b71be4951cdb7042e941fdf6fa12559750446 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 8 Dec 2022 19:50:34 -0800 Subject: [PATCH 3/3] Address Joshua's comments. --- lib/web_ui/lib/initialization.dart | 10 +++------- lib/web_ui/lib/src/engine/js_interop/js_loader.dart | 7 +------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/web_ui/lib/initialization.dart b/lib/web_ui/lib/initialization.dart index ef7a08f68b05c..3cb2a8835242a 100644 --- a/lib/web_ui/lib/initialization.dart +++ b/lib/web_ui/lib/initialization.dart @@ -79,19 +79,15 @@ Future webOnlyWarmupEngine({ }, ); - // Should the app "autoStart"? - bool autoStart = true; - if (engine.flutter != null && engine.flutter!.loader != null) { - autoStart = engine.flutter!.loader!.isAutostart; - } - if (autoStart) { + final engine.FlutterLoader? loader = engine.flutter?.loader; + if (loader == null || loader.isAutoStart) { // The user does not want control of the app, bootstrap immediately. engine.domWindow.console.debug('Flutter Web Bootstrap: Auto.'); await bootstrap.autoStart(); } else { // Yield control of the bootstrap procedure to the user. engine.domWindow.console.debug('Flutter Web Bootstrap: Programmatic.'); - engine.flutter!.loader!.didCreateEngineInitializer(bootstrap.prepareEngineInitializer()); + loader.didCreateEngineInitializer(bootstrap.prepareEngineInitializer()); } } diff --git a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart index 6c25731e4ed29..50a9ce5b544b1 100644 --- a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart +++ b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart @@ -11,11 +11,6 @@ import 'package:js/js_util.dart' as js_util; import '../configuration.dart'; import 'js_promise.dart'; -/// Typedef for the function that notifies JS that the main entrypoint is up and running. -/// As a parameter, a [FlutterEngineInitializer] instance is passed to JS, so the -/// programmer can control the initialization sequence. -typedef DidCreateEngineInitializerFn = void Function(FlutterEngineInitializer); - @JS() @staticInterop class FlutterJS {} @@ -35,7 +30,7 @@ class FlutterLoader {} extension FlutterLoaderExtension on FlutterLoader { external void didCreateEngineInitializer(FlutterEngineInitializer initializer); - bool get isAutostart => !js_util.hasProperty(this, 'didCreateEngineInitializer'); + bool get isAutoStart => !js_util.hasProperty(this, 'didCreateEngineInitializer'); } // FlutterEngineInitializer