From d6ebdd2c7ede4d2064df8709ce90b1db464fd300 Mon Sep 17 00:00:00 2001 From: Joshua Litt Date: Fri, 9 Sep 2022 22:54:51 +0000 Subject: [PATCH] [web] Upstream some fixes for dart2wasm. --- lib/web_ui/lib/initialization.dart | 5 +---- lib/web_ui/lib/src/engine/dom.dart | 11 +++++++++-- lib/web_ui/lib/src/engine/js_interop/js_loader.dart | 8 +++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/web_ui/lib/initialization.dart b/lib/web_ui/lib/initialization.dart index e19f24103cdf4..c28a3056e3515 100644 --- a/lib/web_ui/lib/initialization.dart +++ b/lib/web_ui/lib/initialization.dart @@ -81,11 +81,8 @@ Future webOnlyWarmupEngine({ // Should the app "autoStart"? bool autoStart = true; - try { + if (engine.flutter != null && engine.loader != null) { autoStart = engine.didCreateEngineInitializer == null; - } catch (e) { - // Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'loader') - autoStart = true; } if (autoStart) { // The user does not want control of the app, bootstrap immediately. diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index 3c6bac0aa0b31..b1a02a82d29df 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -1276,8 +1276,7 @@ class DomStyleSheet {} class DomCSSStyleSheet extends DomStyleSheet {} extension DomCSSStyleSheetExtension on DomCSSStyleSheet { - List get cssRules => - js_util.getProperty>(this, 'cssRules').cast(); + external DomCSSRuleList get cssRules; int insertRule(String rule, [int? index]) => js_util .callMethod(this, 'insertRule', [rule, if (index != null) index]); } @@ -1381,6 +1380,14 @@ extension DomMessageChannelExtension on DomMessageChannel { external DomMessagePort get port2; } +@JS() +@staticInterop +class DomCSSRuleList {} + +extension DomCSSRuleListExtension on DomCSSRuleList { + external int get length; +} + DomMessageChannel createDomMessageChannel() => domCallConstructorString('MessageChannel', [])! as DomMessageChannel; 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 9b75840840f42..655e69d837a20 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 @@ -14,7 +14,13 @@ import 'js_promise.dart'; /// programmer can control the initialization sequence. typedef DidCreateEngineInitializerFn = void Function(FlutterEngineInitializer); -// A JS-interop representation of `_flutter?.loader?.didCreateEngineInitializer?`: +// Both `flutter`, `loader`(_flutter.loader), must be checked for null before +// `didCreateEngineInitializer` can be safely accessed. +@JS('_flutter') +external Object? get flutter; + +@JS('_flutter.loader') +external Object? get loader; @JS('_flutter.loader.didCreateEngineInitializer') external DidCreateEngineInitializerFn? get didCreateEngineInitializer;