mirror of
https://github.com/servo/servo.git
synced 2025-10-09 04:59:23 +01:00
61 lines
2.5 KiB
JavaScript
61 lines
2.5 KiB
JavaScript
// TODO: it would be nice to support `idl_array.add_objects`
|
|
function fetch_text(url) {
|
|
return fetch(url).then(function (r) {
|
|
if (!r.ok) {
|
|
throw new Error("Error fetching " + url + ".");
|
|
}
|
|
return r.text();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* idl_test_shadowrealm is a promise_test wrapper that handles the fetching of the IDL, and
|
|
* running the code in a `ShadowRealm`, avoiding repetitive boilerplate.
|
|
*
|
|
* @see https://github.com/tc39/proposal-shadowrealm
|
|
* @param {String[]} srcs Spec name(s) for source idl files (fetched from
|
|
* /interfaces/{name}.idl).
|
|
* @param {String[]} deps Spec name(s) for dependency idl files (fetched
|
|
* from /interfaces/{name}.idl). Order is important - dependencies from
|
|
* each source will only be included if they're already know to be a
|
|
* dependency (i.e. have already been seen).
|
|
*/
|
|
function idl_test_shadowrealm(srcs, deps) {
|
|
promise_setup(async t => {
|
|
const realm = new ShadowRealm();
|
|
// https://github.com/web-platform-tests/wpt/issues/31996
|
|
realm.evaluate("globalThis.self = globalThis; undefined;");
|
|
|
|
realm.evaluate(`
|
|
globalThis.self.GLOBAL = {
|
|
isWindow: function() { return false; },
|
|
isWorker: function() { return false; },
|
|
isShadowRealm: function() { return true; },
|
|
}; undefined;
|
|
`);
|
|
const specs = await Promise.all(srcs.concat(deps).map(spec => {
|
|
return fetch_text("/interfaces/" + spec + ".idl");
|
|
}));
|
|
const idls = JSON.stringify(specs);
|
|
await new Promise(
|
|
realm.evaluate(`(resolve,reject) => {
|
|
(async () => {
|
|
await import("/resources/testharness.js");
|
|
await import("/resources/WebIDLParser.js");
|
|
await import("/resources/idlharness.js");
|
|
const idls = ${idls};
|
|
const idl_array = new IdlArray();
|
|
for (let i = 0; i < ${srcs.length}; i++) {
|
|
idl_array.add_idls(idls[i]);
|
|
}
|
|
for (let i = ${srcs.length}; i < ${srcs.length + deps.length}; i++) {
|
|
idl_array.add_dependency_idls(idls[i]);
|
|
}
|
|
idl_array.test();
|
|
})().then(resolve, (e) => reject(e.toString()));
|
|
}`)
|
|
);
|
|
await fetch_tests_from_shadow_realm(realm);
|
|
});
|
|
}
|
|
// vim: set expandtab shiftwidth=4 tabstop=4 foldmarker=@{,@} foldmethod=marker:
|