Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!doctype html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>window.open() windowFeature value parsing</title>
<link rel="author" href="mailto:masonf@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
function testValueGeneric(val, expectTrue, property, testFn) {
const windowFeatureStr = val === "" ? property : `${property}=${val}`;
async_test(t => {
const windowName = '' + Math.round(Math.random()*1e12);
const channel = new BroadcastChannel(windowName);
channel.onmessage = t.step_func_done(e => {
// Send message first so if asserts throw the popup is still closed
channel.postMessage(null);
testFn(e.data);
});
window.open("support/windowFeature-values-target.html?" + windowName, windowName, windowFeatureStr);
},`Test ${windowFeatureStr}, expected interpretation is ${expectTrue ? 'true' : 'false'}`);
}
function testValueForNoReferrer(val, expectTrue) {
testValueGeneric(val, expectTrue, "noreferrer", (data) => {
if (expectTrue) {
assert_false(data.haveReferrer);
assert_false(data.haveOpener);
} else {
assert_true(data.haveReferrer);
assert_true(data.haveOpener);
}
});
}
function testValueForNoOpener(val, expectTrue) {
testValueGeneric(val, expectTrue, "noopener", (data) => {
assert_equals(data.haveOpener, !expectTrue);
});
}
function testValueForPopup(val, expectTrue) {
testValueGeneric(val, expectTrue, "popup", (data) => {
assert_equals(data.isPopup, expectTrue);
});
}
function testValue(val, expectTrue) {
const quotes = val === "" ? [''] : ['','"',"'"];
let noQuotes = true;
for (const quote of quotes) {
const thisExpectTrue = expectTrue && noQuotes;
const thisVal = quote + val + quote;
testValueForNoReferrer(thisVal, thisExpectTrue);
testValueForNoOpener(thisVal, thisExpectTrue);
testValueForPopup(thisVal, thisExpectTrue);
noQuotes = false;
}
}
testValue('',true); // Just the parameter means true
testValue('yes',true); // Yes means true
testValue('true',true); // True means true
testValue('foo',false); // If parsing as an integer is an error, false
testValue('0',false); // 0 is false
testValue('00',false); // 0 is false
testValue('1',true); // Non-zero is true
testValue('99999',true); // Non-zero is true
testValue('-1',true); // Non-zero is true
testValue('1foo',true); // This parses to 1
testValue('0foo',false); // This parses to 0
</script>