diff --git a/dwds/lib/src/handlers/injected_handler.dart b/dwds/lib/src/handlers/injected_handler.dart index fbe86bbd2..99164b016 100644 --- a/dwds/lib/src/handlers/injected_handler.dart +++ b/dwds/lib/src/handlers/injected_handler.dart @@ -24,8 +24,9 @@ const mainExtensionMarker = '/* MAIN_EXTENSION_MARKER */'; const _clientScript = 'dwds/src/injected/client'; Handler Function(Handler) createInjectedHandler( - ReloadConfiguration configuration, -) => + ReloadConfiguration configuration, + {String extensionHostname, + int extensionPort}) => (innerHandler) { return (Request request) async { if (request.url.path == '$_clientScript.js') { @@ -66,7 +67,9 @@ Handler Function(Handler) createInjectedHandler( .replaceAll('(', '') .replaceAll(')', '') .trim(); - body += _injectedClientJs(configuration, appId, mainFuntion); + body += _injectedClientJs(configuration, appId, mainFuntion, + extensionHostname: extensionHostname, + extensionPort: extensionPort); body += bodyLines.sublist(extensionIndex + 2).join('\n'); // Change the hot restart handler to re-assign // `window.$dartRunMain` to the new main, instead of invoking it. @@ -86,11 +89,20 @@ Handler Function(Handler) createInjectedHandler( }; String _injectedClientJs( - ReloadConfiguration configuration, String appId, String mainFunction) => - '''\n -// Injected by webdev for build results support. -window.\$dartAppId = "$appId"; -window.\$dartRunMain = $mainFunction; -window.\$dartReloadConfiguration = "$configuration"; -window.\$dartLoader.forceLoadModule('$_clientScript'); -'''; + ReloadConfiguration configuration, String appId, String mainFunction, + {String extensionHostname, int extensionPort}) { + var injectedBody = '''\n + // Injected by webdev for build results support. + window.\$dartAppId = "$appId"; + window.\$dartRunMain = $mainFunction; + window.\$dartReloadConfiguration = "$configuration"; + window.\$dartLoader.forceLoadModule('$_clientScript'); + '''; + if (extensionPort != null && extensionHostname != null) { + injectedBody += ''' + window.\$extensionHostname = "$extensionHostname"; + window.\$extensionPort = "$extensionPort"; + '''; + } + return injectedBody; +} diff --git a/dwds/test/handlers/injected_handler_test.dart b/dwds/test/handlers/injected_handler_test.dart index 713d262c9..8f4e4fad5 100644 --- a/dwds/test/handlers/injected_handler_test.dart +++ b/dwds/test/handlers/injected_handler_test.dart @@ -16,7 +16,7 @@ void main() { const entryEtag = 'entry etag'; const nonEntryEtag = 'some etag'; - group('InjectedMiddelware', () { + group('InjectedHandlerWithoutExtension', () { setUp(() async { var pipeline = const Pipeline() .addMiddleware(createInjectedHandler(ReloadConfiguration.liveReload)); @@ -95,5 +95,41 @@ void main() { }); expect(cachedResponse.statusCode, HttpStatus.notModified); }); + + test('Does not inject the extension backend port', () async { + var result = await http.get( + 'http://localhost:${server.port}/entrypoint$bootstrapJsExtension'); + expect(result.body.contains('extensionHostname'), isFalse); + expect(result.body.contains('extensionPort'), isFalse); + }); + }); + + group('InjectedHandlerWithExtension', () { + setUp(() async { + var someExtensionHostname = 'localhost'; + var someExtensionPort = 4000; + var pipeline = const Pipeline().addMiddleware(createInjectedHandler( + ReloadConfiguration.liveReload, + extensionHostname: someExtensionHostname, + extensionPort: someExtensionPort)); + server = await shelf_io.serve(pipeline.addHandler((request) { + return Response.ok( + '$entrypointExtensionMarker\n' + '$mainExtensionMarker\n' + 'app.main.main()', + headers: {HttpHeaders.etagHeader: entryEtag}); + }), 'localhost', 0); + }); + + tearDown(() async { + await server.close(); + }); + + test('Injects the extension backend port', () async { + var result = await http.get( + 'http://localhost:${server.port}/entrypoint$bootstrapJsExtension'); + expect(result.body.contains('extensionHostname'), isTrue); + expect(result.body.contains('extensionPort'), isTrue); + }); }); }