@@ -9,6 +9,9 @@ import 'dart:typed_data';
9
9
10
10
import 'package:async/async.dart' ;
11
11
import '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' ;
12
15
import 'package:path/path.dart' as p; // ignore: package_path_import
13
16
import 'package:pool/pool.dart' ;
14
17
import 'package:shelf/shelf.dart' as shelf;
@@ -50,14 +53,6 @@ class FlutterWebPlatform extends PlatformPlugin {
50
53
String shellPath,
51
54
this .updateGoldens,
52
55
}) {
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' ];
61
56
final shelf.Cascade cascade = shelf.Cascade ()
62
57
.add (_webSocketHandler.handler)
63
58
.add (packagesDirHandler ())
@@ -66,11 +61,18 @@ class FlutterWebPlatform extends PlatformPlugin {
66
61
globals.fs.path.join (Cache .flutterRoot, 'packages' , 'flutter_tools' ),
67
62
serveFilesOutsidePath: true ,
68
63
))
69
- .add (createStaticHandler (_config.suiteDefaults.precompiledPath,
70
- serveFilesOutsidePath: true ))
64
+ .add (createStaticHandler (
65
+ _config.suiteDefaults.precompiledPath,
66
+ serveFilesOutsidePath: true ,
67
+ ))
71
68
.add (_handleStaticArtifact)
72
69
.add (_goldenFileHandler)
73
- .add (_wrapperHandler);
70
+ .add (_wrapperHandler)
71
+ .add (createStaticHandler (
72
+ p.join (p.current, 'test' ),
73
+ serveFilesOutsidePath: true ,
74
+ ))
75
+ .add (_packageFilesHandler);
74
76
_server.mount (cascade.handler);
75
77
76
78
_testGoldenComparator = TestGoldenComparator (
@@ -97,14 +99,30 @@ class FlutterWebPlatform extends PlatformPlugin {
97
99
);
98
100
}
99
101
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' ];
101
113
102
114
/// The test runner configuration.
103
115
final Configuration _config;
104
116
117
+ @visibleForTesting
118
+ Configuration get config => _config;
119
+
105
120
/// The underlying server.
106
121
final shelf.Server _server;
107
122
123
+ @visibleForTesting
124
+ shelf.Server get server => _server;
125
+
108
126
/// The URL for this server.
109
127
Uri get url => _server.url;
110
128
@@ -193,6 +211,31 @@ class FlutterWebPlatform extends PlatformPlugin {
193
211
}
194
212
}
195
213
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
+
196
239
final bool updateGoldens;
197
240
TestGoldenComparator _testGoldenComparator;
198
241
0 commit comments