diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/web-bundle/resources/test-helpers.js | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
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 | 169 |
1 files changed, 169 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..5c380c88d8 --- /dev/null +++ b/testing/web-platform/tests/web-bundle/resources/test-helpers.js @@ -0,0 +1,169 @@ +// 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); +} + +function changeWebBundleUrlInPlace(element, new_url) { + if (window.TEST_WEB_BUNDLE_ELEMENT_TYPE != 'link') { + throw new Error( + 'Changing the URL of web bundle is not supported for : ' + + window.TEST_WEB_BUNDLE_ELEMENT_TYPE); + } + element.href= new_url; +} + +function changeWebBundleScopesInPlace(element, scopes) { + if (window.TEST_WEB_BUNDLE_ELEMENT_TYPE != 'link') { + throw new Error( + 'Changing the scopes of web bundle is not supported for : ' + + window.TEST_WEB_BUNDLE_ELEMENT_TYPE); + } + element.scopes = ''; + for (const scope of scopes) { + element.scopes.add(scope); + } +} + +function changeWebBundleResourcesInPlace(element, resources) { + if (window.TEST_WEB_BUNDLE_ELEMENT_TYPE != 'link') { + throw new Error( + 'Changing the resources of web bundle is not supported for : ' + + window.TEST_WEB_BUNDLE_ELEMENT_TYPE); + } + element.resources = ''; + for (const url of resources) { + element.resources.add(url); + } +} + +// 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|, in case of <link> API it is all +// relevant attributes: href, resources, scopes and crossOrigin; +// in case of <script> API, it is: 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) { + if (window.TEST_WEB_BUNDLE_ELEMENT_TYPE == 'link') { + if (element.resources && !new_rule.resources) + new_rule.resources = Array.from(element.resources); + if (element.scopes && !new_rule.scopes) + new_rule.scopes = Array.from(element.scopes); + if (element.crossOrigin && !new_rule.crossOrigin) + new_rule.crossOrigin = element.crossOrigin; + if (!new_rule.url) + new_rule.url = element.href; + } else { + 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); +} |