<!DOCTYPE html>
<html>
<meta charset="utf-8">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
'use strict';
function createIframe(t, values) {
const parent = document.createElement('iframe');
const child = document.createElement('iframe');
const params = values.map((value) => {
const percentEncodedValue = typeof value === "object" ? value.percentEncoded : encodeURIComponent(value);
return `value=${percentEncodedValue}`;
});
parent.setAttribute('src', `resources/empty-coep.py?${params.join("&")}`);
document.body.appendChild(parent);
t.add_cleanup(() => parent.remove());
return new Promise((resolve, reject) => {
parent.onload = resolve;
parent.onerror = () =>
reject(new Error(`failed to load from ${parent.src}`));
})
.then(() => {
child.setAttribute('src', '/common/blank.html');
parent.contentDocument.body.appendChild(child);
return new Promise((resolve) => {
child.onload = resolve;
child.onerror = () =>
reject(new Error(`failed to load from ${child.src}`));
});
})
.then(() => child);
}
[
[],
[''],
['jibberish'],
[{ percentEncoded: 'require%FFcorp' }], // non-ASCII byte
['require-corp;'],
['\u000brequire-corp\u000b'], // vertical tab
['\u000crequire-corp\u000c'], // form feed
['\u000drequire-corp\u000d'], // carriage return
['Require-corp'],
['"require-corp"'], // HTTP structured header "string" item
[':cmVxdWlyZS1jb3Jw:'], // HTTP structured header "byte sequence" item
['require-corp;\tfoo=bar'],
['require-corp require-corp'],
['require-corp,require-corp'],
['require-corp', 'require-corp'],
['', 'require-corp'],
['require-corp', ''],
].forEach((values) => {
promise_test((t) => {
return createIframe(t, values)
.then((child) => {
assert_not_equals(child.contentDocument, null);
});
}, 'navigation allowed for ' + JSON.stringify(values));
});
[
['require-corp'],
[' require-corp '],
['\trequire-corp\t'], // leading and trailing OWS is not part of the field-value per HTTP
[' \trequire-corp'],
['require-corp\t '],
['require-corp; foo=bar'],
['require-corp;require-corp'],
['require-corp; report-to="data:', '"'], // `require-corp; report-to="data:, "`
].forEach((values) => {
promise_test((t) => {
return createIframe(t, values)
.then((child) => {
assert_equals(child.contentDocument, null);
});
}, 'navigation blocked for ' + JSON.stringify(values));
});
</script>
</body>
</html>