OLD | NEW |
(Empty) | |
| 1 var port = undefined; |
| 2 var isTestTargetFetch = false; |
| 3 |
| 4 self.onmessage = function(e) { |
| 5 var message = e.data; |
| 6 if ('port' in message) { |
| 7 port = message.port; |
| 8 } else if (message.msg === 'START TEST CASE') { |
| 9 isTestTargetFetch = true; |
| 10 port.postMessage({msg: 'READY'}); |
| 11 } |
| 12 }; |
| 13 |
| 14 function getQueryParams(url) { |
| 15 var search = (new URL(url)).search; |
| 16 if (!search) { |
| 17 return {}; |
| 18 } |
| 19 var ret = {}; |
| 20 var params = search.substring(1).split('&'); |
| 21 params.forEach(function(param) { |
| 22 var element = param.split('='); |
| 23 ret[decodeURIComponent(element[0])] = decodeURIComponent(element[1]); |
| 24 }); |
| 25 return ret; |
| 26 } |
| 27 |
| 28 function getRequestInit(params) { |
| 29 var init = {}; |
| 30 if (params['method']) { |
| 31 init['method'] = params['method']; |
| 32 } |
| 33 if (params['mode']) { |
| 34 init['mode'] = params['mode']; |
| 35 } |
| 36 if (params['credentials']) { |
| 37 init['credentials'] = params['credentials']; |
| 38 } |
| 39 if (params['headers'] === 'CUSTOM') { |
| 40 init['headers'] = {"X-ServiceWorker-Test": "test"}; |
| 41 } else if (params['headers'] === '{}') { |
| 42 init['headers'] = {}; |
| 43 } |
| 44 return init; |
| 45 } |
| 46 |
| 47 function headersToArray(headers) { |
| 48 var ret = []; |
| 49 headers.forEach(function(value, key) { |
| 50 ret.push([key, value]); |
| 51 }); |
| 52 return ret; |
| 53 } |
| 54 |
| 55 self.addEventListener('fetch', function(event) { |
| 56 var originalURL = event.request.url; |
| 57 if (!isTestTargetFetch) { |
| 58 // Don't handle the event when it is not the test target fetch such as a |
| 59 // redirected fetch or for the iframe html. |
| 60 return; |
| 61 } |
| 62 isTestTargetFetch = false; |
| 63 var params = getQueryParams(originalURL); |
| 64 var init = getRequestInit(params); |
| 65 var url = params['url']; |
| 66 if (params['ignore']) { |
| 67 port.postMessage({fetchResult: 'ignored'}); |
| 68 return; |
| 69 } |
| 70 event.respondWith(new Promise(function(resolve, reject) { |
| 71 try { |
| 72 var request = event.request; |
| 73 if (url) { |
| 74 request = new Request(url, init); |
| 75 } else if (!params['noChange']) { |
| 76 request = new Request(request, init); |
| 77 } |
| 78 fetch(request) |
| 79 .then(function(res) { |
| 80 // Send the result to fetch-access-control.html. |
| 81 port.postMessage({fetchResult: 'resolved', |
| 82 hasBody: !!res.body, |
| 83 headers: headersToArray(res.headers), |
| 84 type: res.type, |
| 85 originalURL: originalURL}); |
| 86 resolve(res); |
| 87 }) |
| 88 .catch(function(e) { |
| 89 // Send the result to fetch-access-control.html. |
| 90 port.postMessage({fetchResult: 'rejected'}); |
| 91 reject(); |
| 92 }); |
| 93 } catch (e) { |
| 94 // Send the result to fetch-access-control.html. |
| 95 port.postMessage({fetchResult: 'error'}); |
| 96 reject(); |
| 97 } |
| 98 })); |
| 99 }); |
OLD | NEW |