test-helpers.js (3866B)
1 // Helper functions used in web-bundle tests. 2 3 function addElementAndWaitForLoad(element) { 4 return new Promise((resolve, reject) => { 5 element.onload = () => resolve(element); 6 element.onerror = () => reject(element); 7 document.body.appendChild(element); 8 }); 9 } 10 11 function addElementAndWaitForError(element) { 12 return new Promise((resolve, reject) => { 13 element.onload = () => reject(element); 14 element.onerror = () => resolve(element); 15 document.body.appendChild(element); 16 }); 17 } 18 19 // Evaluates |code| in |iframe|. The following message event handler must be 20 // registered on the iframe page: 21 // window.addEventListener( 22 // 'message', 23 // (e) => { e.source.postMessage(eval(e.data), e.origin); }); 24 function evalInIframe(iframe, code) { 25 const message_promise = new Promise((resolve) => { 26 window.addEventListener( 27 'message', 28 (e) => { resolve(e.data); }, 29 { once : true }); 30 }); 31 iframe.contentWindow.postMessage(code,'*'); 32 return message_promise; 33 } 34 35 function fetchAndWaitForReject(url) { 36 return new Promise((resolve, reject) => { 37 fetch(url) 38 .then(() => { 39 reject(); 40 }) 41 .catch(() => { 42 resolve(); 43 }); 44 }); 45 } 46 47 function isValidCrossOriginAttribute(crossorigin) { 48 if (crossorigin === undefined) 49 return true; 50 if ((typeof crossorigin) != 'string') 51 return false; 52 const lower_crossorigin = crossorigin.toLowerCase(); 53 return (lower_crossorigin === 'anonymous') || 54 (lower_crossorigin === 'use-credentials'); 55 } 56 57 function addScriptAndWaitForError(url) { 58 return new Promise((resolve, reject) => { 59 const script = document.createElement("script"); 60 script.src = url; 61 script.onload = reject; 62 script.onerror = resolve; 63 document.body.appendChild(script); 64 }); 65 } 66 67 function addScriptAndWaitForExecution(url) { 68 return new Promise((resolve, reject) => { 69 window.scriptLoaded = (val) => { 70 window.scriptLoaded = undefined; 71 resolve(val); 72 }; 73 const script = document.createElement("script"); 74 script.src = url; 75 script.onerror = reject; 76 document.body.appendChild(script); 77 }); 78 } 79 80 function createWebBundleElement(url, resources, options) { 81 const script = document.createElement("script"); 82 script.type = "webbundle"; 83 const json_rule = {"source": url, "resources": resources}; 84 if (options && options.scopes) { 85 json_rule.scopes = options.scopes; 86 } 87 if (options && options.credentials) { 88 json_rule.credentials = options.credentials; 89 } 90 script.textContent = JSON.stringify(json_rule); 91 return script; 92 } 93 94 function addWebBundleElementAndWaitForLoad(url, resources, options) { 95 const element = createWebBundleElement(url, resources, options); 96 return addElementAndWaitForLoad(element); 97 } 98 99 function addWebBundleElementAndWaitForError(url, resources, options) { 100 const element = createWebBundleElement(url, resources, options); 101 return addElementAndWaitForError(element); 102 } 103 104 // This function creates a new WebBundle element that has a rule 105 // constructed in accordance with a JSON object |new_rule|: 106 // 1. Copy over WebBundle rules from an existing element that are 107 // not present in |new_rule|: source, resources, scopes and credentials. 108 // 2. Then create a new WebBundle element from |new_rule| (that now 109 // has full information required after 1.) and return it. 110 function createNewWebBundleElementWithUpdatedRule(element, new_rule) { 111 const rule = JSON.parse(element.textContent); 112 if (rule.resources && !new_rule.resources) 113 new_rule.resources = rule.resources; 114 if (rule.scopes && !new_rule.scopes) 115 new_rule.scopes = rule.scopes; 116 if (rule.credentials && !new_rule.credentials) 117 new_rule.credentials = rule.credentials; 118 if (!new_rule.url) 119 new_rule.url = rule.source; 120 121 return createWebBundleElement(new_rule.url, new_rule.resources, new_rule); 122 }