From 760f913d78d71c1b89b59d73a1b02047dfcd89c2 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 10 Feb 2023 23:35:08 +0000 Subject: [PATCH 1/5] Allow any JS file in flutter loader. --- .../flutter_tools/lib/src/web/file_generators/js/flutter.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js index bdf438bbd329d..5b6f8809b8204 100644 --- a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js +++ b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js @@ -72,8 +72,7 @@ _flutter.loader = null; */ constructor(validPatterns, policyName = "flutter-js") { const patterns = validPatterns || [ - /\.dart\.js$/, - /^flutter_service_worker.js$/ + /\.js$/, ]; if (window.trustedTypes) { this.policy = trustedTypes.createPolicy(policyName, { From c15b7f73719a4f445d16787a996e059c80bc0c21 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Sat, 11 Feb 2023 00:16:57 +0000 Subject: [PATCH 2/5] Nag only if service worker API is completely unavailable. --- .../lib/src/web/file_generators/js/flutter.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js index 5b6f8809b8204..0b90dc3eca98d 100644 --- a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js +++ b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js @@ -115,12 +115,16 @@ _flutter.loader = null; * @returns {Promise} that resolves when the latest serviceWorker is ready. */ loadServiceWorker(settings) { - if (!("serviceWorker" in navigator) || settings == null) { - // In the future, settings = null -> uninstall service worker? + if (!("serviceWorker" in navigator)) { return Promise.reject( - new Error("Service worker not supported (or configured).") + new Error("Service Worker API unavailable.") ); } + if (settings == null) { + // In the future, settings = null -> uninstall service worker? + console.debug("Null serviceWorker configuration. Skipping."); + return Promise.resolve(); + } const { serviceWorkerVersion, serviceWorkerUrl = `${baseUri}flutter_service_worker.js?v=${serviceWorkerVersion}`, From cd1bea2602b87fe5cfe9f35424f7e02b49a1466b Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Sat, 11 Feb 2023 00:29:56 +0000 Subject: [PATCH 3/5] Add info about Secure Contexts if that may be the reason why serviceworker is not available. --- .../lib/src/web/file_generators/js/flutter.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js index 0b90dc3eca98d..bf326576bdb11 100644 --- a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js +++ b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js @@ -116,8 +116,13 @@ _flutter.loader = null; */ loadServiceWorker(settings) { if (!("serviceWorker" in navigator)) { + let errorMessage = "Service Worker API unavailable."; + if (!window.isSecureContext) { + errorMessage += "\nThe current context is NOT secure." + errorMessage += "\nRead more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts"; + } return Promise.reject( - new Error("Service Worker API unavailable.") + new Error(errorMessage) ); } if (settings == null) { From 8aeb1646f0fbe0c0acafd1cd65cc685443b06294 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Sat, 11 Feb 2023 00:36:42 +0000 Subject: [PATCH 4/5] Update sanity test. --- .../test/general.shard/build_system/targets/web_test.dart | 2 ++ 1 file changed, 2 insertions(+) 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 e4a85ac947266..151aa45beeb9e 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 @@ -881,6 +881,8 @@ void main() { flutter_js.generateFlutterJsFile(fileGeneratorsPath); expect(flutterJsContents, contains('"use strict";')); expect(flutterJsContents, contains('main.dart.js')); + expect(flutterJsContents, contains('if (!("serviceWorker" in navigator))')); + expect(flutterJsContents, contains(r'/\.js$/,')); expect(flutterJsContents, contains('flutter_service_worker.js?v=')); expect(flutterJsContents, contains('document.createElement("script")')); expect(flutterJsContents, contains('"application/javascript"')); From caffbfe61c4bafcc2dbc41e80ace4fbaa42c1f4d Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Sat, 11 Feb 2023 00:47:49 +0000 Subject: [PATCH 5/5] If service worker settings are null, do not even check if the API is available. --- .../lib/src/web/file_generators/js/flutter.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js index bf326576bdb11..d3efa7fd80d9d 100644 --- a/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js +++ b/packages/flutter_tools/lib/src/web/file_generators/js/flutter.js @@ -115,6 +115,11 @@ _flutter.loader = null; * @returns {Promise} that resolves when the latest serviceWorker is ready. */ loadServiceWorker(settings) { + if (settings == null) { + // In the future, settings = null -> uninstall service worker? + console.debug("Null serviceWorker configuration. Skipping."); + return Promise.resolve(); + } if (!("serviceWorker" in navigator)) { let errorMessage = "Service Worker API unavailable."; if (!window.isSecureContext) { @@ -125,11 +130,6 @@ _flutter.loader = null; new Error(errorMessage) ); } - if (settings == null) { - // In the future, settings = null -> uninstall service worker? - console.debug("Null serviceWorker configuration. Skipping."); - return Promise.resolve(); - } const { serviceWorkerVersion, serviceWorkerUrl = `${baseUri}flutter_service_worker.js?v=${serviceWorkerVersion}`,