forked from mirrors/gecko-dev
This method only is async in order to allow callers to wait for a process switch triggered by the call to `loadURI` to be finished before resolving. With DocumentChannel, we should never trigger a process switch eagerly like this again, so we don't need any of the async behaviour here anymore. This part is largely mechanical changes to tests, removing the `await` calls on `loadURI`, and a follow-up part will remove the actual async logic from `BrowserTestUtils.loadURI`. Differential Revision: https://phabricator.services.mozilla.com/D94641
307 lines
9.2 KiB
JavaScript
307 lines
9.2 KiB
JavaScript
"use strict";
|
|
|
|
requestLongerTimeout(5);
|
|
|
|
/**
|
|
* Opens windows from content using window.open with several features patterns.
|
|
*/
|
|
add_task(async function test_popup_conditions() {
|
|
const PATTERNS = [
|
|
{ features: "", popup: false },
|
|
|
|
// If features isn't empty, the following should be true to open tab/window:
|
|
// * location or toolbar (defaults to false)
|
|
// * menubar (defaults to false)
|
|
// * resizable (defaults to true)
|
|
// * scrollbars (defaults to false)
|
|
// * status (defaults to false)
|
|
// and also the following shouldn't be specified:
|
|
// * left or screenX
|
|
// * top or screenY
|
|
// * width or innerWidth
|
|
// * height or innerHeight
|
|
{ features: "location,menubar,resizable,scrollbars,status", popup: false },
|
|
{ features: "toolbar,menubar,resizable,scrollbars,status", popup: false },
|
|
{
|
|
features: "location,menubar,toolbar,resizable,scrollbars,status",
|
|
popup: false,
|
|
},
|
|
|
|
// resizable defaults to true.
|
|
{ features: "location,menubar,scrollbars,status", popup: false },
|
|
|
|
// The following testcases use "location,menubar,scrollbars,status"
|
|
// as the base non-popup case, and test the boundary between popup
|
|
// vs non-popup.
|
|
|
|
// If either location or toolbar is true, not popup.
|
|
{
|
|
features: "location=0,toolbar,menubar,resizable,scrollbars,status",
|
|
popup: false,
|
|
},
|
|
{
|
|
features: "location,toolbar=0,menubar,resizable,scrollbars,status",
|
|
popup: false,
|
|
},
|
|
{
|
|
features: "location,toolbar,menubar,resizable,scrollbars,status",
|
|
popup: false,
|
|
},
|
|
|
|
// If both location and toolbar are false, popup.
|
|
{
|
|
features: "location=0,toolbar=0,menubar,resizable,scrollbars,status",
|
|
popup: true,
|
|
},
|
|
{ features: "menubar,scrollbars,status", popup: true },
|
|
|
|
// If menubar is false, popup.
|
|
{ features: "location,resizable,scrollbars,status", popup: true },
|
|
{ features: "location,menubar=0,resizable,scrollbars,status", popup: true },
|
|
|
|
// If resizable is true, not popup.
|
|
{
|
|
features: "location,menubar,resizable=yes,scrollbars,status",
|
|
popup: false,
|
|
},
|
|
|
|
// If resizable is false, popup.
|
|
{ features: "location,menubar,resizable=0,scrollbars,status", popup: true },
|
|
|
|
// If scrollbars is false, popup.
|
|
{ features: "location,menubar,resizable,status", popup: true },
|
|
{ features: "location,menubar,resizable,scrollbars=0,status", popup: true },
|
|
|
|
// If status is false, popup.
|
|
{ features: "location,menubar,resizable,scrollbars", popup: true },
|
|
{ features: "location,menubar,resizable,scrollbars,status=0", popup: true },
|
|
|
|
// If either width or innerWidth is specified, popup.
|
|
{ features: "location,menubar,scrollbars,status,width=100", popup: true },
|
|
{
|
|
features: "location,menubar,scrollbars,status,innerWidth=100",
|
|
popup: true,
|
|
},
|
|
|
|
// outerWidth has no effect.
|
|
{
|
|
features: "location,menubar,scrollbars,status,outerWidth=100",
|
|
popup: false,
|
|
},
|
|
|
|
// left or screenX alone doesn't make it a popup.
|
|
{
|
|
features: "location,menubar,scrollbars,status,left=100",
|
|
popup: false,
|
|
},
|
|
{
|
|
features: "location,menubar,scrollbars,status,screenX=100",
|
|
popup: false,
|
|
},
|
|
|
|
// top or screenY alone doesn't make it a popup.
|
|
{
|
|
features: "location,menubar,scrollbars,status,top=100",
|
|
popup: false,
|
|
},
|
|
{
|
|
features: "location,menubar,scrollbars,status,screenY=100",
|
|
popup: false,
|
|
},
|
|
|
|
// height or innerHeight alone doesn't make it a popup.
|
|
{
|
|
features: "location,menubar,scrollbars,status,height=100",
|
|
popup: false,
|
|
},
|
|
{
|
|
features: "location,menubar,scrollbars,status,innerHeight=100",
|
|
popup: false,
|
|
},
|
|
// outerHeight has no effect.
|
|
{
|
|
features: "location,menubar,scrollbars,status,outerHeight=100",
|
|
popup: false,
|
|
},
|
|
|
|
// Most feature defaults to false if the feature is not empty.
|
|
// Specifying only some of them opens a popup.
|
|
{ features: "location", popup: true },
|
|
{ features: "toolbar", popup: true },
|
|
{ features: "location,toolbar", popup: true },
|
|
{ features: "menubar", popup: true },
|
|
{ features: "location,toolbar,menubar", popup: true },
|
|
{ features: "resizable", popup: true },
|
|
{ features: "scrollbars", popup: true },
|
|
{ features: "status", popup: true },
|
|
{ features: "left=500", popup: true },
|
|
{ features: "top=500", popup: true },
|
|
{ features: "left=500,top=500", popup: true },
|
|
{ features: "width=500", popup: true },
|
|
{ features: "height=500", popup: true },
|
|
{ features: "width=500, height=500", popup: true },
|
|
|
|
// Specifying unknown feature makes the feature not empty.
|
|
{ features: "someunknownfeature", popup: true },
|
|
|
|
// personalbar have no effect.
|
|
{ features: "personalbar=0", popup: true },
|
|
{ features: "personalbar=yes", popup: true },
|
|
{
|
|
features: "location,menubar,resizable,scrollbars,status,personalbar=0",
|
|
popup: false,
|
|
},
|
|
{
|
|
features: "location,menubar,resizable,scrollbars,status,personalbar=yes",
|
|
popup: false,
|
|
},
|
|
|
|
// noopener is removed before testing if feature is empty.
|
|
{ features: "noopener", popup: false },
|
|
|
|
// noreferrer is removed before testing if feature is empty.
|
|
{ features: "noreferrer", popup: false },
|
|
];
|
|
|
|
const WINDOW_FLAGS = {
|
|
CHROME_WINDOW_BORDERS: true,
|
|
CHROME_WINDOW_CLOSE: true,
|
|
CHROME_WINDOW_RESIZE: true,
|
|
CHROME_LOCATIONBAR: true,
|
|
CHROME_STATUSBAR: true,
|
|
CHROME_SCROLLBARS: true,
|
|
CHROME_TITLEBAR: true,
|
|
|
|
CHROME_MENUBAR: true,
|
|
CHROME_TOOLBAR: true,
|
|
CHROME_PERSONAL_TOOLBAR: true,
|
|
};
|
|
|
|
const POPUP_FLAGS = {
|
|
CHROME_WINDOW_BORDERS: true,
|
|
CHROME_WINDOW_CLOSE: true,
|
|
CHROME_WINDOW_RESIZE: true,
|
|
CHROME_LOCATIONBAR: true,
|
|
CHROME_STATUSBAR: true,
|
|
CHROME_SCROLLBARS: true,
|
|
CHROME_TITLEBAR: true,
|
|
|
|
CHROME_MENUBAR: false,
|
|
CHROME_TOOLBAR: false,
|
|
CHROME_PERSONAL_TOOLBAR: false,
|
|
};
|
|
|
|
async function test_patterns({ nonPopup }) {
|
|
for (const { features, popup } of PATTERNS) {
|
|
const BLANK_PAGE = "data:text/html,";
|
|
const OPEN_PAGE = "data:text/plain,hello";
|
|
const SCRIPT_PAGE = `data:text/html,<script>window.open("${OPEN_PAGE}", "", "${features}");</script>`;
|
|
|
|
async function testNewWindow(flags) {
|
|
await BrowserTestUtils.withNewTab(
|
|
{
|
|
gBrowser,
|
|
url: BLANK_PAGE,
|
|
},
|
|
async function(browser) {
|
|
const newWinPromise = BrowserTestUtils.waitForNewWindow();
|
|
BrowserTestUtils.loadURI(gBrowser, SCRIPT_PAGE);
|
|
|
|
const win = await newWinPromise;
|
|
const parentChromeFlags = getParentChromeFlags(win);
|
|
|
|
for (const [name, visible] of Object.entries(flags)) {
|
|
if (visible) {
|
|
Assert.equal(
|
|
!!(parentChromeFlags & Ci.nsIWebBrowserChrome[name]),
|
|
true,
|
|
`${name} should be present for features "${features}"`
|
|
);
|
|
} else {
|
|
Assert.equal(
|
|
!!(parentChromeFlags & Ci.nsIWebBrowserChrome[name]),
|
|
false,
|
|
`${name} should not be present for features "${features}"`
|
|
);
|
|
}
|
|
}
|
|
|
|
await BrowserTestUtils.closeWindow(win);
|
|
}
|
|
);
|
|
}
|
|
|
|
async function testNewTab() {
|
|
await BrowserTestUtils.withNewTab(
|
|
{
|
|
gBrowser,
|
|
url: BLANK_PAGE,
|
|
},
|
|
async function(browser) {
|
|
const newTabPromise = BrowserTestUtils.waitForNewTab(
|
|
gBrowser,
|
|
OPEN_PAGE
|
|
);
|
|
BrowserTestUtils.loadURI(gBrowser, SCRIPT_PAGE);
|
|
|
|
let tab = await newTabPromise;
|
|
BrowserTestUtils.removeTab(tab);
|
|
}
|
|
);
|
|
}
|
|
|
|
async function testCurrentTab() {
|
|
await BrowserTestUtils.withNewTab(
|
|
{
|
|
gBrowser,
|
|
url: BLANK_PAGE,
|
|
},
|
|
async function(browser) {
|
|
const pagePromise = BrowserTestUtils.browserLoaded(
|
|
browser,
|
|
false,
|
|
OPEN_PAGE
|
|
);
|
|
BrowserTestUtils.loadURI(gBrowser, SCRIPT_PAGE);
|
|
|
|
await pagePromise;
|
|
}
|
|
);
|
|
}
|
|
|
|
if (!popup) {
|
|
if (nonPopup == "window") {
|
|
await testNewWindow(WINDOW_FLAGS);
|
|
} else if (nonPopup == "tab") {
|
|
await testNewTab();
|
|
} else {
|
|
// current tab
|
|
await testCurrentTab();
|
|
}
|
|
} else {
|
|
await testNewWindow(POPUP_FLAGS);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Non-popup is opened in a new tab (default behavior).
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["browser.link.open_newwindow", 3]],
|
|
});
|
|
await test_patterns({ nonPopup: "tab" });
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// Non-popup is opened in a current tab.
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["browser.link.open_newwindow", 1]],
|
|
});
|
|
await test_patterns({ nonPopup: "current" });
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// Non-popup is opened in a new window.
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["browser.link.open_newwindow", 2]],
|
|
});
|
|
await test_patterns({ nonPopup: "window" });
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|