Skip to content

Commit

Permalink
- Add support for passing data: based URIs as packageConfig to
Browse files Browse the repository at this point in the history
  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 .
  • Loading branch information
iposva-google committed Jan 16, 2016
1 parent eab396d commit 4f54e6a
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 10 deletions.
36 changes: 31 additions & 5 deletions runtime/bin/vmservice/loader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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.");
}
}

Expand Down Expand Up @@ -364,6 +368,26 @@ Future<bool> _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,
Expand Down Expand Up @@ -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'.");
Expand Down
5 changes: 0 additions & 5 deletions runtime/tests/vm/vm.status
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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");
}
}

0 comments on commit 4f54e6a

Please sign in to comment.