forked from chromium/chromium
-
-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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}
- Loading branch information
Showing
13 changed files
with
126 additions
and
200 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 0 additions & 15 deletions
15
...ating-browsing-contexts-by-name/open-features-is-popup-condition_combination-expected.txt
This file was deleted.
Oops, something went wrong.
19 changes: 0 additions & 19 deletions
19
...vigating-browsing-contexts-by-name/open-features-is-popup-condition_single-1-expected.txt
This file was deleted.
Oops, something went wrong.
21 changes: 0 additions & 21 deletions
21
...vigating-browsing-contexts-by-name/open-features-is-popup-condition_single-2-expected.txt
This file was deleted.
Oops, something went wrong.
24 changes: 24 additions & 0 deletions
24
..._tests/external/wpt/html/browsers/the-window-object/support/window-open-popup-target.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
51 changes: 51 additions & 0 deletions
51
...nk/web_tests/external/wpt/html/browsers/the-window-object/window-open-popup-behavior.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
Oops, something went wrong.