| importScripts('/resources/testharness.js'); |
| |
| function matchQuery(queryString) { |
| return self.location.search.substr(1) === queryString; |
| } |
| |
| async function navigateTest(t, e) { |
| const port = e.data.port; |
| const url = e.data.url; |
| const expected = e.data.expected; |
| |
| let p = clients.matchAll({ includeUncontrolled : true }) |
| .then(function(clients) { |
| for (const client of clients) { |
| if (client.url === e.data.clientUrl) { |
| assert_equals(client.frameType, e.data.frameType); |
| return client.navigate(url); |
| } |
| } |
| throw 'Could not locate window client.'; |
| }).then(function(newClient) { |
| // If we didn't reject, we better get resolved with the right thing. |
| if (newClient === null) { |
| assert_equals(newClient, expected); |
| } else { |
| assert_equals(newClient.url, expected); |
| } |
| }); |
| |
| if (typeof self[expected] === "function") { |
| // It's a JS error type name. We are expecting our promise to be rejected |
| // with that error. |
| p = promise_rejects_js(t, self[expected], p); |
| } |
| |
| // Let our caller know we are done. |
| return p.finally(() => port.postMessage(null)); |
| } |
| |
| function getTestClient() { |
| return clients.matchAll({ includeUncontrolled: true }) |
| .then(function(clients) { |
| for (const client of clients) { |
| if (client.url.includes('windowclient-navigate.https.html')) { |
| return client; |
| } |
| } |
| |
| throw new Error('Service worker was unable to locate test client.'); |
| }); |
| } |
| |
| function waitForMessage(client) { |
| const channel = new MessageChannel(); |
| client.postMessage({ port: channel.port2 }, [channel.port2]); |
| |
| return new Promise(function(resolve) { |
| channel.port1.onmessage = resolve; |
| }); |
| } |
| |
| // The worker must remain in the "installing" state for the duration of some |
| // sub-tests. In order to achieve this coordination without relying on global |
| // state, the worker must create a message channel with the client from within |
| // the "install" event handler. |
| if (matchQuery('installing')) { |
| self.addEventListener('install', function(e) { |
| e.waitUntil(getTestClient().then(waitForMessage)); |
| }); |
| } |
| |
| self.addEventListener('message', function(e) { |
| e.waitUntil(promise_test(t => navigateTest(t, e), |
| e.data.description + " worker side")); |
| }); |