// 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 addLinkAndWaitForLoad(url, resources, crossorigin) { return new Promise((resolve, reject) => { if (!isValidCrossOriginAttribute(crossorigin)) { reject('invalid crossorigin attribute: ' + crossorigin); return; } const link = document.createElement("link"); link.rel = "webbundle"; link.href = url; if (crossorigin) { link.crossOrigin = crossorigin; } for (const resource of resources) { link.resources.add(resource); } link.onload = () => resolve(link); link.onerror = () => reject(link); document.body.appendChild(link); }); } function addLinkAndWaitForError(url, resources, crossorigin) { return new Promise((resolve, reject) => { if (!isValidCrossOriginAttribute(crossorigin)) { reject('invalid crossorigin attribute: ' + crossorigin); return; } const link = document.createElement("link"); link.rel = "webbundle"; link.href = url; if (crossorigin) { link.crossOrigin = crossorigin; } for (const resource of resources) { link.resources.add(resource); } link.onload = () => reject(link); link.onerror = () => resolve(link); document.body.appendChild(link); }); } 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); }); } // Currnetly Chrome supports two element types for Subresource Web Bundles // feature, and