blob: 5295f1e10cfdd572272519f96e4f17d63f60abec [file] [log] [blame] [edit]
// META: script=/common/utils.js
// META: script=/common/get-host-info.sub.js
function taintedImageBitmap(t) {
return new Promise(resolve => {
const img = new Image();
img.src = `${get_host_info().HTTPS_REMOTE_ORIGIN}/images/blue.png`;
img.onload = t.step_func(() => {
resolve(createImageBitmap(img));
});
img.onerror = t.unreached_func();
});
}
async_test(t => {
const bc = new BroadcastChannel(token());
const popup = window.open(`resources/coop-coep-popup.html?channel=${bc.name}`);
const popupReady = new Promise(resolve => {
bc.onmessage = t.step_func(resolve);
});
const imageReady = taintedImageBitmap(t);
Promise.all([popupReady, imageReady]).then(t.step_func(([, bitmap]) => {
bc.onmessage = t.step_func_done(e => {
assert_equals(e.data, "Got failure as expected.");
});
bc.postMessage(bitmap);
}));
}, "BroadcastChannel'ing a tainted ImageBitmap to a COOP+COEP popup");
[
{
"type": "serialize/deserialize",
"message": (port, bitmap) => port.postMessage(bitmap)
},
{
"type": "transfer",
"message": (port, bitmap) => port.postMessage(bitmap, [bitmap])
}
].forEach(({ type, message }) => {
async_test(t => {
const sw = new SharedWorker("resources/coop-coep-worker.js");
const imageReady = taintedImageBitmap(t);
imageReady.then(t.step_func(bitmap => {
sw.port.onmessage = t.step_func_done(e => {
assert_equals(e.data, "Got failure as expected.");
});
message(sw.port, bitmap);
}));
}, `Messaging a tainted ImageBitMap via ${type} to a COEP shared worker`);
});