[web] CL 1 (#32689)
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index 5ba213f..bd363d1 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -983,6 +983,7 @@
FILE: ../../../flutter/lib/web_ui/lib/src/engine/clipboard.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/color_filter.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/configuration.dart
+FILE: ../../../flutter/lib/web_ui/lib/src/engine/dom.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/embedder.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/engine_canvas.dart
FILE: ../../../flutter/lib/web_ui/lib/src/engine/font_change_util.dart
diff --git a/lib/web_ui/lib/src/engine.dart b/lib/web_ui/lib/src/engine.dart
index fedb084..9961367 100644
--- a/lib/web_ui/lib/src/engine.dart
+++ b/lib/web_ui/lib/src/engine.dart
@@ -55,6 +55,7 @@
export 'engine/clipboard.dart';
export 'engine/color_filter.dart';
export 'engine/configuration.dart';
+export 'engine/dom.dart';
export 'engine/embedder.dart';
export 'engine/engine_canvas.dart';
export 'engine/font_change_util.dart';
diff --git a/lib/web_ui/lib/src/engine/assets.dart b/lib/web_ui/lib/src/engine/assets.dart
index a352a2a..439983b 100644
--- a/lib/web_ui/lib/src/engine/assets.dart
+++ b/lib/web_ui/lib/src/engine/assets.dart
@@ -6,6 +6,7 @@
import 'dart:html' as html;
import 'dart:typed_data';
+import 'dom.dart';
import 'text/font_collection.dart';
import 'util.dart';
@@ -23,10 +24,13 @@
const AssetManager({this.assetsDir = _defaultAssetsDir});
String? get _baseUrl {
- return html.window.document
+ return domWindow.document
.querySelectorAll('meta')
- .whereType<html.MetaElement>()
- .firstWhereOrNull((html.MetaElement element) => element.name == 'assetBase')
+ .where((Object? domNode) => domInstanceOfString(domNode,
+ 'HTMLMetaElement'))
+ .map((Object? domNode) => domNode! as DomHTMLMetaElement)
+ .firstWhereOrNull(
+ (DomHTMLMetaElement element) => element.name == 'assetBase')
?.content;
}
@@ -83,6 +87,7 @@
class AssetManagerException implements Exception {
/// Http request url for asset.
final String url;
+
/// Http status of response.
final int httpStatus;
@@ -97,8 +102,10 @@
class WebOnlyMockAssetManager implements AssetManager {
/// Mock asset directory relative to base url.
String defaultAssetsDir = '';
+
/// Mock empty asset manifest.
String defaultAssetManifest = '{}';
+
/// Mock font manifest overridable for unit testing.
String defaultFontManifest = '''
[
diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart
new file mode 100644
index 0000000..58feade
--- /dev/null
+++ b/lib/web_ui/lib/src/engine/dom.dart
@@ -0,0 +1,53 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+
+@JS()
+@staticInterop
+class DomWindow {}
+
+extension DomWindowExtension on DomWindow {
+ external DomDocument get document;
+}
+
+@JS('window')
+external DomWindow get domWindow;
+
+@JS()
+@staticInterop
+class DomDocument {}
+
+extension DomDocumentExtension on DomDocument {
+ external /* List<Node> */ List<Object?> querySelectorAll(String selectors);
+}
+
+@JS()
+@staticInterop
+class DomEventTarget {}
+
+@JS()
+@staticInterop
+class DomNode extends DomEventTarget {}
+
+@JS()
+@staticInterop
+class DomHTMLElement extends DomNode {}
+
+@JS()
+@staticInterop
+class DomHTMLMetaElement {}
+
+extension DomHTMLMetaElementExtension on DomHTMLMetaElement {
+ external String get name;
+ external String get content;
+ external set name(String value);
+}
+
+Object? domGetConstructor(String constructorName) =>
+ js_util.getProperty(domWindow, constructorName);
+
+bool domInstanceOfString(Object? element, String objectType) =>
+ js_util.instanceof(element, domGetConstructor(objectType)!);