OLD | NEW |
(Empty) | |
| 1 self.onmessage = function(e) { |
| 2 var message = e.data; |
| 3 if ('port' in message) { |
| 4 port = message.port; |
| 5 } |
| 6 }; |
| 7 |
| 8 var baseFrameHtml = |
| 9 '<script>' + |
| 10 'function onMessage(event) {' + |
| 11 ' var frame = document.createElement(\'script\');' + |
| 12 ' frame.src = event.data.url;' + |
| 13 ' document.body.appendChild(frame);' + |
| 14 '}' + |
| 15 'function report(data) {' + |
| 16 ' window.parent.postMessage(' + |
| 17 ' data,' + |
| 18 ' \'http://127.0.0.1:8000/serviceworker/fetch-access-control.html\');' + |
| 19 '}' + |
| 20 'function onload() {' + |
| 21 ' window.addEventListener(\'message\', onMessage, false);' + |
| 22 '}' + |
| 23 'window.addEventListener(\'load\', onload);' + |
| 24 '</script>'; |
| 25 |
| 26 function handleFrame(event) { |
| 27 event.respondWith(new Response(new Blob([baseFrameHtml]))); |
| 28 } |
| 29 |
| 30 function getQueryParams(url) { |
| 31 var search = (new URL(url)).search; |
| 32 if (!search) { |
| 33 return {}; |
| 34 } |
| 35 var ret = {}; |
| 36 var params = search.substring(1).split('&'); |
| 37 params.forEach(function(param) { |
| 38 var element = param.split('='); |
| 39 ret[decodeURIComponent(element[0])] = decodeURIComponent(element[1]); |
| 40 }); |
| 41 return ret; |
| 42 } |
| 43 |
| 44 function getRequestInit(params) { |
| 45 var init = {}; |
| 46 if (params['method']) { |
| 47 init['method'] = params['method']; |
| 48 } |
| 49 if (params['mode']) { |
| 50 init['mode'] = params['mode']; |
| 51 } |
| 52 if (params['credentials']) { |
| 53 init['credentials'] = params['credentials']; |
| 54 } |
| 55 if (params['headers']) { |
| 56 init['headers'] = JSON.parse(params['headers']); |
| 57 } |
| 58 return init; |
| 59 } |
| 60 |
| 61 function headersToArray(headers) { |
| 62 var ret = []; |
| 63 headers.forEach(function(value, key) { |
| 64 ret.push([key, value]); |
| 65 }); |
| 66 return ret; |
| 67 } |
| 68 |
| 69 self.addEventListener('fetch', function(event) { |
| 70 var url = event.request.url; |
| 71 if (event.request.url == 'http://127.0.0.1:8000/serviceworker/resources/fetch-
access-control-iframe.html') { |
| 72 handleFrame(event); |
| 73 } else { |
| 74 var params = getQueryParams(url); |
| 75 var init = getRequestInit(params); |
| 76 event.respondWith(new Promise(function(resolve, reject) { |
| 77 try { |
| 78 var newRequest = new Request(event.request, init); |
| 79 fetch(newRequest).then(function(res){ |
| 80 port.postMessage({id: params['id'], |
| 81 event: 'resolved', |
| 82 params: params, |
| 83 headers: headersToArray(res.headers), |
| 84 data: JSON.parse(JSON.stringify(res))}); |
| 85 resolve(res); |
| 86 //resolve(new Response(new Blob(['report(\'aaa\')']))); |
| 87 }).catch(function(e){ |
| 88 port.postMessage({id: params['id'], |
| 89 event: 'rejected', |
| 90 params: params}); |
| 91 reject(); |
| 92 }); |
| 93 } catch (e) { |
| 94 port.postMessage({id: params['id'], |
| 95 event: 'error', |
| 96 params: params}); |
| 97 reject(); |
| 98 } |
| 99 })); |
| 100 } |
| 101 }); |
OLD | NEW |