// 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); }