<title>Test whether SafeBrowsing check is enforced for WebSocket connections or fetch requests.</title>
<script>
const url = new URL(document.location.href);
const contextType = url.searchParams.get('contextType');
const requestType = url.searchParams.get('requestType');
function getRequestUrl() {
if (requestType == 'websocket') {
// Construct the WebSocket URL from the page URL. The server should be
// configured to accept a WebSocket handshake at this endpoint.
const wsUrl = new URL('/safe_browsing/malware-ws', url);
wsUrl.protocol = 'ws';
return wsUrl;
}
return new URL('/safe_browsing/malware.html', url);
}
function workerTest() {
const worker = new Worker('malware_js_request_worker.js');
worker.onmessage = e => signalComplete(e.data);
worker.postMessage(getRequestUrl().toString());
}
function sharedWorkerTest() {
const worker = new SharedWorker('malware_js_request_worker.js');
worker.onerror = e => signalComplete('SHARED_WORKER_ERROR');
const port = worker.port;
port.onmessage = e => signalComplete(e.data);
port.postMessage(getRequestUrl().toString());
}
async function serviceWorkerTest() {
try {
await navigator.serviceWorker.register('malware_js_request_worker.js');
const registration = await navigator.serviceWorker.ready;
const messageChannel = new MessageChannel();
messageChannel.port1.onmessage = e => signalComplete(e.data);
registration.active.postMessage(getRequestUrl().toString(),
[messageChannel.port2]);
} catch (err) {
signalComplete(`${err}`);
}
}
function windowTest() {
const requestUrl = getRequestUrl();
if (requestUrl.protocol == 'ws:') {
const ws = new WebSocket(requestUrl.href);
ws.onerror = () => signalComplete('ERROR');
ws.onopen = () => signalComplete('NOT BLOCKED');
} else {
fetch(requestUrl).then(function(response) {
signalComplete('NOT BLOCKED');
}).catch(function() {
signalComplete('ERROR');
});
}
}
function signalComplete(message) {
// The "not blocked" test looks for this title change to verify that the
// request has not been blocked.
document.title = message;
}
switch (contextType) {
case 'worker':
workerTest();
break;
case 'shared-worker':
sharedWorkerTest();
break;
case 'service-worker':
serviceWorkerTest();
break;
default:
windowTest();
break;
}
</script>