1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
<!doctype html>
<title>Test whether a window is script-closable</title>
<link rel="help" href="https://html.spec.whatwg.org/#script-closable"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
let uid = 0;
async function withChannel(createWindow) {
const channel_name = `channel_${++uid}`;
const channel = new BroadcastChannel(channel_name);
const closedPromise = new Promise(resolve => {
channel.addEventListener("message", ({data}) => {
if (data.name === 'load') {
assert_true(true, 'window was loaded');
} else {
assert_not_equals(data.history, 1, "If script-closable, then not due to history length");
resolve(data.closed);
}
});
});
await createWindow(channel_name);
return closedPromise;
}
const Actions = {
async form(noopener) {
return withChannel((channel_name) => {
const form = document.createElement("form");
form.action = "self-close.html";
form.target = '_blank';
if (noopener) {
form.rel = "noopener";
}
// ?navs=1
const inp1 = document.createElement("input");
inp1.name = "navs";
inp1.value = "1";
form.appendChild(inp1);
// ?channel=channel_name
const inp2 = document.createElement("input");
inp2.name = "channel";
inp2.value = channel_name;
form.appendChild(inp2);
document.body.appendChild(form);
form.submit();
form.remove();
});
},
async link(noopener) {
return withChannel((channel_name) => {
const anchor = document.createElement("a");
anchor.href = `self-close.html?navs=1&channel=${channel_name}`;
anchor.target = '_blank';
if (noopener) {
anchor.rel = "noopener";
}
document.body.appendChild(anchor);
anchor.click();
anchor.remove();
});
},
async script(noopener) {
return withChannel((channel_name) => {
const url = `self-close.html?navs=1&channel=${channel_name}`;
window.open(url, "_blank", noopener ? 'noopener' : '');
});
}
}
for (const action of [Actions.form, Actions.link, Actions.script]) {
for (const noopener of [false, true])
promise_test(async () => {
const closed = await action(noopener);
assert_true(closed, "window closed");
}, `Window created by ${action.name} with ${noopener ? 'noopener' : 'opener'} is script-closable`);
}
</script>
|