78 lines
3 KiB
HTML
78 lines
3 KiB
HTML
<!doctype html>
|
|
<meta charset=utf-8>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/common/dispatcher/dispatcher.js"></script>
|
|
<script src="/common/get-host-info.sub.js"></script>
|
|
<script src="/common/utils.js"></script>
|
|
<div id=log></div>
|
|
<script>
|
|
const origins = get_host_info();
|
|
[
|
|
{
|
|
"origin": origins.HTTPS_ORIGIN,
|
|
"crossOrigin": origins.HTTPS_REMOTE_ORIGIN
|
|
},
|
|
{
|
|
"origin": origins.HTTPS_REMOTE_ORIGIN,
|
|
"crossOrigin": origins.HTTPS_NOTSAMESITE_ORIGIN
|
|
},
|
|
{
|
|
"origin": origins.HTTPS_NOTSAMESITE_ORIGIN,
|
|
"crossOrigin": origins.HTTPS_ORIGIN
|
|
}
|
|
].forEach(({ origin, crossOrigin }) => {
|
|
["subframe", "navigate", "popup"].forEach(variant => {
|
|
// Due to `noopener` being enforced on Blob URLs where the corresponding
|
|
// origin is cross-site to the opening context's top-level site, require
|
|
// dispatcher.js to pass information back after window.open().
|
|
if (origin === origins.HTTPS_NOTSAMESITE_ORIGIN &&
|
|
crossOrigin === origins.HTTPS_ORIGIN &&
|
|
variant === "popup") {
|
|
return;
|
|
}
|
|
async_test(t => {
|
|
const id = token();
|
|
const frame = document.createElement("iframe");
|
|
t.add_cleanup(() => { frame.remove(); });
|
|
const path = new URL("resources/blob-url-factory.html", window.location).pathname;
|
|
frame.src = `${origin}${path}?id=${id}&variant=${variant}&crossOrigin=${crossOrigin}`;
|
|
window.addEventListener("message", t.step_func(({ data }) => {
|
|
if (data.id !== id) {
|
|
return;
|
|
}
|
|
assert_equals(data.origin, origin);
|
|
assert_true(data.sameOriginNoCORPSuccess, "Same-origin without CORP did not succeed");
|
|
assert_true(data.crossOriginNoCORPFailure, "Cross-origin without CORP did not fail");
|
|
t.done();
|
|
}));
|
|
document.body.append(frame);
|
|
}, `Cross-Origin-Embedder-Policy and blob: URL from ${origin} in subframe via ${variant}`);
|
|
});
|
|
});
|
|
|
|
// New test for the specific case using dispatcher.js for popups.
|
|
promise_test(async t => {
|
|
const origin = origins.HTTPS_NOTSAMESITE_ORIGIN;
|
|
const crossOrigin = origins.HTTPS_ORIGIN;
|
|
const variant = "popup-dispatch";
|
|
const id = token();
|
|
|
|
const frame = document.createElement("iframe");
|
|
t.add_cleanup(() => { frame.remove(); });
|
|
|
|
const path = new URL("resources/blob-url-factory.html", window.location).pathname;
|
|
frame.src = `${origin}${path}?id=${id}&variant=${variant}&crossOrigin=${crossOrigin}`;
|
|
document.body.append(frame);
|
|
|
|
// Use dispatcher to wait for the message.
|
|
const message = await receive(id);
|
|
const data = JSON.parse(message);
|
|
|
|
assert_equals(data.origin, origin, "Message origin should match test origin");
|
|
assert_true(data.sameOriginNoCORPSuccess, "Same-origin fetch without CORP should succeed");
|
|
assert_true(data.crossOriginNoCORPFailure, "Cross-origin fetch without CORP should fail");
|
|
|
|
}, `Cross-Origin-Embedder-Policy and blob: URL from ${origins.HTTPS_NOTSAMESITE_ORIGIN} in popup (using dispatcher)`);
|
|
|
|
</script>
|