From 3bf79607dd4add05b1b791c2eb2d74233e61ebca Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Mon, 23 Jan 2023 10:02:58 -0500 Subject: [PATCH] [web] Fix paths fetched by flutter.js (#118684) --- .../src/web/file_generators/flutter_js.dart | 20 ++++++++++++++++--- .../build_system/targets/web_test.dart | 12 +++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart b/packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart index d24fb143c38..81a611dd301 100644 --- a/packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart +++ b/packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart @@ -20,6 +20,21 @@ _flutter.loader = null; (function () { "use strict"; + + const baseUri = ensureTrailingSlash(getBaseURI()); + + function getBaseURI() { + const base = document.querySelector("base"); + return (base && base.getAttribute("href")) || ""; + } + + function ensureTrailingSlash(uri) { + if (uri == "") { + return uri; + } + return uri.endsWith("/") ? uri : `${uri}/`; + } + /** * Wraps `promise` in a timeout of the given `duration` in ms. * @@ -120,8 +135,7 @@ _flutter.loader = null; } const { serviceWorkerVersion, - serviceWorkerUrl = "flutter_service_worker.js?v=" + - serviceWorkerVersion, + serviceWorkerUrl = `${baseUri}flutter_service_worker.js?v=${serviceWorkerVersion}`, timeoutMillis = 4000, } = settings; @@ -239,7 +253,7 @@ _flutter.loader = null; * Returns undefined when an `onEntrypointLoaded` callback is supplied in `options`. */ async loadEntrypoint(options) { - const { entrypointUrl = "main.dart.js", onEntrypointLoaded } = + const { entrypointUrl = `${baseUri}main.dart.js`, onEntrypointLoaded } = options || {}; return this._loadEntrypoint(entrypointUrl, onEntrypointLoaded); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart index db61f2f8af0..512510086ca 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart @@ -852,6 +852,18 @@ void main() { contains('"main.dart.js"')); })); + test('flutter.js sanity checks', () { + final String flutterJsContents = flutter_js.generateFlutterJsFile(); + expect(flutterJsContents, contains('"use strict";')); + expect(flutterJsContents, contains('main.dart.js')); + expect(flutterJsContents, contains('flutter_service_worker.js?v=')); + expect(flutterJsContents, contains('document.createElement("script")')); + expect(flutterJsContents, contains('"application/javascript"')); + expect(flutterJsContents, contains('const baseUri = ')); + expect(flutterJsContents, contains('document.querySelector("base")')); + expect(flutterJsContents, contains('.getAttribute("href")')); + }); + test('flutter.js is not dynamically generated', () => testbed.run(() async { globals.fs.file('bin/cache/flutter_web_sdk/canvaskit/foo') ..createSync(recursive: true)