Source code
Revision control
Copy as Markdown
Other Tools
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;
}));
});