Index: LayoutTests/http/tests/serviceworker/resources/fetch-access-control-worker.js |
diff --git a/LayoutTests/http/tests/serviceworker/resources/fetch-access-control-worker.js b/LayoutTests/http/tests/serviceworker/resources/fetch-access-control-worker.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..44b82484f7e829bc05148945aada85d775fc51a4 |
--- /dev/null |
+++ b/LayoutTests/http/tests/serviceworker/resources/fetch-access-control-worker.js |
@@ -0,0 +1,116 @@ |
+var port = undefined; |
+ |
+self.onmessage = function(e) { |
+ var message = e.data; |
+ if ('port' in message) { |
+ port = message.port; |
+ } |
+}; |
+ |
+var baseFrameHtml = |
+ '<script>' + |
+ 'function onMessage(event) {' + |
+ ' var script = document.createElement(\'script\');' + |
+ ' script.src = event.data.url;' + |
+ ' script.addEventListener(' + |
+ ' \'error\',' + |
+ ' function() {report({jsonpResult:\'error\'})});' + |
+ ' document.body.appendChild(script);' + |
+ '}' + |
+ 'function report(data) {' + |
+ ' window.parent.postMessage(' + |
+ ' data,' + |
+ ' \'http://127.0.0.1:8000\');' + |
+ '}' + |
+ 'function onload() {' + |
+ ' window.addEventListener(\'message\', onMessage, false);' + |
+ '}' + |
+ 'window.addEventListener(\'load\', onload);' + |
+ '</script>'; |
+ |
+function handleFrame(event) { |
+ event.respondWith(new Response(new Blob([baseFrameHtml]))); |
+} |
+ |
+function getQueryParams(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 getRequestInit(params) { |
+ var init = {}; |
+ if (params['method']) { |
+ init['method'] = params['method']; |
+ } |
+ if (params['mode']) { |
+ init['mode'] = params['mode']; |
+ } |
+ if (params['credentials']) { |
+ init['credentials'] = params['credentials']; |
+ } |
+ if (params['headers'] === 'CUSTOM') { |
+ init['headers'] = {"X-ServiceWorker-Test": "test"}; |
+ } else if (params['headers'] === '{}') { |
+ init['headers'] = {}; |
+ } |
+ return init; |
+} |
+ |
+function headersToArray(headers) { |
+ var ret = []; |
+ headers.forEach(function(value, key) { |
+ ret.push([key, value]); |
+ }); |
+ return ret; |
+} |
+ |
+self.addEventListener('fetch', function(event) { |
+ var originalURL = event.request.url; |
+ if (originalURL === 'http://127.0.0.1:8000/serviceworker/resources/fetch-access-control-iframe.html') { |
+ handleFrame(event); |
+ } else { |
+ var params = getQueryParams(originalURL); |
+ var init = getRequestInit(params); |
+ var url = params['url']; |
+ if (params['ignore']) { |
+ port.postMessage({fetchResult: 'ignore'}); |
+ return; |
+ } |
+ event.respondWith(new Promise(function(resolve, reject) { |
+ try { |
+ var request = event.request; |
+ if (url) { |
+ request = new Request(url, init); |
+ } else if (!params['noChange']) { |
+ request = new Request(request, init); |
+ } |
+ fetch(request).then(function(res) { |
+ // Send the result to fetch-access-control.html. |
+ port.postMessage({fetchResult: 'resolved', |
+ hasBody: !!res.body, |
+ headers: headersToArray(res.headers), |
+ type: res.type, |
+ originalURL: originalURL}); |
+ resolve(res); |
+ }).catch(function(e) { |
+ // Send the result to fetch-access-control.html. |
+ port.postMessage({fetchResult: 'rejected'}); |
+ reject(); |
+ }); |
+ } catch (e) { |
+ // Send the result to fetch-access-control.html. |
+ port.postMessage({fetchResult: 'error'}); |
+ reject(); |
+ } |
+ })); |
+ } |
+}); |