Chromium Code Reviews| 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..62810b3f1c427d6e1b82f8d012c6d384e60a0ffb |
| --- /dev/null |
| +++ b/LayoutTests/http/tests/serviceworker/resources/fetch-access-control-worker.js |
| @@ -0,0 +1,99 @@ |
| +var port = undefined; |
| +var isTestTargetFetch = false; |
| + |
| +self.onmessage = function(e) { |
| + var message = e.data; |
|
falken
2014/07/25 05:41:29
this should just be 2 space indent, as it's not an
horo
2014/07/25 06:00:56
Done.
|
| + if ('port' in message) { |
| + port = message.port; |
| + } else if (message.msg === 'START TEST CASE') { |
| + isTestTargetFetch = true; |
| + port.postMessage({msg: 'READY'}); |
| + } |
| + }; |
| + |
| +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 (!isTestTargetFetch) { |
| + // Don't handle the event when it is not the test target fetch such as a |
| + // redirected fetch or for the iframe html. |
| + return; |
| + } |
| + isTestTargetFetch = false; |
| + var params = getQueryParams(originalURL); |
| + var init = getRequestInit(params); |
|
falken
2014/07/25 05:41:29
nit: space after =
horo
2014/07/25 06:00:56
Done.
|
| + var url = params['url']; |
| + if (params['ignore']) { |
| + port.postMessage({fetchResult: 'ignored'}); |
| + 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) { |
|
falken
2014/07/25 05:41:29
.then should be indented 2
horo
2014/07/25 06:00:56
Done.
|
| + // 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(); |
| + } |
| + })); |
| + }); |