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..8c2c2c66d758dc8bb726c9b0f73cec5fbc3fe6e9 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/windowclient-navigate-worker.js |
@@ -0,0 +1,66 @@ |
+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) { |
+ for (var i = 0; i < client_list.length; i++) { |
+ var client = client_list[i]; |
+ |
+ 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)); |
+ }); |