From e396ec99a4b721ef2c2322c5864704d8d66fda41 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 7 Oct 2024 15:21:01 -0700 Subject: [PATCH] [web] Ensure Flutter adds a generator meta-tag. --- lib/web_ui/lib/src/engine/initialization.dart | 3 +++ lib/web_ui/lib/src/engine/util.dart | 13 +++++++++++++ lib/web_ui/test/engine/initialization_test.dart | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/lib/web_ui/lib/src/engine/initialization.dart b/lib/web_ui/lib/src/engine/initialization.dart index 3bbe6d1330cc1..9fddd5544bf6d 100644 --- a/lib/web_ui/lib/src/engine/initialization.dart +++ b/lib/web_ui/lib/src/engine/initialization.dart @@ -229,6 +229,9 @@ Future initializeEngineUi() async { RawKeyboard.initialize(onMacOs: ui_web.browser.operatingSystem == ui_web.OperatingSystem.macOs); KeyboardBinding.initInstance(); + // Ensures Flutter renders a global "generator" meta-tag. + ensureMetaTag('generator', 'Flutter'); + if (!configuration.multiViewEnabled) { final EngineFlutterWindow implicitView = ensureImplicitViewInitialized(hostElement: configuration.hostElement); diff --git a/lib/web_ui/lib/src/engine/util.dart b/lib/web_ui/lib/src/engine/util.dart index 806624f61fdbc..9dbf6a3ce3180 100644 --- a/lib/web_ui/lib/src/engine/util.dart +++ b/lib/web_ui/lib/src/engine/util.dart @@ -722,6 +722,19 @@ void setThemeColor(ui.Color? color) { } } +/// Ensure a "meta" tag with [name] and [content] is set on the page. +void ensureMetaTag(String name, String content) { + final DomElement? existingTag = + domDocument.querySelector('meta[name=$name][content=$content]'); + + if (existingTag == null) { + final DomHTMLMetaElement meta = createDomHTMLMetaElement() + ..name = name + ..content = content; + domDocument.head!.append(meta); + } +} + bool? _ellipseFeatureDetected; /// Draws CanvasElement ellipse with fallback. diff --git a/lib/web_ui/test/engine/initialization_test.dart b/lib/web_ui/test/engine/initialization_test.dart index 2f5a2f45d89f2..6f889fce724ed 100644 --- a/lib/web_ui/test/engine/initialization_test.dart +++ b/lib/web_ui/test/engine/initialization_test.dart @@ -8,6 +8,7 @@ import 'package:js/js_util.dart' as js_util; import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart' as engine; +import 'package:ui/src/engine/dom.dart'; import 'package:ui/ui_web/src/ui_web.dart' as ui_web; @JS('_flutter') @@ -76,6 +77,10 @@ void testMain() { // Check that the object we captured is actually a loader expect(pluginsRegistered, isTrue, reason: 'Plugins should be immediately registered in autoStart mode.'); expect(appRan, isTrue, reason: 'App should run immediately in autoStart mode'); + + // After starting the engine, the meta-generator tag should be on the page + final DomElement? meta = domDocument.querySelector('meta[name=generator][content=Flutter]'); + expect(meta, isNotNull, reason: 'The generator meta-tag should be added when Flutter initializes its UI.'); }); // We cannot test anymore, because by now the engine has registered some stuff that can't be rewound back.