diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /testing/web-platform/tests/web-bundle/resources/test-helpers.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/web-bundle/resources/test-helpers.js')
-rw-r--r-- | testing/web-platform/tests/web-bundle/resources/test-helpers.js | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/testing/web-platform/tests/web-bundle/resources/test-helpers.js b/testing/web-platform/tests/web-bundle/resources/test-helpers.js new file mode 100644 index 0000000000..27dfb4c0ec --- /dev/null +++ b/testing/web-platform/tests/web-bundle/resources/test-helpers.js @@ -0,0 +1,122 @@ +// Helper functions used in web-bundle tests. + +function addElementAndWaitForLoad(element) { + return new Promise((resolve, reject) => { + element.onload = () => resolve(element); + element.onerror = () => reject(element); + document.body.appendChild(element); + }); +} + +function addElementAndWaitForError(element) { + return new Promise((resolve, reject) => { + element.onload = () => reject(element); + element.onerror = () => resolve(element); + document.body.appendChild(element); + }); +} + +// Evaluates |code| in |iframe|. The following message event handler must be +// registered on the iframe page: +// window.addEventListener( +// 'message', +// (e) => { e.source.postMessage(eval(e.data), e.origin); }); +function evalInIframe(iframe, code) { + const message_promise = new Promise((resolve) => { + window.addEventListener( + 'message', + (e) => { resolve(e.data); }, + { once : true }); + }); + iframe.contentWindow.postMessage(code,'*'); + return message_promise; +} + +function fetchAndWaitForReject(url) { + return new Promise((resolve, reject) => { + fetch(url) + .then(() => { + reject(); + }) + .catch(() => { + resolve(); + }); + }); +} + +function isValidCrossOriginAttribute(crossorigin) { + if (crossorigin === undefined) + return true; + if ((typeof crossorigin) != 'string') + return false; + const lower_crossorigin = crossorigin.toLowerCase(); + return (lower_crossorigin === 'anonymous') || + (lower_crossorigin === 'use-credentials'); +} + +function addScriptAndWaitForError(url) { + return new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.src = url; + script.onload = reject; + script.onerror = resolve; + document.body.appendChild(script); + }); +} + +function addScriptAndWaitForExecution(url) { + return new Promise((resolve, reject) => { + window.scriptLoaded = (val) => { + window.scriptLoaded = undefined; + resolve(val); + }; + const script = document.createElement("script"); + script.src = url; + script.onerror = reject; + document.body.appendChild(script); + }); +} + +function createWebBundleElement(url, resources, options) { + const script = document.createElement("script"); + script.type = "webbundle"; + const json_rule = {"source": url, "resources": resources}; + if (options && options.scopes) { + json_rule.scopes = options.scopes; + } + if (options && options.credentials) { + json_rule.credentials = options.credentials; + } + script.textContent = JSON.stringify(json_rule); + return script; +} + +function addWebBundleElementAndWaitForLoad(url, resources, options) { + const element = createWebBundleElement(url, resources, options); + return addElementAndWaitForLoad(element); +} + +function addWebBundleElementAndWaitForError(url, resources, options) { + const element = createWebBundleElement(url, resources, options); + return addElementAndWaitForError(element); +} + +// This function creates a new WebBundle element that has a rule +// constructed in accordance with a JSON object |new_rule|: +// 1. Copy over WebBundle rules from an existing element that are +// not present in |new_rule|: source, resources, scopes and credentials. +// 2. Then create a new WebBundle element from |new_rule| (that now +// has full information required after 1.) and return it. +function createNewWebBundleElementWithUpdatedRule(element, new_rule) { + const rule = JSON.parse(element.textContent); + if (rule.resources && !new_rule.resources) + new_rule.resources = rule.resources; + if (rule.scopes && !new_rule.scopes) + new_rule.scopes = rule.scopes; + if (rule.credentials && !new_rule.credentials) + new_rule.credentials = rule.credentials; + if (!new_rule.url) + new_rule.url = rule.source; + + return createWebBundleElement(new_rule.url, new_rule.resources, new_rule); +} |