helpers.js (2513B)
1 /** 2 * Promise based helper function who's return promise will resolve 3 * once the iframe src has been loaded 4 * @param {string} url the url to set the iframe src 5 * @param {test} t a test object to add a cleanup function to 6 * @return {Promise} when resolved, will return the iframe 7 */ 8 self.createIframe = (url, t) => new Promise(resolve => { 9 const iframe = document.createElement('iframe'); 10 iframe.addEventListener('load', () => {resolve(iframe);}, {once: true}); 11 iframe.src = url; 12 document.documentElement.appendChild(iframe); 13 t.add_cleanup(() => iframe.remove()); 14 }); 15 16 /** 17 * @description - Function unregisters any service workers in this scope 18 * and then creates a new registration. The function returns 19 * a promise that resolves when the registered service worker 20 * becomes activated. The resolved promise yields the 21 * service worker registration 22 * @param {testCase} t - test case to add cleanup functions to 23 */ 24 self.createServiceWorker = async (t, sw_registration_name, scope_url) => { 25 let registration = await navigator.serviceWorker.getRegistration(scope_url); 26 if (registration) 27 await registration.unregister(); 28 29 registration = await navigator.serviceWorker.register(sw_registration_name, 30 {scope_url}); 31 t.add_cleanup(() => registration.unregister()); 32 33 return new Promise(resolve => { 34 const serviceWorker = registration.installing || registration.active || 35 registration.waiting; 36 serviceWorker.addEventListener('statechange', event => { 37 if (event.target.state === 'activated') { 38 resolve(serviceWorker); 39 } 40 }); 41 }) 42 } 43 44 /** 45 * Function that will return a promise that resolves when a message event 46 * is fired. Returns a promise that resolves to the message that was received 47 */ 48 self.waitForMessage = () => new Promise(resolve => { 49 window.addEventListener('message', event => { 50 resolve(event.data); 51 }, {once: true}); 52 }); 53 54 /** 55 * Sends a message via MessageChannel and waits for the response 56 * @param {*} message 57 * @returns {Promise} resolves with the response payload 58 */ 59 self.sendMessageOverChannel = (message, target) => { 60 return new Promise(function(resolve, reject) { 61 const messageChannel = new MessageChannel(); 62 messageChannel.port1.onmessage = event => { 63 if (event.data.error) { 64 reject(event.data.error); 65 } else { 66 resolve(event.data); 67 } 68 }; 69 70 target.postMessage(message, [messageChannel.port2]); 71 }) 72 };