summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/web-bundle/resources/test-helpers.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /testing/web-platform/tests/web-bundle/resources/test-helpers.js
parentInitial commit. (diff)
downloadfirefox-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.js122
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);
+}