Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/navigation-redirect-worker.js |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/navigation-redirect-worker.js b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/navigation-redirect-worker.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cb15b3ff113fbc0790aed7a16632ec611c9aa359 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/navigation-redirect-worker.js |
@@ -0,0 +1,75 @@ |
+// We store an empty response for each fetch event request we see |
+// in this Cache object so we can get the list of urls in the |
+// message event. |
+var cacheName = 'urls-' + self.registration.scope; |
+ |
+var waitUntilPromiseList = []; |
+ |
+self.addEventListener('message', function(event) { |
+ var urls; |
+ event.waitUntil(Promise.all(waitUntilPromiseList).then(function() { |
+ waitUntilPromiseList = []; |
+ return caches.open(cacheName); |
+ }).then(function(cache) { |
+ return cache.keys(); |
+ }).then(function(requestList) { |
+ urls = requestList.map(function(request) { return request.url; }); |
+ return caches.delete(cacheName); |
+ }).then(function() { |
+ event.data.port.postMessage({urls: urls}); |
+ })); |
+ }); |
+ |
+function get_query_params(url) { |
+ var search = (new URL(url)).search; |
+ if (!search) { |
+ return {}; |
+ } |
+ var ret = {}; |
+ var params = search.substring(1).split('&'); |
+ params.forEach(function(param) { |
+ var element = param.split('='); |
+ ret[decodeURIComponent(element[0])] = decodeURIComponent(element[1]); |
+ }); |
+ return ret; |
+} |
+ |
+self.addEventListener('fetch', function(event) { |
+ var waitUntilPromise = caches.open(cacheName).then(function(cache) { |
+ return cache.put(event.request, new Response()); |
+ }); |
+ event.waitUntil(waitUntilPromise); |
+ |
+ var params = get_query_params(event.request.url); |
+ if (!params['sw']) { |
+ // To avoid races, add the waitUntil() promise to our global list. |
+ // If we get a message event before we finish here, it will wait |
+ // these promises to complete before proceeding to read from the |
+ // cache. |
+ waitUntilPromiseList.push(waitUntilPromise); |
+ return; |
+ } |
+ |
+ event.respondWith(waitUntilPromise.then(function() { |
+ if (params['sw'] == 'gen') { |
+ return Response.redirect(params['url']); |
+ } else if (params['sw'] == 'fetch') { |
+ return fetch(event.request); |
+ } else if (params['sw'] == 'opaque') { |
+ return fetch(new Request(event.request.url, {redirect: 'manual'})); |
+ } else if (params['sw'] == 'opaqueThroughCache') { |
+ var url = event.request.url; |
+ var cache; |
+ return caches.delete(url) |
+ .then(function() { return self.caches.open(url); }) |
+ .then(function(c) { |
+ cache = c; |
+ return fetch(new Request(url, {redirect: 'manual'})); |
+ }) |
+ .then(function(res) { return cache.put(event.request, res); }) |
+ .then(function() { return cache.match(url); }); |
+ } |
+ |
+ // unexpected... trigger an interception failure |
+ })); |
+ }); |