iframe.html (2104B)
1 <!DOCTYPE html> 2 <script src="/resources/testdriver.js"></script> 3 <script src="/resources/testdriver-vendor.js"></script> 4 <body></body> 5 <script type="module"> 6 // @ts-check 7 /** 8 * @typedef {import('./dc-types').EventData} EventData 9 * @typedef {import('./dc-types').PostData} PostData 10 */ 11 12 /** 13 * @param {MessageEvent<EventData>} event 14 */ 15 async function messageListener(event) { 16 if (!event.data || typeof event.data !== "object") { 17 throw new Error( 18 `Message data must be an object in conforming to EventData (see dc-types.js): ${event.data}` 19 ); 20 } 21 /** @type {EventData} */ 22 const { data } = event; 23 const abortController = new AbortController(); 24 if (data.abort) { 25 if (!data.options) { 26 data.options = {}; 27 } 28 data.options.signal = abortController.signal; 29 } 30 if (data.needsActivation && !navigator.userActivation.isActive) { 31 await test_driver.bless("user activation"); 32 } 33 let result; 34 try { 35 if (data.abort === "before") { 36 abortController.abort(); 37 } 38 let promise; 39 switch (data.action) { 40 case "ping": 41 promise = Promise.resolve("pong"); 42 break; 43 case "create": 44 promise = navigator.credentials.create(data.options); 45 break; 46 case "get": 47 promise = navigator.credentials.get(data.options); 48 break; 49 case "preventSilentAccess": 50 promise = navigator.credentials.preventSilentAccess(); 51 break; 52 default: 53 throw new Error( 54 `Unsupported action in ${window.location}: ${data.action}` 55 ); 56 } 57 if (data.abort === "after") { 58 abortController.abort(); 59 } 60 result = await promise; 61 } catch (error) { 62 result = { 63 constructor: error.constructor.name, 64 name: error.name, 65 message: error.message, 66 }; 67 } finally { 68 event.source?.postMessage(result, event.origin); 69 } 70 } 71 72 test_driver.set_test_context(parent); 73 window.addEventListener("message", messageListener); 74 </script>