importScripts('/common/get-host-info.sub.js'); importScripts('test-helpers.sub.js'); 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 createResponse(params) { if (params['type'] == 'basic') { return fetch('respond-with-body-accessed-response.jsonp'); } if (params['type'] == 'opaque') { return fetch(get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() + 'respond-with-body-accessed-response.jsonp', {mode: 'no-cors'}); } if (params['type'] == 'default') { return Promise.resolve(new Response('callback(\'OK\');')); } return Promise.reject(new Error('unexpected type :' + params['type'])); } function cloneResponseIfNeeded(params, response) { if (params['clone'] == '1') { return response.clone(); } else if (params['clone'] == '2') { response.clone(); return response; } return response; } function passThroughCacheIfNeeded(params, request, response) { return new Promise(function(resolve) { if (params['passThroughCache'] == 'true') { var cache_name = request.url; var cache; self.caches.delete(cache_name) .then(function() { return self.caches.open(cache_name); }) .then(function(c) { cache = c; return cache.put(request, response); }) .then(function() { return cache.match(request.url); }) .then(function(res) { // Touch .body here to test the behavior after touching it. res.body; resolve(res); }); } else { resolve(response); } }) } self.addEventListener('fetch', function(event) { if (event.request.url.indexOf('TestRequest') == -1) { return; } var params = getQueryParams(event.request.url); event.respondWith( createResponse(params) .then(function(response) { // Touch .body here to test the behavior after touching it. response.body; return cloneResponseIfNeeded(params, response); }) .then(function(response) { // Touch .body here to test the behavior after touching it. response.body; return passThroughCacheIfNeeded(params, event.request, response); }) .then(function(response) { // Touch .body here to test the behavior after touching it. response.body; return response; })); });