helper.js (2947B)
1 export function documentHasCookie(cookieAndValue) { 2 return document.cookie.split(';').some(item => item.includes(cookieAndValue)); 3 } 4 5 export async function waitForCookie(cookieAndValue, expectCookie) { 6 const startTime = Date.now(); 7 const hasCookie = await new Promise(resolve => { 8 const interval = setInterval(() => { 9 if (documentHasCookie(cookieAndValue)) { 10 clearInterval(interval); 11 resolve(true); 12 } 13 if (!expectCookie && Date.now() - startTime >= 1000) { 14 clearInterval(interval); 15 resolve(false); 16 } 17 }, 100); 18 }); 19 assert_equals(hasCookie, expectCookie); 20 } 21 22 export function expireCookie(cookieAndAttributes) { 23 document.cookie = 24 `${cookieAndAttributes}; expires=Thu, 01 Jan 1970 00:00:00 UTC;`; 25 } 26 27 export function addCookieAndSessionCleanup(test) { 28 // Clean up any set cookies once the test completes. 29 test.add_cleanup(async () => { 30 const response = await fetch('end_session_via_clear_site_data.py'); 31 assert_equals(response.status, 200); 32 }); 33 } 34 35 export async function postJson(url, obj) { 36 return await fetch(url, { 37 method: 'POST', 38 headers: {'Content-Type': 'application/json'}, 39 body: JSON.stringify(obj), 40 }); 41 } 42 43 export async function configureServer(obj) { 44 const response = await fetch('configure_server.py', { 45 method: 'POST', 46 headers: {'Content-Type': 'application/json'}, 47 body: JSON.stringify(obj), 48 }); 49 assert_equals(response.status, 200); 50 } 51 52 export async function setupShardedServerState(obj) { 53 if (obj === undefined) { 54 obj = {}; 55 } 56 const response = await fetch('setup_sharded_server_state.py', { 57 method: 'POST', 58 headers: {'Content-Type': 'application/json'}, 59 body: JSON.stringify(obj), 60 }); 61 assert_equals(response.status, 200); 62 const testIdCookie = 63 document.cookie.split(';').filter(item => item.includes('test_id'))[0]; 64 return testIdCookie.split('=')[1]; 65 } 66 67 export async function pullServerState() { 68 const response = await fetch('pull_server_state.py'); 69 assert_equals(response.status, 200); 70 return await response.json(); 71 } 72 73 // Create an iframe that fetches URLs on demand via postMessage. 74 export async function crossSiteFetch(fromSite, url, fetchParams) { 75 const frame = document.createElement('iframe'); 76 const frameLoadPromise = new Promise((resolve, reject) => { 77 frame.onload = resolve; 78 frame.onerror = reject; 79 }); 80 frame.src = fromSite + "/device-bound-session-credentials/url_fetcher.html"; 81 document.body.appendChild(frame); 82 await frameLoadPromise; 83 84 const fetchStatusPromise = new Promise((resolve) => { 85 const listener = (event) => { 86 window.removeEventListener("message", listener); 87 resolve(event.data); 88 }; 89 window.addEventListener("message", listener); 90 }); 91 frame.contentWindow.postMessage({url, fetchParams}, "*"); 92 93 const fetchStatus = await fetchStatusPromise; 94 document.body.removeChild(frame); 95 96 return fetchStatus; 97 }