| Index: LayoutTests/http/tests/serviceworker/resources/fetch-csp-worker.js
|
| diff --git a/LayoutTests/http/tests/serviceworker/resources/fetch-csp-worker.js b/LayoutTests/http/tests/serviceworker/resources/fetch-csp-worker.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8463677f30aebf9f9c181e7fc9a007860d12e5c1
|
| --- /dev/null
|
| +++ b/LayoutTests/http/tests/serviceworker/resources/fetch-csp-worker.js
|
| @@ -0,0 +1,113 @@
|
| +self.onmessage = function(e) {
|
| + var message = e.data;
|
| + if ('port' in message) {
|
| + port = message.port;
|
| + }
|
| +};
|
| +
|
| +var baseFrameHtml =
|
| +'<!DOCTYPE html>' +
|
| +'<html><head>' +
|
| +'<meta http-equiv="Content-Security-Policy" content="img-src *.0.1:8000; script-src \'unsafe-inline\'">' +
|
| +'<script>' +
|
| +'function onMessage(event) {' +
|
| +' var frame = document.createElement(\'script\');' +
|
| +' frame.src = event.data.url;' +
|
| +' document.body.appendChild(frame);' +
|
| +'}' +
|
| +'function report(data) {' +
|
| +' window.parent.postMessage(' +
|
| +' data,' +
|
| +' \'http://127.0.0.1:8000/serviceworker/fetch-csp.html\');' +
|
| +'}' +
|
| +'function onload() {' +
|
| +' window.addEventListener(\'message\', onMessage, false);' +
|
| +'}' +
|
| +'window.addEventListener(\'load\', onload);' +
|
| +'</script>' +
|
| +'</head><body></body></html>' ;
|
| +
|
| +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']) {
|
| + init['headers'] = JSON.parse(params['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 url = event.request.url;
|
| + if (event.request.url == 'http://127.0.0.1:8000/serviceworker/resources/fetch-csp-iframe.html') {
|
| + handleFrame(event);
|
| + } else {
|
| + var params = getQueryParams(url);
|
| + var init = getRequestInit(params);
|
| + var url = params['url'];
|
| + if (params['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){
|
| + resolve(res);
|
| + port.postMessage({id: params['id'],
|
| + event: 'resolved',
|
| + params: params,
|
| + headers: headersToArray(res.headers),
|
| + data: JSON.parse(JSON.stringify(res))});
|
| + }).catch(function(e){
|
| + reject();
|
| + port.postMessage({id: params['id'],
|
| + event: 'rejected',
|
| + params: params});
|
| + });
|
| + } catch (e) {
|
| + reject();
|
| + port.postMessage({id: params['id'],
|
| + event: 'error',
|
| + params: params});
|
| + }
|
| + }));
|
| + }
|
| +});
|
|
|