| let savedPort = null; |
| let savedResultingClientId = null; |
| |
| async function getTestingPage() { |
| const clientList = await self.clients.matchAll({ type: 'window', includeUncontrolled: true }); |
| for (let c of clientList) { |
| if (c.url.endsWith('clients-get.https.html')) { |
| c.focus(); |
| return c; |
| } |
| } |
| return null; |
| } |
| |
| async function destroyResultingClient(testingPage) { |
| const destroyedPromise = new Promise(resolve => { |
| self.addEventListener('message', e => { |
| if (e.data.msg == 'resultingClientDestroyed') { |
| resolve(); |
| } |
| }, {once: true}); |
| }); |
| testingPage.postMessage({ msg: 'destroyResultingClient' }); |
| return destroyedPromise; |
| } |
| |
| self.addEventListener('fetch', async (e) => { |
| let { resultingClientId } = e; |
| savedResultingClientId = resultingClientId; |
| |
| if (e.request.url.endsWith('simple.html?fail')) { |
| e.waitUntil((async () => { |
| const testingPage = await getTestingPage(); |
| await destroyResultingClient(testingPage); |
| testingPage.postMessage({ msg: 'resultingClientDestroyedAck', |
| resultingDestroyedClientId: savedResultingClientId }); |
| })()); |
| return; |
| } |
| |
| e.respondWith(fetch(e.request)); |
| }); |
| |
| self.addEventListener('message', (e) => { |
| let { msg, resultingClientId } = e.data; |
| e.waitUntil((async () => { |
| if (msg == 'getIsResultingClientUndefined') { |
| const client = await self.clients.get(resultingClientId); |
| let isUndefined = typeof client == 'undefined'; |
| e.source.postMessage({ msg: 'getIsResultingClientUndefined', |
| isResultingClientUndefined: isUndefined }); |
| return; |
| } |
| if (msg == 'getResultingClientId') { |
| e.source.postMessage({ msg: 'getResultingClientId', |
| resultingClientId: savedResultingClientId }); |
| return; |
| } |
| })()); |
| }); |