diff --git a/runtime/bin/vmservice/loader.dart b/runtime/bin/vmservice/loader.dart index 6bc8c456093f..9b7355e0b7cc 100644 --- a/runtime/bin/vmservice/loader.dart +++ b/runtime/bin/vmservice/loader.dart @@ -64,12 +64,16 @@ void _loadFile(SendPort sp, int id, Uri uri) { 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 @@ _loadPackagesFile(SendPort sp, bool traceLoading, Uri packagesFile) async { 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 @@ Future _loadHttpPackagesFile(SendPort sp, 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 @@ _handlePackagesRequest(SendPort sp, 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 980252b1df53..5245e4500ae6 100644 --- a/runtime/tests/vm/vm.status +++ b/runtime/tests/vm/vm.status @@ -59,11 +59,6 @@ dart/inline_stack_frame_test: RuntimeError, Pass # Issue 7953 # 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 000000000000..8884d4eb30f6 --- /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"); + } +}