Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4a7646e1506b0aaef91bd67123e9e426b98c98f0 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js |
@@ -0,0 +1,148 @@ |
+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; |
+} |
+ |
+function get_request_init(base, params) { |
+ var init = {}; |
+ init['method'] = params['method'] || base['method']; |
+ init['mode'] = params['mode'] || base['mode']; |
+ if (init['mode'] == 'navigate') { |
+ init['mode'] = 'same-origin'; |
+ } |
+ init['credentials'] = params['credentials'] || base['credentials']; |
+ init['redirect'] = params['redirect-mode'] || base['redirect']; |
+ return init; |
+} |
+ |
+self.addEventListener('fetch', function(event) { |
+ var params = get_query_params(event.request.url); |
+ var init = get_request_init(event.request, params); |
+ var url = params['url']; |
+ if (params['ignore']) { |
+ return; |
+ } |
+ if (params['throw']) { |
+ throw new Error('boom'); |
+ } |
+ if (params['reject']) { |
+ event.respondWith(new Promise(function(resolve, reject) { |
+ reject(); |
+ })); |
+ return; |
+ } |
+ if (params['resolve-null']) { |
+ event.respondWith(new Promise(function(resolve) { |
+ resolve(null); |
+ })); |
+ return; |
+ } |
+ if (params['generate-png']) { |
+ var binary = atob( |
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAA' + |
+ 'RnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAhSURBVDhPY3wro/Kf' + |
+ 'gQLABKXJBqMGjBoAAqMGDLwBDAwAEsoCTFWunmQAAAAASUVORK5CYII='); |
+ var array = new Uint8Array(binary.length); |
+ for(var i = 0; i < binary.length; i++) { |
+ array[i] = binary.charCodeAt(i); |
+ }; |
+ event.respondWith(new Response(new Blob([array], {type: 'image/png'}))); |
+ return; |
+ } |
+ if (params['check-ua-header']) { |
+ var ua = event.request.headers.get('User-Agent'); |
+ if (ua) { |
+ // We have a user agent! |
+ event.respondWith(new Response(new Blob([ua]))); |
+ } else { |
+ // We don't have a user-agent! |
+ event.respondWith(new Response(new Blob(["NO_UA"]))); |
+ } |
+ return; |
+ } |
+ if (params['check-accept-header']) { |
+ var accept = event.request.headers.get('Accept'); |
+ if (accept) { |
+ event.respondWith(new Response(accept)); |
+ } else { |
+ event.respondWith(new Response('NO_ACCEPT')); |
+ } |
+ } |
+ event.respondWith(new Promise(function(resolve, reject) { |
+ var request = event.request; |
+ if (url) { |
+ request = new Request(url, init); |
+ } |
+ fetch(request).then(function(response) { |
+ var expectedType = params['expected_type']; |
+ if (expectedType && response.type !== expectedType) { |
+ // Resolve a JSON object with a failure instead of rejecting |
+ // in order to distinguish this from a NetworkError, which |
+ // may be expected even if the type is correct. |
+ resolve(new Response(JSON.stringify({ |
+ result: 'failure', |
+ detail: 'got ' + response.type + ' Response.type instead of ' + |
+ expectedType |
+ }))); |
+ } |
+ |
+ var expectedRedirected = params['expected_redirected']; |
+ if (typeof expectedRedirected !== 'undefined') { |
+ var expected_redirected = (expectedRedirected === 'true'); |
+ if(response.redirected !== expected_redirected) { |
+ // This is simply determining how to pass an error to the outer |
+ // test case(fetch-request-redirect.https.html). |
+ var execptedResolves = params['expected_resolves']; |
+ if (execptedResolves === 'true') { |
+ // Reject a JSON object with a failure since promise is expected |
+ // to be resolved. |
+ reject(new Response(JSON.stringify({ |
+ result: 'failure', |
+ detail: 'got '+ response.redirected + |
+ ' Response.redirected instead of ' + |
+ expectedRedirected |
+ }))); |
+ } else { |
+ // Resolve a JSON object with a failure since promise is |
+ // expected to be rejected. |
+ resolve(new Response(JSON.stringify({ |
+ result: 'failure', |
+ detail: 'got '+ response.redirected + |
+ ' Response.redirected instead of ' + |
+ expectedRedirected |
+ }))); |
+ } |
+ } |
+ } |
+ |
+ if (params['cache']) { |
+ var cacheName = "cached-fetches-" + performance.now() + "-" + |
+ event.request.url; |
+ var cache; |
+ var cachedResponse; |
+ return self.caches.open(cacheName).then(function(opened) { |
+ cache = opened; |
+ return cache.put(request, response); |
+ }).then(function() { |
+ return cache.match(request); |
+ }).then(function(cached) { |
+ cachedResponse = cached; |
+ return self.caches.delete(cacheName); |
+ }).then(function() { |
+ resolve(cachedResponse); |
+ }); |
+ } else { |
+ resolve(response); |
+ } |
+ }, reject) |
+ })); |
+ }); |