embedded_responder.js (3446B)
1 "use strict"; 2 3 test_driver.set_test_context(window.top); 4 5 let worker; 6 7 function waitForWorkerMessage(worker) { 8 return new Promise(resolve => { 9 const listener = (event) => { 10 worker.removeEventListener("message", listener); 11 resolve(event.data); 12 }; 13 worker.addEventListener("message", listener); 14 }); 15 } 16 17 function connectAndGetRequestCookiesFrom(origin) { 18 return new Promise((resolve, reject) => { 19 const ws = new WebSocket(origin +'/echo-cookie'); 20 ws.onmessage = event => { 21 const cookies = event.data; 22 resolve(cookies); 23 ws.onerror = undefined; 24 ws.onclose = undefined; 25 }; 26 ws.onerror = () => reject(new Error('Unexpected error event')); 27 ws.onclose = evt => reject('Unexpected close event: ' + JSON.stringify(evt)); 28 }); 29 } 30 31 window.addEventListener("message", async (event) => { 32 function reply(data) { 33 event.source.postMessage( 34 {timestamp: event.data.timestamp, data}, "*"); 35 } 36 37 switch (event.data["command"]) { 38 case "hasStorageAccess": 39 reply(await document.hasStorageAccess()); 40 break; 41 case "requestStorageAccess": { 42 const obtainedAccess = await document.requestStorageAccess() 43 .then(() => true, () => false); 44 reply(obtainedAccess); 45 } 46 break; 47 case "write document.cookie": 48 document.cookie = event.data.cookie; 49 reply(undefined); 50 break; 51 case "document.cookie": 52 reply(document.cookie); 53 break; 54 case "set_permission": 55 await test_driver.set_permission(...event.data.args); 56 reply(undefined); 57 break; 58 case "get_permission": { 59 const status = await navigator.permissions.query({name: "storage-access"}); 60 reply(status.state); 61 break; 62 } 63 case "observe_permission_change": { 64 const status = await navigator.permissions.query({name: "storage-access"}); 65 status.addEventListener("change", (event) => { 66 parent.postMessage({ 67 tag: 'observed_permission_change', 68 state: event.target.state, 69 }, '*'); 70 }, { once: true }); 71 reply('permission_change_observer_installed'); 72 break; 73 } 74 case "reload": 75 window.location.reload(); 76 break; 77 case "navigate": 78 window.location.href = event.data.url; 79 break; 80 case "httpCookies": 81 // The `httpCookies` variable is defined/set by 82 // script-with-cookie-header.py. 83 reply(httpCookies); 84 break; 85 case "cors fetch": 86 reply(await fetch(event.data.url, {mode: 'cors', credentials: 'include'}).then((resp) => resp.text())); 87 break; 88 case "no-cors fetch": { 89 const resp = await fetch(event.data.url, {mode: 'no-cors', credentials: 'include'}); 90 await resp.text(); 91 reply(undefined); 92 break; 93 } 94 case "start_dedicated_worker": 95 worker = new Worker("embedded_worker.py"); 96 reply(undefined); 97 break; 98 case "message_worker": { 99 const p = waitForWorkerMessage(worker); 100 worker.postMessage(event.data.message); 101 reply(await p.then(resp => resp.data)) 102 break; 103 } 104 case "get_cookie_via_websocket":{ 105 reply(await connectAndGetRequestCookiesFrom(event.data.origin)); 106 break; 107 } 108 default: 109 } 110 }); 111 112 // The document that loads this script will define `should_ack_load` based on 113 // the query parameters it received from the test. 114 if (should_ack_load) { 115 parent.postMessage('loaded', '*'); 116 }