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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
<!doctype html>
<html>
<head>
<title>Clear window.name when cross-origin</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
</head>
<body>
<script>
function anchorClick(n) {
const hyperlink = document.body.appendChild(document.createElement("a"))
hyperlink.rel = "noopener";
hyperlink.target = "_blank";
hyperlink.href = n;
hyperlink.click();
}
async function pollResultAndCheck(t, id, expected) {
const stashURL = new URL("resources/window-name-stash.py", location);
stashURL.searchParams.set('id', id);
let res = "NONE";
while (res == "NONE") {
await new Promise(resolve => { t.step_timeout(resolve, 100); });
const response = await fetch(stashURL);
res = await response.text();
}
if (res !== expected) {
assert_unreached('Stash result does not equal expected result.')
}
}
promise_test(async t => {
const id = token();
window.open(`resources/window-name.sub.html?report=${id}|close`, id);
await pollResultAndCheck(t, id, id);
}, "Window.name is not reset when there is an opener around");
promise_test(async t => {
const id = token();
window.open(`resources/window-name.sub.html?cross|same|report=${id}|close`, id);
await pollResultAndCheck(t, id, id);
}, "Window.name is not reset when there is an opener around (cross-origin)");
promise_test(async t => {
const id = token();
w = window.open("about:blank", id);
w.location = `resources/window-name.sub.html?cross|same|report=${id}|close`;
await pollResultAndCheck(t, id, id);
}, "Window.name is not reset at the first navigation away from loaded initial about:blank");
promise_test(async t => {
const id = token();
window.open(`resources/window-name.sub.html?report=${id}|close`, id, "noopener");
await pollResultAndCheck(t, id, id);
}, "Window.name is not reset at the first navigation away from initial about:blank with noopener");
promise_test(async t => {
const id = token();
window.open(`resources/window-name.sub.html?cross|same|report=${id}|close`, id, "noopener");
await pollResultAndCheck(t, id, "");
}, "Window.name is reset at the first cross-origin navigation with noopener");
promise_test(async t => {
const id = token();
let win = window.open(`resources/window-name.sub.html?report=${id}|close`, id);
win.opener = null;
await pollResultAndCheck(t, id, id);
}, "Window.name is not reset at the first navigation away from initial about:blank with window.opener set to null");
promise_test(async t => {
const id = token();
let win = window.open(`resources/window-name.sub.html?same|report=${id}|close`, id);
win.opener = null;
await pollResultAndCheck(t, id, id);
}, "Window.name is not reset at the same-origin navigation with window.opener set to null");
promise_test(async t => {
const id = token();
let win = window.open(`resources/window-name.sub.html?cross|same|report=${id}|close`, id);
win.opener = null;
await pollResultAndCheck(t, id, "");
}, "Window.name is reset at the first first cross-origin navigation with window.opener set to null");
promise_test(async t => {
const id = token();
anchorClick(`resources/window-name.sub.html?set=${id}|report=${id}|close`);
await pollResultAndCheck(t, id, id);
}, "Window.name is set by the window");
promise_test(async t => {
const id = token();
anchorClick(`resources/window-name.sub.html?set=${id}|cross|same|report=${id}|close`);
await pollResultAndCheck(t, id, "");
}, "Window.name is reset at the first cross-origin navigation");
promise_test(async t => {
const id = token();
window.open(`resources/window-name.sub.html?open|navOpener=about:blank|reportOpener=${id}|closeOpener|close`, id, "noopener");
await pollResultAndCheck(t, id, id);
}, "window.name is not reset after navigating to an about:blank page from a non-about:blank page");
promise_test(async t => {
const id = token();
const domain = window.location.host;
anchorClick(`resources/window-name.sub.html?sub|set=${id}|setDomain=${domain}|sub|report=${id}|close`);
await pollResultAndCheck(t, id, id);
}, "Window.name is not reset if the document.domain is set to the parent domain");
</script>
</body>
</html>
|