Skip to content

Commit

Permalink
Bug 1715886 [wpt PR 29334] - Change behavior of window.open w.r.t. wi…
Browse files Browse the repository at this point in the history
…ndowPreferences and popups, a=testonly

Automatic update from web-platform-tests
Change behavior of window.open w.r.t. windowPreferences and popups

See [1] and [2] for more context, but this CL implements new behavior
for how window.open() interprets the windowPreferences argument when
deciding whether to open the window as a new tab or as a "popup",
which is a separate window with minimal UI (toolbars, onmibox,
etc.), and also what to return from the BarProp visible properties,
e.g. window.toolbar.visible.

The existing "trigger" behavior for popups will be retained by this
CL, namely that a popup will be opened instead of a tab if:
 1. the windowFeatures parameter is *not* empty, and
 2. one of the following conditions is true:
  * both `location` and `toolbar` are false or missing
  * `menubar` is false or missing
  * `resizable is false or missing
  * `scrollbar` is false or missing
  * `status` is false or missing

With this CL, an additional windowFeature called 'popup' is added,
so that if 'popup' is present and truthy.

Additionally, all BarProp properties (locationbar,menubar,
personalbar,scrollbars,statusbar, and toolbar) will always return
the same values, either false if a popup was opened, or true if
a tab/window was opened.

The spec for this behavior is part of the HTML spec:
https://html.spec.whatwg.org/multipage/window-object.html#popup-window-is-requested

The intent to ship is here:
https://groups.google.com/a/chromium.org/g/blink-dev/c/q6ybnmxxvpE

[1] whatwg/html#5872
[2] whatwg/html#6530

Fixed: 1192701
Change-Id: I50e745b1000d460c49085edd57d13f420b875ff3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2950386
Reviewed-by: Joey Arhar <jarhar@chromium.org>
Commit-Queue: Mason Freed <masonf@chromium.org>
Cr-Commit-Position: refs/heads/main@{#943716}

--

wpt-commits: 3660b77d3cec8138401c12e055bee44d62e9b060
wpt-pr: 29334
  • Loading branch information
mfreed7 authored and moz-wptsync-bot committed Nov 29, 2021
1 parent 9bac178 commit 5ca9d71
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!DOCTYPE html>
<script>
var channelName = window.name;
var channel = new BroadcastChannel(channelName);
const allBarProps = [
window.locationbar.visible,
window.menubar.visible,
window.personalbar.visible,
window.scrollbars.visible,
window.statusbar.visible,
window.toolbar.visible
];
const allTrue = allBarProps.every(x=>x);
const allFalse = allBarProps.every(x=>!x);
channel.postMessage({isPopup: allFalse, mixedState: !allTrue && !allFalse});

// Because messages are not delivered synchronously and because closing a
// browsing context prompts the eventual clearing of all task sources, this
// document should not be closed until the opener document has confirmed
// receipt.
channel.onmessage = function() {
window.close();
};
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Window.open popup behavior</title>
<link rel="author" href="masonf@chromium.org">
<link rel="help" href="https://html.spec.whatwg.org/multipage/window-object.html#window-open-steps">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<script>
function testOne(windowFeatures, expectPopup) {
const windowName = Math.round(Math.random()*1e12);
const channel = new BroadcastChannel(windowName);
var w;
promise_test(() => {
return new Promise(resolve => {
w = window.open("support/window-open-popup-target.html", windowName, windowFeatures);
channel.addEventListener('message', resolve);
}).then(e => {
// Send message first so if asserts throw the popup is still closed
channel.postMessage(null);
assert_false(e.data.mixedState, "No mixed state");
assert_equals(e.data.isPopup, expectPopup, "Popup state");
});
},`${windowFeatures} (expect ${expectPopup ? "popup" : "tab"})`);
}

// No windowpreferences at all - tab.
testOne(undefined, /*expectPopup=*/false);

// Test all permutations of these properties:
const features = ["location","toolbar","menubar","resizable","scrollbars","status"];
const nProps = features.length;
const skip = 7; // To speed up the test, don't test all values. Skip 7 to pseudo-randomize.
for(let i=0;i<2**nProps;i+=skip) {
const enableVec = Number(i).toString(2).padStart(nProps,'0').split('').map(s => (s==="1"));
let windowFeatures = [];
for(let i=0;i<nProps;++i) {
if (enableVec[i])
windowFeatures.push(features[i] + "=yes");
}
windowFeatures = windowFeatures.join(',');
// We get a popup we got windowFeatures, and any of them are false:
const expectPopup = !!windowFeatures.length && (!(enableVec[0] || enableVec[1]) || !enableVec[2] || !enableVec[3] || !enableVec[4] || !enableVec[5]);
testOne(windowFeatures, expectPopup);
testOne(windowFeatures + ",noopener", /*expectPopup=*/false);
testOne(windowFeatures + ",noreferrer", /*expectPopup=*/false);
testOne(windowFeatures + ",popup", /*expectPopup=*/true); // "popup" feature = popup
testOne(windowFeatures + ",noopener,noreferrer,popup", /*expectPopup=*/false);
}
</script>

0 comments on commit 5ca9d71

Please sign in to comment.