@@ -9,6 +9,9 @@ import 'dart:typed_data';
99
1010import 'package:async/async.dart' ;
1111import 'package:http_multi_server/http_multi_server.dart' ;
12+ import 'package:meta/meta.dart' ;
13+ import 'package:package_config/discovery.dart' ;
14+ import 'package:package_config/packages.dart' ;
1215import 'package:path/path.dart' as p; // ignore: package_path_import
1316import 'package:pool/pool.dart' ;
1417import 'package:shelf/shelf.dart' as shelf;
@@ -50,14 +53,6 @@ class FlutterWebPlatform extends PlatformPlugin {
5053 String shellPath,
5154 this .updateGoldens,
5255 }) {
53- // Look up the location of the testing resources.
54- final Map <String , Uri > packageMap = PackageMap (globals.fs.path.join (
55- Cache .flutterRoot,
56- 'packages' ,
57- 'flutter_tools' ,
58- '.packages' ,
59- )).map;
60- testUri = packageMap['test' ];
6156 final shelf.Cascade cascade = shelf.Cascade ()
6257 .add (_webSocketHandler.handler)
6358 .add (packagesDirHandler ())
@@ -66,11 +61,18 @@ class FlutterWebPlatform extends PlatformPlugin {
6661 globals.fs.path.join (Cache .flutterRoot, 'packages' , 'flutter_tools' ),
6762 serveFilesOutsidePath: true ,
6863 ))
69- .add (createStaticHandler (_config.suiteDefaults.precompiledPath,
70- serveFilesOutsidePath: true ))
64+ .add (createStaticHandler (
65+ _config.suiteDefaults.precompiledPath,
66+ serveFilesOutsidePath: true ,
67+ ))
7168 .add (_handleStaticArtifact)
7269 .add (_goldenFileHandler)
73- .add (_wrapperHandler);
70+ .add (_wrapperHandler)
71+ .add (createStaticHandler (
72+ p.join (p.current, 'test' ),
73+ serveFilesOutsidePath: true ,
74+ ))
75+ .add (_packageFilesHandler);
7476 _server.mount (cascade.handler);
7577
7678 _testGoldenComparator = TestGoldenComparator (
@@ -97,14 +99,30 @@ class FlutterWebPlatform extends PlatformPlugin {
9799 );
98100 }
99101
100- Uri testUri;
102+ final Future <Packages > _packagesFuture = loadPackagesFile (Uri .base .resolve ('.packages' ));
103+
104+ final PackageMap _flutterToolsPackageMap = PackageMap (p.join (
105+ Cache .flutterRoot,
106+ 'packages' ,
107+ 'flutter_tools' ,
108+ '.packages' ,
109+ ));
110+
111+ /// Uri of the test package.
112+ Uri get testUri => _flutterToolsPackageMap.map['test' ];
101113
102114 /// The test runner configuration.
103115 final Configuration _config;
104116
117+ @visibleForTesting
118+ Configuration get config => _config;
119+
105120 /// The underlying server.
106121 final shelf.Server _server;
107122
123+ @visibleForTesting
124+ shelf.Server get server => _server;
125+
108126 /// The URL for this server.
109127 Uri get url => _server.url;
110128
@@ -193,6 +211,31 @@ class FlutterWebPlatform extends PlatformPlugin {
193211 }
194212 }
195213
214+ FutureOr <shelf.Response > _packageFilesHandler (shelf.Request request) async {
215+ if (request.requestedUri.pathSegments.first == 'packages' ) {
216+ final Packages packages = await _packagesFuture;
217+ final Uri fileUri = packages.resolve (Uri (
218+ scheme: 'package' ,
219+ pathSegments: request.requestedUri.pathSegments.skip (1 ),
220+ ));
221+ final String dirname = p.dirname (fileUri.toFilePath ());
222+ final String basename = p.basename (fileUri.toFilePath ());
223+ final shelf.Handler handler = createStaticHandler (dirname);
224+ final shelf.Request modifiedRequest = shelf.Request (
225+ request.method,
226+ request.requestedUri.replace (path: basename),
227+ protocolVersion: request.protocolVersion,
228+ headers: request.headers,
229+ handlerPath: request.handlerPath,
230+ url: request.url.replace (path: basename),
231+ encoding: request.encoding,
232+ context: request.context,
233+ );
234+ return handler (modifiedRequest);
235+ }
236+ return shelf.Response .notFound ('Not Found' );
237+ }
238+
196239 final bool updateGoldens;
197240 TestGoldenComparator _testGoldenComparator;
198241
0 commit comments