| // This worker is designed to expose information about clients that is only available from Service Worker contexts. |
| // |
| // In the case of the `onfetch` handler, it provides the `clientId` property of |
| // the `event` object. In the case of the `onmessage` handler, it provides the |
| // Client instance attributes of the requested clients. |
| self.onfetch = function(e) { |
| if (/\/clientId$/.test(e.request.url)) { |
| e.respondWith(new Response(e.clientId)); |
| return; |
| } |
| }; |
| |
| self.onmessage = function(e) { |
| var client_ids = e.data.clientIds; |
| var message = []; |
| |
| e.waitUntil(Promise.all( |
| client_ids.map(function(client_id) { |
| return self.clients.get(client_id); |
| })) |
| .then(function(clients) { |
| // No matching client for a given id or a matched client is off-origin |
| // from the service worker. |
| if (clients.length == 1 && clients[0] == undefined) { |
| e.source.postMessage(clients[0]); |
| } else { |
| clients.forEach(function(client) { |
| if (client instanceof Client) { |
| message.push([client.visibilityState, |
| client.focused, |
| client.url, |
| client.type, |
| client.frameType]); |
| } else { |
| message.push(client); |
| } |
| }); |
| e.source.postMessage(message); |
| } |
| })); |
| }; |