mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:57:35 +00:00
- 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 .
This commit is contained in:
parent
eab396d82b
commit
4f54e6aee5
|
@ -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<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,
|
||||
|
@ -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'.");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue