get-resultingClientId-worker.js (2728B)
1 // This worker expects a fetch event for a navigation and messages back the 2 // result of clients.get(event.resultingClientId). 3 4 // Resolves when the test finishes. 5 let testFinishPromise; 6 let resolveTestFinishPromise; 7 let rejectTestFinishPromise; 8 9 // Resolves to clients.get(event.resultingClientId) from the fetch event. 10 let getPromise; 11 let resolveGetPromise; 12 let rejectGetPromise; 13 14 let resultingClientId; 15 16 function startTest() { 17 testFinishPromise = new Promise((resolve, reject) => { 18 resolveTestFinishPromise = resolve; 19 rejectTestFinishPromise = reject; 20 }); 21 22 getPromise = new Promise((resolve, reject) => { 23 resolveGetPromise = resolve; 24 rejectGetPromise = reject; 25 }); 26 } 27 28 async function describeGetPromiseResult(promise) { 29 const result = {}; 30 31 await promise.then( 32 (client) => { 33 result.promiseState = 'fulfilled'; 34 if (client === undefined) { 35 result.promiseValue = 'undefinedValue'; 36 } else if (client instanceof Client) { 37 result.promiseValue = 'client'; 38 result.client = { 39 id: client.id, 40 url: client.url 41 }; 42 } else { 43 result.promiseValue = 'unknown'; 44 } 45 }, 46 (error) => { 47 result.promiseState = 'rejected'; 48 }); 49 50 return result; 51 } 52 53 async function handleGetResultingClient(event) { 54 // Note that this message can arrive before |resultingClientId| is populated. 55 const result = await describeGetPromiseResult(getPromise); 56 // |resultingClientId| must be populated by now. 57 result.queriedId = resultingClientId; 58 event.source.postMessage(result); 59 }; 60 61 async function handleGetClient(event) { 62 const id = event.data.id; 63 const result = await describeGetPromiseResult(self.clients.get(id)); 64 result.queriedId = id; 65 event.source.postMessage(result); 66 }; 67 68 self.addEventListener('message', (event) => { 69 if (event.data.command == 'startTest') { 70 startTest(); 71 event.waitUntil(testFinishPromise); 72 event.source.postMessage('ok'); 73 return; 74 } 75 76 if (event.data.command == 'finishTest') { 77 resolveTestFinishPromise(); 78 event.source.postMessage('ok'); 79 return; 80 } 81 82 if (event.data.command == 'getResultingClient') { 83 event.waitUntil(handleGetResultingClient(event)); 84 return; 85 } 86 87 if (event.data.command == 'getClient') { 88 event.waitUntil(handleGetClient(event)); 89 return; 90 } 91 }); 92 93 async function handleFetch(event) { 94 try { 95 resultingClientId = event.resultingClientId; 96 const client = await self.clients.get(resultingClientId); 97 resolveGetPromise(client); 98 } catch (error) { 99 rejectGetPromise(error); 100 } 101 } 102 103 self.addEventListener('fetch', (event) => { 104 if (event.request.mode != 'navigate') 105 return; 106 event.waitUntil(handleFetch(event)); 107 });