91 lines
3 KiB
HTML
91 lines
3 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<meta charset="utf-8">
|
|
<title>Cross-Origin-Opener-Policy forces browsing context switch in various popup document types</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/common/utils.js"></script>
|
|
|
|
<p>These tests create a "parent" popup window which is an HTML document with a
|
|
specific Cross-Origin-Opener-Policy. The parent creates a "child" popup window
|
|
which is a non-HTML document with a Cross-Origin-Opener-Policy of its own. The
|
|
parent waits for the child's location to change from "<code>about:blank</code>"
|
|
and then inspects its <code>name</code> and <code>closed</code> properties
|
|
which it reports back to the test context.</p>
|
|
|
|
<p>The HTTP `Refresh` header is used to ensure the child eventually closes
|
|
itself (since proper observance of COOP will prevent the parent from closing
|
|
the child in some cases).</p>
|
|
|
|
<script>
|
|
'use strict';
|
|
|
|
const coop_resource_test = ({parentCoop, resourceCoop, resource, resourceName, validate}) => {
|
|
async_test((t) => {
|
|
const bc = new BroadcastChannel(token());
|
|
bc.onmessage = t.step_func_done(({data}) => validate(data));
|
|
const childLocation = resource +
|
|
`?pipe=header(Refresh,2;url=/html/cross-origin-opener-policy/resources/resource-cleanup.html?channel=${bc.name})` +
|
|
(resourceCoop ? `|header(Cross-Origin-Opener-Policy,${resourceCoop})` : '');
|
|
const parentLocation = 'resources/resource-popup.html' +
|
|
`?channel_name=${bc.name}` +
|
|
`&resource=${encodeURIComponent(childLocation)}` +
|
|
`&resource_name=${resourceName}` +
|
|
(parentCoop ? `&pipe=header(Cross-Origin-Opener-Policy,${parentCoop})` : '');
|
|
|
|
open(parentLocation);
|
|
|
|
t.add_cleanup(() => {
|
|
// Close the "parent" popup and the "child" popup if it has already
|
|
// redirected to the HTML document.
|
|
bc.postMessage(null);
|
|
// Prepare to close the "child" popup in the case that it has not yet
|
|
// redirected to the HTML document.
|
|
bc.onmessage = () => bc.postMessage(null);
|
|
});
|
|
}, `${resource} - parent COOP: "${parentCoop}"; child COOP: "${resourceCoop}"`);
|
|
};
|
|
|
|
const resources = [
|
|
'/common/dummy.xml',
|
|
'/images/red.png',
|
|
'/common/text-plain.txt',
|
|
'/media/2x2-green.mp4',
|
|
];
|
|
|
|
for (const resource of resources) {
|
|
coop_resource_test({
|
|
parentCoop: '',
|
|
resourceCoop: 'same-origin',
|
|
resource,
|
|
resourceName: 'foobar',
|
|
validate(data) {
|
|
assert_equals(data.name, null);
|
|
assert_equals(data.closed, true);
|
|
}
|
|
});
|
|
|
|
coop_resource_test({
|
|
parentCoop: 'same-origin',
|
|
resourceCoop: '',
|
|
resource,
|
|
resourceName: 'foobar',
|
|
validate(data) {
|
|
assert_equals(data.name, null);
|
|
assert_equals(data.closed, true);
|
|
}
|
|
});
|
|
|
|
coop_resource_test({
|
|
parentCoop: 'same-origin',
|
|
resourceCoop: 'same-origin',
|
|
resource,
|
|
resourceName: 'foobar',
|
|
validate(data) {
|
|
assert_equals(data.name, 'foobar');
|
|
assert_equals(data.closed, false);
|
|
}
|
|
});
|
|
}
|
|
</script>
|
|
</html>
|