| Index: runtime/bin/vmservice/loader.dart
|
| diff --git a/runtime/bin/vmservice/loader.dart b/runtime/bin/vmservice/loader.dart
|
| index 977fd28f7826d8c435c5da2846ee057adb6a4924..82fbe5e0e11ca845625b9da5b8b49515a6d473c7 100644
|
| --- a/runtime/bin/vmservice/loader.dart
|
| +++ b/runtime/bin/vmservice/loader.dart
|
| @@ -116,15 +116,16 @@ class IsolateLoaderState extends IsolateEmbedderData {
|
|
|
| _setPackageRoot(String packageRoot) {
|
| packageRoot = _sanitizeWindowsPath(packageRoot);
|
| - packageRoot = _enforceTrailingSlash(packageRoot);
|
| if (packageRoot.startsWith('file:') ||
|
| packageRoot.startsWith('http:') ||
|
| packageRoot.startsWith('https:')) {
|
| + packageRoot = _enforceTrailingSlash(packageRoot);
|
| _packageRoot = _workingDirectory.resolve(packageRoot);
|
| } else {
|
| packageRoot = _sanitizeWindowsPath(packageRoot);
|
| packageRoot = _trimWindowsPath(packageRoot);
|
| - _packageRoot = _workingDirectory.resolveUri(new Uri.file(packageRoot));
|
| + _packageRoot =
|
| + _workingDirectory.resolveUri(new Uri.directory(packageRoot));
|
| }
|
| }
|
|
|
| @@ -163,12 +164,12 @@ class IsolateLoaderState extends IsolateEmbedderData {
|
| List<Function> _pendingPackageLoads = [];
|
|
|
| // Given a uri with a 'package' scheme, return a Uri that is prefixed with
|
| - // the package root.
|
| + // the package root or resolved relative to the package configuration.
|
| Uri _resolvePackageUri(Uri uri) {
|
| assert(uri.scheme == "package");
|
| assert(_packagesReady);
|
|
|
| - if (!uri.host.isEmpty) {
|
| + if (uri.host.isNotEmpty) {
|
| var path = '${uri.host}${uri.path}';
|
| var right = 'package:$path';
|
| var wrong = 'package://$path';
|
| @@ -177,6 +178,12 @@ class IsolateLoaderState extends IsolateEmbedderData {
|
| "'$right', not '$wrong'.";
|
| }
|
|
|
| + var packageNameEnd = uri.path.indexOf('/');
|
| + if (packageNameEnd == 0) {
|
| + // Package URIs must have a non-empty package name (not start with "/").
|
| + throw "URIS using the 'package:' scheme should look like "
|
| + "'package:packageName${uri.path}', not 'package:${uri.path}'";
|
| + }
|
| if (_traceLoading) {
|
| _log('Resolving package with uri path: ${uri.path}');
|
| }
|
| @@ -189,7 +196,13 @@ class IsolateLoaderState extends IsolateEmbedderData {
|
| } else if (_packageRoot != null) {
|
| resolvedUri = _packageRoot.resolve(uri.path);
|
| } else {
|
| - var packageName = uri.pathSegments[0];
|
| + if (packageNameEnd < 0) {
|
| + // Package URIs must have a path after the package name, even if it's
|
| + // just "/".
|
| + throw "URIS using the 'package:' scheme should look like "
|
| + "'package:${uri.path}/', not 'package:${uri.path}'";
|
| + }
|
| + var packageName = uri.path.substring(0, packageNameEnd);
|
| var mapping = _packageMap[packageName];
|
| if (_traceLoading) {
|
| _log("Mapped '$packageName' package to '$mapping'");
|
| @@ -198,14 +211,8 @@ class IsolateLoaderState extends IsolateEmbedderData {
|
| throw "No mapping for '$packageName' package when resolving '$uri'.";
|
| }
|
| var path;
|
| - if (uri.path.length > packageName.length) {
|
| - path = uri.path.substring(packageName.length + 1);
|
| - } else {
|
| - // Handle naked package resolution to the default package name:
|
| - // package:foo is equivalent to package:foo/foo.dart
|
| - assert(uri.path.length == packageName.length);
|
| - path = "$packageName.dart";
|
| - }
|
| + assert(uri.path.length > packageName.length);
|
| + path = uri.path.substring(packageName.length + 1);
|
| if (_traceLoading) {
|
| _log("Path to be resolved in package: $path");
|
| }
|
|
|