sxg-util.js (3200B)
1 // Opens |url| in an iframe, establish a message channel with it, and waits for 2 // a message from the frame content. Returns a promise that resolves with the 3 // data of the message, or rejects on 15000ms timeout. 4 // If the iframe load is expected to fail, the test should have 5 // <meta name="timeout" content="long"> tag. 6 function openSXGInIframeAndWaitForMessage(test_object, url, referrerPolicy) { 7 return new Promise(async (resolve, reject) => { 8 // We can't catch the network error on iframe. So we use the timer. 9 test_object.step_timeout(() => reject('timeout'), 15000); 10 11 const frame = await withIframe(url, 'sxg_iframe', referrerPolicy); 12 const channel = new MessageChannel(); 13 channel.port1.onmessage = (event) => resolve(event.data); 14 frame.contentWindow.postMessage( 15 {port: channel.port2}, '*', [channel.port2]); 16 }); 17 } 18 19 function withIframe(url, name, referrerPolicy) { 20 return new Promise((resolve, reject) => { 21 const frame = document.createElement('iframe'); 22 frame.src = url; 23 frame.name = name; 24 if (referrerPolicy !== undefined) { 25 frame.referrerPolicy = referrerPolicy; 26 } 27 frame.onload = () => resolve(frame); 28 frame.onerror = () => reject('failed to load ' + url); 29 document.body.appendChild(frame); 30 }); 31 } 32 33 function loadScript(url) { 34 return new Promise((resolve, reject) => { 35 const scriptTag = document.createElement('script'); 36 scriptTag.src = url; 37 scriptTag.onload = () => resolve(); 38 scriptTag.onerror = () => reject('failed to load ' + url); 39 document.head.appendChild(scriptTag); 40 }); 41 } 42 43 function innerURLOrigin() { 44 return 'https://127.0.0.1:8444'; 45 } 46 47 function runReferrerTests(test_cases) { 48 for (const i in test_cases) { 49 const test_case = test_cases[i]; 50 promise_test(async (t) => { 51 const sxgUrl = test_case.origin + '/signed-exchange/resources/sxg/' + 52 test_case.sxg; 53 const message = 54 await openSXGInIframeAndWaitForMessage( 55 t, sxgUrl, test_case.referrerPolicy); 56 assert_false(message.is_fallback); 57 assert_equals(message.referrer, test_case.expectedReferrer); 58 59 const invalidSxgUrl = 60 test_case.origin + '/signed-exchange/resources/sxg/invalid-' + 61 test_case.sxg; 62 const fallbackMessage = 63 await openSXGInIframeAndWaitForMessage( 64 t, invalidSxgUrl, test_case.referrerPolicy); 65 assert_true(fallbackMessage.is_fallback); 66 assert_equals(fallbackMessage.referrer, test_case.expectedReferrer); 67 }, 'Referrer of SignedHTTPExchange test : ' + JSON.stringify(test_case)); 68 } 69 } 70 71 function addPrefetch(url) { 72 const link = document.createElement('link'); 73 link.rel = 'prefetch'; 74 link.href = url; 75 document.body.appendChild(link); 76 } 77 78 async function registerServiceWorkerAndWaitUntilActivated(script, scope) { 79 const reg = await navigator.serviceWorker.register(script, {scope: scope}); 80 if (reg.active) 81 return; 82 const worker = reg.installing || reg.waiting; 83 await new Promise((resolve) => { 84 worker.addEventListener('statechange', (event) => { 85 if (event.target.state == 'activated') 86 resolve(); 87 }); 88 }); 89 }