// 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: