- Add support for passing data: based URIs as packageConfig to
Isolate.spawnUri.
- Loosen the expected mimeType and encoding for data: URI based
file loading.
BUG=
R=rmacnak@google.com
Review URL: https://codereview.chromium.org/1585103006 .
diff --git a/runtime/bin/vmservice/loader.dart b/runtime/bin/vmservice/loader.dart
index 6bc8c45..9b7355e 100644
--- a/runtime/bin/vmservice/loader.dart
+++ b/runtime/bin/vmservice/loader.dart
@@ -64,12 +64,16 @@
void _loadDataUri(SendPort sp, int id, Uri uri) {
try {
- if (uri.data.mimeType != "application/dart") {
- throw "MIME-type must be application/dart";
+ var mime = uri.data.mimeType;
+ if ((mime != "application/dart") &&
+ (mime != "text/plain")) {
+ throw "MIME-type must be application/dart or text/plain: $mime given.";
}
- if (uri.data.charset != "utf-8") {
+ var charset = uri.data.charset;
+ if ((charset != "utf-8") &&
+ (charset != "US-ASCII")) {
// The C++ portion of the embedder assumes UTF-8.
- throw "Only utf-8 encoding is supported";
+ throw "Only utf-8 or US-ASCII encodings are supported: $charset given.";
}
_sendResourceResponse(sp, id, uri.data.contentAsBytes());
} catch (e) {
@@ -262,7 +266,7 @@
if (traceLoading) {
_log("Error loading packages: $e\n$s");
}
- sp.send("Uncaught error ($e) loading packags file.");
+ sp.send("Uncaught error ($e) loading packages file.");
}
}
@@ -364,6 +368,26 @@
return false;
}
+_loadPackagesData(sp, traceLoading, resource){
+ try {
+ var data = resource.data;
+ var mime = data.mimeType;
+ if (mime != "text/plain") {
+ throw "MIME-type must be text/plain: $mime given.";
+ }
+ var charset = data.charset;
+ if ((charset != "utf-8") &&
+ (charset != "US-ASCII")) {
+ // The C++ portion of the embedder assumes UTF-8.
+ throw "Only utf-8 or US-ASCII encodings are supported: $charset given.";
+ }
+ _parsePackagesFile(sp, traceLoading, resource, data.contentAsBytes());
+ } catch (e) {
+ sp.send("Uncaught error ($e) loading packages data.");
+ }
+}
+
+
_handlePackagesRequest(SendPort sp,
bool traceLoading,
int id,
@@ -402,6 +426,8 @@
if (!exists) {
sp.send("Packages file '$resource' not found.");
}
+ } else if (resource.scheme == 'data') {
+ _loadPackagesData(sp, traceLoading, resource);
} else {
sp.send("Unknown scheme (${resource.scheme}) for package file at "
"'$resource'.");
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index f0bc1ef..f5163a0 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -57,11 +57,6 @@
# Data uri's not supported by dart2js or the analyzer.
dart/data_uri*test: Skip
-[ ($runtime == vm || $runtime == dart_precompiled) ]
-dart/data_uri_import_test/wrongmime: RuntimeError, OK # VM is more restrictive than the browser
-dart/data_uri_import_test/nomime: RuntimeError, OK
-dart/data_uri_import_test/nocharset: RuntimeError, OK
-
[ $arch == mips ]
cc/StaticNonNullSumCallCodegen: Crash, Pass # Issue 17440
cc/ArrayLengthMaxElements: Crash # Issue 23275
diff --git a/tests/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart b/tests/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
new file mode 100644
index 0000000..8884d4e
--- /dev/null
+++ b/tests/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:isolate';
+
+final PACKAGE_URI = "package:foo/bar.dart";
+final PACKAGE_PATH = "file:///no/such/directory/bar.dart";
+
+final PACKAGE_SPEC = """
+# This is the content of a .packages file.
+foo:file:///no/such/directory/
+""";
+
+
+main([args, port]) async {
+ if (port != null) {
+ testPackageResolution(port);
+ return;
+ }
+ var data = new Uri.dataFromString(PACKAGE_SPEC);
+ var p = new RawReceivePort();
+ Isolate.spawnUri(Platform.script,
+ [],
+ p.sendPort,
+ packageConfig: data);
+ p.handler = (msg) {
+ p.close();
+ if (msg is! List) {
+ print(msg.runtimeType);
+ throw "Failure return from spawned isolate:\n\n$msg";
+ }
+ if (msg[0] != data.toString()) {
+ throw "Bad package config in child isolate: ${msg[0]}\n"
+ "Expected: $data";
+ }
+ if (msg[1] != PACKAGE_PATH) {
+ throw "Package path not matching: ${msg[1]}";
+ }
+ print("SUCCESS");
+ };
+ print("Spawning isolate's package root: ${await Isolate.packageRoot}");
+}
+
+testPackageResolution(port) async {
+ try {
+ var packageRootStr = Platform.packageRoot;
+ var packageConfigStr = Platform.packageConfig;
+ var packageConfig = await Isolate.packageConfig;
+ var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
+ print("Spawned isolate's package root flag: $packageRootStr");
+ print("Spawned isolate's package config flag: $packageConfigStr");
+ print("Spawned isolate's loaded package config: $packageConfig");
+ print("Spawned isolate's resolved package path: $resolvedPkg");
+ port.send([packageConfig?.toString(), resolvedPkg?.toString()]);
+ } catch (e, s) {
+ port.send("$e\n$s\n");
+ }
+}