blob: fcb77841163d9a09774497d2b8588f85c2a42b06 [file] [log] [blame]
<!DOCTYPE html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/content-security-policy/support/testharness-helper.js"></script>
</head>
<body>
<!-- Some elements for the tests to act on. -->
<div id="div"></div>
<script id="script-src" src=""></script>
<script id="script"></script>
<script id="script2"></script>
<script>
// CSP insists the "trusted-types: ..." directives are deliverd as headers
// (rather than as "meta http-equiv" tags). This test assumes the following
// headers are set in the .headers file:
//
// Content-Security-Policy-Report-Only: trusted-types ...; report-uri ...
// Return function that returns a promise that resolves on the given
// violation report.
function expect_violation(filter) {
return new Promise((resolve, reject) => {
function handler(e) {
if (e.originalPolicy.includes(filter)) {
document.removeEventListener("securitypolicyviolation", handler);
e.stopPropagation();
resolve(e);
}
}
document.addEventListener("securitypolicyviolation", handler);
});
}
// A sample policy we use to test trustedTypes.createPolicy behaviour.
const id = x => x;
const policy = trustedTypes.createPolicy("two", {
createHTML: id,
createScriptURL: id,
createScript: id,
});
/*
promise_test(t => {
let p = expect_violation("trusted-types two");
document.getElementById("script").src = "#abc";
assert_true(document.getElementById("script").src.endsWith("#abc"));
return p;
}, "Trusted Type violation report-only: assign string to script url");
*/
promise_test(t => {
let p = expect_violation("trusted-types two");
document.getElementById("div").innerHTML = "abc";
assert_equals(document.getElementById("div").textContent, "abc");
return p;
}, "Trusted Type violation report-only: assign string to html");
promise_test(t => {
let p = expect_violation("trusted-types two");
document.getElementById("script-src").src = "#";
assert_true(document.getElementById("script-src").src.endsWith("#"));
return p;
}, "Trusted Type violation report-only: assign string to script.src");
promise_test(t => {
let p = expect_violation("trusted-types two");
document.getElementById("script").innerHTML = "con" + "sole.log('Hello');";
assert_true(document.getElementById("script").textContent.startsWith("consol"));
return p;
}, "Trusted Type violation report-only: assign string to script content");
promise_test(t => {
let p = expect_violation("trusted-types two");
document.getElementById("script").src = "#def";
return p.then(report => {
assert_equals(report.documentURI, "" + window.location);
assert_equals(report.disposition, "report");
assert_equals(report.effectiveDirective, "require-trusted-types-for");
assert_equals(report.violatedDirective, "require-trusted-types-for");
assert_true(report.originalPolicy.startsWith("trusted-types two;"));
});
}, "Trusted Type violation report: check report contents");
</script>
</body>