diff options
author | Luca Casonato <lucacasonato@yahoo.com> | 2021-06-06 18:32:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-06 18:32:06 +0200 |
commit | a66f327250d9df77816e80e7d411b232f8b08b11 (patch) | |
tree | 69f75867a3e0f507d2d62b3a5c2d9b23c9f8a7e5 | |
parent | f1deed41e7cc04440a5fb8cdae486ae00513a361 (diff) |
tests: run wpt scripts with Deno.core.evalContext (#10852)
This means wpts are now run in script context, and there are better
stack traces.
-rw-r--r-- | core/bindings.rs | 15 | ||||
-rw-r--r-- | tools/util.js | 5 | ||||
-rw-r--r-- | tools/wpt/expectation.json | 22 | ||||
-rw-r--r-- | tools/wpt/runner.ts | 30 |
4 files changed, 43 insertions, 29 deletions
diff --git a/core/bindings.rs b/core/bindings.rs index 5fb57aac3..fbde856c5 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -1,6 +1,7 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. use crate::error::AnyError; +use crate::resolve_url_or_path; use crate::JsRuntime; use crate::Op; use crate::OpId; @@ -382,13 +383,21 @@ fn eval_context( let source = match v8::Local::<v8::String>::try_from(args.get(0)) { Ok(s) => s, Err(_) => { - throw_type_error(scope, "Invalid argument"); + throw_type_error(scope, "Missing first argument"); return; } }; - let url = v8::Local::<v8::String>::try_from(args.get(1)) - .map(|n| Url::from_file_path(n.to_rust_string_lossy(scope)).unwrap()); + let url = match v8::Local::<v8::String>::try_from(args.get(1)) { + Ok(s) => match resolve_url_or_path(&s.to_rust_string_lossy(scope)) { + Ok(s) => Some(s), + Err(err) => { + throw_type_error(scope, &format!("Invalid specifier: {}", err)); + return; + } + }, + Err(_) => None, + }; #[derive(Serialize)] struct Output<'s>(Option<serde_v8::Value<'s>>, Option<ErrInfo<'s>>); diff --git a/tools/util.js b/tools/util.js index 72163c546..98ccc77ce 100644 --- a/tools/util.js +++ b/tools/util.js @@ -3,10 +3,11 @@ import { dirname, fromFileUrl, join, + toFileUrl, } from "https://deno.land/std@0.84.0/path/mod.ts"; -export { dirname, join }; +export { dirname, fromFileUrl, join, toFileUrl }; export { existsSync } from "https://deno.land/std@0.84.0/fs/mod.ts"; -export { readLines } from "https://deno.land/std@0.84.0/io/mod.ts"; +export { readLines } from "https://deno.land/std@0.97.0/io/mod.ts"; export { delay } from "https://deno.land/std@0.84.0/async/delay.ts"; export const ROOT_PATH = dirname(dirname(fromFileUrl(import.meta.url))); diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json index b98138b0b..21e11c38e 100644 --- a/tools/wpt/expectation.json +++ b/tools/wpt/expectation.json @@ -634,7 +634,7 @@ "jsapi": { "constructor": { "compile.any.html": true, - "instantiate-bad-imports.any.html": false, + "instantiate-bad-imports.any.html": true, "instantiate.any.html": [ "Synchronous options handling: Buffer argument" ], @@ -653,21 +653,15 @@ "Table interface: operation set(unsigned long, optional any)" ], "instance": { - "constructor-bad-imports.any.html": false, + "constructor-bad-imports.any.html": true, "constructor-caching.any.html": true, "constructor.any.html": true, - "exports.any.html": [ - "Setting (sloppy mode)" - ], + "exports.any.html": true, "toString.any.html": true }, - "interface.any.html": [ - "WebAssembly: property descriptor" - ], + "interface.any.html": true, "memory": { - "buffer.any.html": [ - "Setting (sloppy mode)" - ], + "buffer.any.html": true, "constructor.any.html": true, "grow.any.html": true, "toString.any.html": true, @@ -687,9 +681,7 @@ "constructor.any.html": true, "get-set.any.html": true, "grow.any.html": true, - "length.any.html": [ - "Setting (sloppy mode)" - ], + "length.any.html": true, "toString.any.html": true, "constructor-reftypes.tentative.any.html": [ "initialize externref table with default value", @@ -1217,4 +1209,4 @@ "set.any.html": true } } -} +}
\ No newline at end of file diff --git a/tools/wpt/runner.ts b/tools/wpt/runner.ts index dcc88a123..52768f079 100644 --- a/tools/wpt/runner.ts +++ b/tools/wpt/runner.ts @@ -1,5 +1,5 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. -import { delay, join, readLines, ROOT_PATH } from "../util.js"; +import { delay, join, readLines, ROOT_PATH, toFileUrl } from "../util.js"; import { assert, ManifestTestOptions, release, runPy } from "./utils.ts"; import { DOMParser } from "https://deno.land/x/deno_dom@v0.1.3-alpha2/deno-dom-wasm.ts"; @@ -140,20 +140,32 @@ async function generateBundle(location: URL): Promise<string> { assert(doc, "document should have been parsed"); const scripts = doc.getElementsByTagName("script"); const scriptContents = []; + let inlineScriptCount = 0; for (const script of scripts) { const src = script.getAttribute("src"); if (src === "/resources/testharnessreport.js") { - scriptContents.push( - await Deno.readTextFile( - join(ROOT_PATH, "./tools/wpt/testharnessreport.js"), - ), + const url = toFileUrl( + join(ROOT_PATH, "./tools/wpt/testharnessreport.js"), ); + const contents = await Deno.readTextFile(url); + scriptContents.push([url.href, contents]); } else if (src) { - const res = await fetch(new URL(src, location)); - scriptContents.push(await res.text()); + const url = new URL(src, location); + const res = await fetch(url); + if (res.ok) { + const contents = await res.text(); + scriptContents.push([url.href, contents]); + } } else { - scriptContents.push(script.textContent); + const url = new URL(`#${inlineScriptCount}`, location); + inlineScriptCount++; + scriptContents.push([url.href, script.textContent]); } } - return scriptContents.join("\n"); + + return scriptContents.map(([url, contents]) => + `Deno.core.evalContext(${JSON.stringify(contents)}, ${ + JSON.stringify(url) + });` + ).join("\n"); } |