OLD | NEW |
(Empty) | |
| 1 function get_query_params(url) { |
| 2 var search = (new URL(url)).search; |
| 3 if (!search) { |
| 4 return {}; |
| 5 } |
| 6 var ret = {}; |
| 7 var params = search.substring(1).split('&'); |
| 8 params.forEach(function(param) { |
| 9 var element = param.split('='); |
| 10 ret[decodeURIComponent(element[0])] = decodeURIComponent(element[1]); |
| 11 }); |
| 12 return ret; |
| 13 } |
| 14 |
| 15 function get_request_init(base, params) { |
| 16 var init = {}; |
| 17 init['method'] = params['method'] || base['method']; |
| 18 init['mode'] = params['mode'] || base['mode']; |
| 19 if (init['mode'] == 'navigate') { |
| 20 init['mode'] = 'same-origin'; |
| 21 } |
| 22 init['credentials'] = params['credentials'] || base['credentials']; |
| 23 init['redirect'] = params['redirect-mode'] || base['redirect']; |
| 24 return init; |
| 25 } |
| 26 |
| 27 self.addEventListener('fetch', function(event) { |
| 28 var params = get_query_params(event.request.url); |
| 29 var init = get_request_init(event.request, params); |
| 30 var url = params['url']; |
| 31 if (params['ignore']) { |
| 32 return; |
| 33 } |
| 34 if (params['throw']) { |
| 35 throw new Error('boom'); |
| 36 } |
| 37 if (params['reject']) { |
| 38 event.respondWith(new Promise(function(resolve, reject) { |
| 39 reject(); |
| 40 })); |
| 41 return; |
| 42 } |
| 43 if (params['resolve-null']) { |
| 44 event.respondWith(new Promise(function(resolve) { |
| 45 resolve(null); |
| 46 })); |
| 47 return; |
| 48 } |
| 49 if (params['generate-png']) { |
| 50 var binary = atob( |
| 51 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAA' + |
| 52 'RnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAhSURBVDhPY3wro/Kf' + |
| 53 'gQLABKXJBqMGjBoAAqMGDLwBDAwAEsoCTFWunmQAAAAASUVORK5CYII='); |
| 54 var array = new Uint8Array(binary.length); |
| 55 for(var i = 0; i < binary.length; i++) { |
| 56 array[i] = binary.charCodeAt(i); |
| 57 }; |
| 58 event.respondWith(new Response(new Blob([array], {type: 'image/png'}))); |
| 59 return; |
| 60 } |
| 61 if (params['check-ua-header']) { |
| 62 var ua = event.request.headers.get('User-Agent'); |
| 63 if (ua) { |
| 64 // We have a user agent! |
| 65 event.respondWith(new Response(new Blob([ua]))); |
| 66 } else { |
| 67 // We don't have a user-agent! |
| 68 event.respondWith(new Response(new Blob(["NO_UA"]))); |
| 69 } |
| 70 return; |
| 71 } |
| 72 if (params['check-accept-header']) { |
| 73 var accept = event.request.headers.get('Accept'); |
| 74 if (accept) { |
| 75 event.respondWith(new Response(accept)); |
| 76 } else { |
| 77 event.respondWith(new Response('NO_ACCEPT')); |
| 78 } |
| 79 } |
| 80 event.respondWith(new Promise(function(resolve, reject) { |
| 81 var request = event.request; |
| 82 if (url) { |
| 83 request = new Request(url, init); |
| 84 } |
| 85 fetch(request).then(function(response) { |
| 86 var expectedType = params['expected_type']; |
| 87 if (expectedType && response.type !== expectedType) { |
| 88 // Resolve a JSON object with a failure instead of rejecting |
| 89 // in order to distinguish this from a NetworkError, which |
| 90 // may be expected even if the type is correct. |
| 91 resolve(new Response(JSON.stringify({ |
| 92 result: 'failure', |
| 93 detail: 'got ' + response.type + ' Response.type instead of ' + |
| 94 expectedType |
| 95 }))); |
| 96 } |
| 97 |
| 98 var expectedRedirected = params['expected_redirected']; |
| 99 if (typeof expectedRedirected !== 'undefined') { |
| 100 var expected_redirected = (expectedRedirected === 'true'); |
| 101 if(response.redirected !== expected_redirected) { |
| 102 // This is simply determining how to pass an error to the outer |
| 103 // test case(fetch-request-redirect.https.html). |
| 104 var execptedResolves = params['expected_resolves']; |
| 105 if (execptedResolves === 'true') { |
| 106 // Reject a JSON object with a failure since promise is expected |
| 107 // to be resolved. |
| 108 reject(new Response(JSON.stringify({ |
| 109 result: 'failure', |
| 110 detail: 'got '+ response.redirected + |
| 111 ' Response.redirected instead of ' + |
| 112 expectedRedirected |
| 113 }))); |
| 114 } else { |
| 115 // Resolve a JSON object with a failure since promise is |
| 116 // expected to be rejected. |
| 117 resolve(new Response(JSON.stringify({ |
| 118 result: 'failure', |
| 119 detail: 'got '+ response.redirected + |
| 120 ' Response.redirected instead of ' + |
| 121 expectedRedirected |
| 122 }))); |
| 123 } |
| 124 } |
| 125 } |
| 126 |
| 127 if (params['cache']) { |
| 128 var cacheName = "cached-fetches-" + performance.now() + "-" + |
| 129 event.request.url; |
| 130 var cache; |
| 131 var cachedResponse; |
| 132 return self.caches.open(cacheName).then(function(opened) { |
| 133 cache = opened; |
| 134 return cache.put(request, response); |
| 135 }).then(function() { |
| 136 return cache.match(request); |
| 137 }).then(function(cached) { |
| 138 cachedResponse = cached; |
| 139 return self.caches.delete(cacheName); |
| 140 }).then(function() { |
| 141 resolve(cachedResponse); |
| 142 }); |
| 143 } else { |
| 144 resolve(response); |
| 145 } |
| 146 }, reject) |
| 147 })); |
| 148 }); |
OLD | NEW |