Chromium Code Reviews| Index: third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js |
| diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..571682f47e2ac12ef9ad0516c348570a4df818b7 |
| --- /dev/null |
| +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js |
| @@ -0,0 +1,68 @@ |
| +function match_query(query_string) { |
| + return self.location.search.substr(1) == query_string; |
| +} |
| + |
| +function navigate_test(e) { |
| + var port = e.data.port; |
| + var url = e.data.url; |
| + |
| + return clients.matchAll({ includeUncontrolled : true }) |
| + .then(function(client_list) { |
| + for (var i = 0; i < client_list.length; i++) { |
| + var client = client_list[i]; |
| + if (client.frameType == 'nested') { |
| + return client.navigate(url); |
| + } |
| + } |
| + port.postMessage('Could not locate window client.'); |
| + }) |
| + .then(function(new_client) { |
| + if (new_client === null) |
| + port.postMessage(new_client); |
| + else |
| + port.postMessage(new_client.url); |
| + }) |
| + .catch(function(error) { |
| + port.postMessage(error.name); |
| + }); |
| +} |
| + |
| +function getTestClient() { |
| + return clients.matchAll({ includeUncontrolled: true }) |
| + .then(function(client_list) { |
| + var client, idx; |
|
falken
2017/05/29 04:54:08
nit: idx -> i for consistency with above
mike3
2017/05/29 17:00:49
Done.
|
| + |
| + for (idx = 0; idx < client_list.length; ++idx) { |
|
falken
2017/05/29 04:54:08
nit: ++idx -> i++ for consistency with above
mike3
2017/05/29 17:00:50
Done.
|
| + client = client_list[idx]; |
| + |
| + if (/windowclient-navigate\.https\.html/.test(client.url)) { |
| + return client; |
| + } |
| + } |
| + |
| + throw new Error('Service worker was unable to locate test client.'); |
| + }); |
| +} |
| + |
| +function waitForMessage(client) { |
| + var 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 (match_query('installing')) { |
| + self.addEventListener('install', function(e) { |
| + e.waitUntil(getTestClient().then(waitForMessage)); |
| + }); |
| +} |
| + |
| +self.addEventListener('message', function(e) { |
| + e.waitUntil(navigate_test(e)); |
| + }); |