From ace2c2297f42704bde394db5d3e63d39c5e7128c Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 27 Jan 2020 17:41:29 -0800 Subject: [PATCH] [flutter_tools] Generate correct entrypoint module name for experimental web compiler (#49486) --- .../flutter_tools/lib/src/web/devfs_web.dart | 9 +- .../general.shard/web/devfs_web_test.dart | 93 ++++++++++--------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/packages/flutter_tools/lib/src/web/devfs_web.dart b/packages/flutter_tools/lib/src/web/devfs_web.dart index cf795ae7fd3..6bc2bb910e1 100644 --- a/packages/flutter_tools/lib/src/web/devfs_web.dart +++ b/packages/flutter_tools/lib/src/web/devfs_web.dart @@ -68,7 +68,6 @@ class WebAssetServer { // RandomAccessFile and read on demand. final Map _files = {}; final Map _sourcemaps = {}; - final RegExp _drivePath = RegExp(r'\/[A-Z]:\/'); final Packages _packages; @@ -92,6 +91,7 @@ class WebAssetServer { await response.close(); return; } + // TODO(jonahwilliams): better path normalization in frontend_server to remove // this workaround. String requestPath = request.uri.path; @@ -347,17 +347,20 @@ class WebDevFS implements DevFS { 'web', 'dart_stack_trace_mapper.js', )); + final String entrypoint = PackageUriMapper(mainPath, '.packages', null, null) + .map(mainPath) + ?.pathSegments?.join('/'); _webAssetServer.writeFile( '/main.dart.js', generateBootstrapScript( requireUrl: _filePathToUriFragment(requireJS.path), mapperUrl: _filePathToUriFragment(stackTraceMapper.path), - entrypoint: '${_filePathToUriFragment(mainPath)}.lib.js', + entrypoint: entrypoint != null ? '/packages/$entrypoint.lib.js' : '$mainPath.lib.js', )); _webAssetServer.writeFile( '/main_module.js', generateMainModule( - entrypoint: '${_filePathToUriFragment(mainPath)}.lib.js', + entrypoint: entrypoint != null ? '/packages/$entrypoint.lib.js' : '$mainPath.lib.js', )); _webAssetServer.writeFile('/dart_sdk.js', dartSdk.readAsStringSync()); _webAssetServer.writeFile( diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart index 8f255acb324..10f1aa824d3 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart @@ -35,21 +35,23 @@ void main() { MockHttpHeaders headers; Completer closeCompleter; WebAssetServer webAssetServer; - MockPlatform windows; MockPlatform linux; Packages packages; + MockPlatform windows; setUpAll(() async { - packages = await loadPackagesFile(Uri.base.resolve('.packages')); + packages = await loadPackagesFile(Uri.base.resolve('.packages'), loader: (Uri uri) async { + return utf8.encode('\n'); + }); }); setUp(() { - windows = MockPlatform(); linux = MockPlatform(); - when(windows.environment).thenReturn(const {}); - when(windows.isWindows).thenReturn(true); + windows = MockPlatform(); when(linux.isWindows).thenReturn(false); when(linux.environment).thenReturn(const {}); + when(windows.environment).thenReturn(const {}); + when(windows.isWindows).thenReturn(true); testbed = Testbed(setup: () { mockHttpServer = MockHttpServer(); requestController = StreamController.broadcast(); @@ -139,29 +141,6 @@ void main() { Platform: () => linux, })); - test('serves JavaScript files from in memory cache on Windows', () => testbed.run(() async { - final File source = globals.fs.file('source') - ..writeAsStringSync('main() {}'); - final File sourcemap = globals.fs.file('sourcemap') - ..writeAsStringSync('{}'); - final File manifest = globals.fs.file('manifest') - ..writeAsStringSync(json.encode({'/C:/foo.js': { - 'code': [0, source.lengthSync()], - 'sourcemap': [0, 2], - }})); - webAssetServer.write(source, manifest, sourcemap); - - when(request.uri).thenReturn(Uri.parse('http://foobar/C:/foo.js')); - requestController.add(request); - await closeCompleter.future; - - verify(headers.add('Content-Length', source.lengthSync())).called(1); - verify(headers.add('Content-Type', 'application/javascript')).called(1); - verify(response.add(source.readAsBytesSync())).called(1); - }, overrides: { - Platform: () => windows, - })); - test('serves JavaScript files from in memory cache not from manifest', () => testbed.run(() async { webAssetServer.writeFile('/foo.js', 'main() {}'); @@ -193,7 +172,30 @@ void main() { verify(response.statusCode = 404).called(1); })); - test('serves Dart files from in filesystem on Windows', () => testbed.run(() async { + test('serves JavaScript files from in memory cache on Windows', () => testbed.run(() async { + final File source = globals.fs.file('source') + ..writeAsStringSync('main() {}'); + final File sourcemap = globals.fs.file('sourcemap') + ..writeAsStringSync('{}'); + final File manifest = globals.fs.file('manifest') + ..writeAsStringSync(json.encode({'/C:/foo.js': { + 'code': [0, source.lengthSync()], + 'sourcemap': [0, 2], + }})); + webAssetServer.write(source, manifest, sourcemap); + + when(request.uri).thenReturn(Uri.parse('http://foobar/C:/foo.js')); + requestController.add(request); + await closeCompleter.future; + + verify(headers.add('Content-Length', source.lengthSync())).called(1); + verify(headers.add('Content-Type', 'application/javascript')).called(1); + verify(response.add(source.readAsBytesSync())).called(1); + }, overrides: { + Platform: () => windows, + })); + + test('serves Dart files from in filesystem on Windows', () => testbed.run(() async { final File source = globals.fs.file('foo.dart').absolute ..createSync(recursive: true) ..writeAsStringSync('void main() {}'); @@ -208,6 +210,22 @@ void main() { Platform: () => windows, })); + test('serves asset files from in filesystem with known mime type on Windows', () => testbed.run(() async { + final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo.png')) + ..createSync(recursive: true) + ..writeAsBytesSync(kTransparentImage); + + when(request.uri).thenReturn(Uri.parse('http://foobar/assets/foo.png')); + requestController.add(request); + await closeCompleter.future; + + verify(headers.add('Content-Length', source.lengthSync())).called(1); + verify(headers.add('Content-Type', 'image/png')).called(1); + verify(response.addStream(any)).called(1); + }, overrides: { + Platform: () => windows, + })); + test('serves Dart files from in filesystem on Linux/macOS', () => testbed.run(() async { final File source = globals.fs.file('foo.dart').absolute ..createSync(recursive: true) @@ -245,23 +263,6 @@ void main() { verify(response.addStream(any)).called(1); })); - test('serves asset files from in filesystem with known mime type on Windows', () => testbed.run(() async { - final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo.png')) - ..createSync(recursive: true) - ..writeAsBytesSync(kTransparentImage); - - when(request.uri).thenReturn(Uri.parse('http://foobar/assets/foo.png')); - requestController.add(request); - await closeCompleter.future; - - verify(headers.add('Content-Length', source.lengthSync())).called(1); - verify(headers.add('Content-Type', 'image/png')).called(1); - verify(response.addStream(any)).called(1); - }, overrides: { - Platform: () => windows, - })); - - test('serves asset files files from in filesystem with unknown mime type and length > 12', () => testbed.run(() async { final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo')) ..createSync(recursive: true)