Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script>
const info = get_host_info();
const nextCSPViolation = (test) => {
return new Promise((resolve, reject) => {
document.addEventListener("securitypolicyviolation", resolve, {once: true});
test.step_timeout(() => reject("timeout"), 3000);
});
};
const redirector = get_host_info().HTTP_REMOTE_ORIGIN.replace("http", "wss") +
"/common/redirect.py";
promise_setup(async () => {
const meta = document.createElement('meta');
meta.httpEquiv = "Content-Security-Policy";
meta.content = "connect-src " + redirector;
document.getElementsByTagName('head')[0].appendChild(meta);
}, "Install <meta> CSP");
promise_test(async test => {
const url = get_host_info().HTTP_ORIGIN.replace("http", "ws") + "/path";
const violation = nextCSPViolation(test);
try { new WebSocket(url); } catch (e) {}
assert_equals((await violation).blockedURI, url);
}, "ws");
promise_test(async test => {
const url = get_host_info().HTTP_ORIGIN.replace("http", "wss") + "/path";
const violation = nextCSPViolation(test);
try { new WebSocket(url); } catch (e) {}
assert_equals((await violation).blockedURI, url);
}, "wss");
promise_test(async test => {
const url = get_host_info().HTTP_REMOTE_ORIGIN.replace("http", "wss") + "/path";
const violation = nextCSPViolation(test);
try { new WebSocket(url); } catch (e) {}
assert_equals((await violation).blockedURI, url);
}, "cross-origin");
promise_test(async test => {
const url = get_host_info().HTTP_ORIGIN.replace("http", "wss") + "/path";
const violation = nextCSPViolation(test);
try {new WebSocket(redirector + "?location=" + url); } catch (e) {}
assert_equals((await violation).blockedURI, url);
}, "redirect");
</script>