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..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 @@ -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, { @@ -116,10 +115,19 @@ _flutter.loader = null; * @returns {Promise} that resolves when the latest serviceWorker is ready. */ loadServiceWorker(settings) { - if (!("serviceWorker" in navigator) || settings == null) { + 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) { + 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 not supported (or configured).") + new Error(errorMessage) ); } const { 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"'));