From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../test/general/browser_fullscreen-window-open.js | 366 +++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 browser/base/content/test/general/browser_fullscreen-window-open.js (limited to 'browser/base/content/test/general/browser_fullscreen-window-open.js') diff --git a/browser/base/content/test/general/browser_fullscreen-window-open.js b/browser/base/content/test/general/browser_fullscreen-window-open.js new file mode 100644 index 0000000000..2b21e34e92 --- /dev/null +++ b/browser/base/content/test/general/browser_fullscreen-window-open.js @@ -0,0 +1,366 @@ +/* eslint-disable mozilla/no-arbitrary-setTimeout */ + +const PREF_DISABLE_OPEN_NEW_WINDOW = + "browser.link.open_newwindow.disabled_in_fullscreen"; +const PREF_BLOCK_TOPLEVEL_DATA = + "security.data_uri.block_toplevel_data_uri_navigations"; +const isOSX = Services.appinfo.OS === "Darwin"; + +const TEST_FILE = "file_fullscreen-window-open.html"; +const gHttpTestRoot = getRootDirectory(gTestPath).replace( + "chrome://mochitests/content/", + "http://127.0.0.1:8888/" +); + +var newWin; +var newBrowser; + +async function test() { + waitForExplicitFinish(); + + Services.prefs.setBoolPref(PREF_DISABLE_OPEN_NEW_WINDOW, true); + Services.prefs.setBoolPref(PREF_BLOCK_TOPLEVEL_DATA, false); + + newWin = await BrowserTestUtils.openNewBrowserWindow(); + newBrowser = newWin.gBrowser; + await promiseTabLoadEvent(newBrowser.selectedTab, gHttpTestRoot + TEST_FILE); + + // Enter browser fullscreen mode. + newWin.BrowserFullScreen(); + + runNextTest(); +} + +registerCleanupFunction(async function () { + // Exit browser fullscreen mode. + newWin.BrowserFullScreen(); + + await BrowserTestUtils.closeWindow(newWin); + + Services.prefs.clearUserPref(PREF_DISABLE_OPEN_NEW_WINDOW); + Services.prefs.clearUserPref(PREF_BLOCK_TOPLEVEL_DATA); +}); + +var gTests = [ + test_open, + test_open_with_size, + test_open_with_pos, + test_open_with_outerSize, + test_open_with_innerSize, + test_open_with_dialog, + test_open_when_open_new_window_by_pref, + test_open_with_pref_to_disable_in_fullscreen, + test_open_from_chrome, +]; + +function runNextTest() { + let testCase = gTests.shift(); + if (testCase) { + executeSoon(testCase); + } else { + finish(); + } +} + +// Test for window.open() with no feature. +function test_open() { + waitForTabOpen({ + message: { + title: "test_open", + param: "", + }, + finalizeFn() {}, + }); +} + +// Test for window.open() with width/height. +function test_open_with_size() { + waitForTabOpen({ + message: { + title: "test_open_with_size", + param: "width=400,height=400", + }, + finalizeFn() {}, + }); +} + +// Test for window.open() with top/left. +function test_open_with_pos() { + waitForTabOpen({ + message: { + title: "test_open_with_pos", + param: "top=200,left=200", + }, + finalizeFn() {}, + }); +} + +// Test for window.open() with outerWidth/Height. +function test_open_with_outerSize() { + let [outerWidth, outerHeight] = [newWin.outerWidth, newWin.outerHeight]; + waitForTabOpen({ + message: { + title: "test_open_with_outerSize", + param: "outerWidth=200,outerHeight=200", + }, + successFn() { + is(newWin.outerWidth, outerWidth, "Don't change window.outerWidth."); + is(newWin.outerHeight, outerHeight, "Don't change window.outerHeight."); + }, + finalizeFn() {}, + }); +} + +// Test for window.open() with innerWidth/Height. +function test_open_with_innerSize() { + let [innerWidth, innerHeight] = [newWin.innerWidth, newWin.innerHeight]; + waitForTabOpen({ + message: { + title: "test_open_with_innerSize", + param: "innerWidth=200,innerHeight=200", + }, + successFn() { + is(newWin.innerWidth, innerWidth, "Don't change window.innerWidth."); + is(newWin.innerHeight, innerHeight, "Don't change window.innerHeight."); + }, + finalizeFn() {}, + }); +} + +// Test for window.open() with dialog. +function test_open_with_dialog() { + waitForTabOpen({ + message: { + title: "test_open_with_dialog", + param: "dialog=yes", + }, + finalizeFn() {}, + }); +} + +// Test for window.open() +// when "browser.link.open_newwindow" is nsIBrowserDOMWindow.OPEN_NEWWINDOW +function test_open_when_open_new_window_by_pref() { + const PREF_NAME = "browser.link.open_newwindow"; + Services.prefs.setIntPref(PREF_NAME, Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW); + is( + Services.prefs.getIntPref(PREF_NAME), + Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW, + PREF_NAME + " is nsIBrowserDOMWindow.OPEN_NEWWINDOW at this time" + ); + + waitForTabOpen({ + message: { + title: "test_open_when_open_new_window_by_pref", + param: "width=400,height=400", + }, + finalizeFn() { + Services.prefs.clearUserPref(PREF_NAME); + }, + }); +} + +// Test for the pref, "browser.link.open_newwindow.disabled_in_fullscreen" +function test_open_with_pref_to_disable_in_fullscreen() { + Services.prefs.setBoolPref(PREF_DISABLE_OPEN_NEW_WINDOW, false); + + waitForWindowOpen({ + message: { + title: "test_open_with_pref_disabled_in_fullscreen", + param: "width=400,height=400", + }, + finalizeFn() { + Services.prefs.setBoolPref(PREF_DISABLE_OPEN_NEW_WINDOW, true); + }, + }); +} + +// Test for window.open() called from chrome context. +function test_open_from_chrome() { + waitForWindowOpenFromChrome({ + message: { + title: "test_open_from_chrome", + param: "", + option: "noopener", + }, + finalizeFn() {}, + }); +} + +function waitForTabOpen(aOptions) { + let message = aOptions.message; + + if (!message.title) { + ok(false, "Can't get message.title."); + aOptions.finalizeFn(); + runNextTest(); + return; + } + + info("Running test: " + message.title); + + let onTabOpen = function onTabOpen(aEvent) { + newBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen, true); + + let tab = aEvent.target; + whenTabLoaded(tab, function () { + is( + tab.linkedBrowser.contentTitle, + message.title, + "Opened Tab is expected: " + message.title + ); + + if (aOptions.successFn) { + aOptions.successFn(); + } + + newBrowser.removeTab(tab); + finalize(); + }); + }; + newBrowser.tabContainer.addEventListener("TabOpen", onTabOpen, true); + + let finalize = function () { + aOptions.finalizeFn(); + info("Finished: " + message.title); + runNextTest(); + }; + + const URI = + "data:text/html;charset=utf-8," + + message.title + + "<%2Ftitle><%2Fhead><body><%2Fbody><%2Fhtml>"; + + executeWindowOpenInContent({ + uri: URI, + title: message.title, + option: message.param, + }); +} + +function waitForWindowOpen(aOptions) { + let message = aOptions.message; + let url = aOptions.url || "about:blank"; + + if (!message.title) { + ok(false, "Can't get message.title"); + aOptions.finalizeFn(); + runNextTest(); + return; + } + + info("Running test: " + message.title); + + let onFinalize = function () { + aOptions.finalizeFn(); + + info("Finished: " + message.title); + runNextTest(); + }; + + let listener = new WindowListener( + message.title, + AppConstants.BROWSER_CHROME_URL, + { + onSuccess: aOptions.successFn, + onFinalize, + } + ); + Services.wm.addListener(listener); + + executeWindowOpenInContent({ + uri: url, + title: message.title, + option: message.param, + }); +} + +function executeWindowOpenInContent(aParam) { + SpecialPowers.spawn( + newBrowser.selectedBrowser, + [JSON.stringify(aParam)], + async function (dataTestParam) { + let testElm = content.document.getElementById("test"); + testElm.setAttribute("data-test-param", dataTestParam); + testElm.click(); + } + ); +} + +function waitForWindowOpenFromChrome(aOptions) { + let message = aOptions.message; + let url = aOptions.url || "about:blank"; + + if (!message.title) { + ok(false, "Can't get message.title"); + aOptions.finalizeFn(); + runNextTest(); + return; + } + + info("Running test: " + message.title); + + let onFinalize = function () { + aOptions.finalizeFn(); + + info("Finished: " + message.title); + runNextTest(); + }; + + let listener = new WindowListener( + message.title, + AppConstants.BROWSER_CHROME_URL, + { + onSuccess: aOptions.successFn, + onFinalize, + } + ); + Services.wm.addListener(listener); + + newWin.open(url, message.title, message.option); +} + +function WindowListener(aTitle, aUrl, aCallBackObj) { + this.test_title = aTitle; + this.test_url = aUrl; + this.callback_onSuccess = aCallBackObj.onSuccess; + this.callBack_onFinalize = aCallBackObj.onFinalize; +} +WindowListener.prototype = { + test_title: null, + test_url: null, + callback_onSuccess: null, + callBack_onFinalize: null, + + onOpenWindow(aXULWindow) { + Services.wm.removeListener(this); + + let domwindow = aXULWindow.docShell.domWindow; + let onLoad = aEvent => { + is( + domwindow.document.location.href, + this.test_url, + "Opened Window is expected: " + this.test_title + ); + if (this.callback_onSuccess) { + this.callback_onSuccess(); + } + + domwindow.removeEventListener("load", onLoad, true); + + // wait for trasition to fullscreen on OSX Lion later + if (isOSX) { + setTimeout(() => { + domwindow.close(); + executeSoon(this.callBack_onFinalize); + }, 3000); + } else { + domwindow.close(); + executeSoon(this.callBack_onFinalize); + } + }; + domwindow.addEventListener("load", onLoad, true); + }, + onCloseWindow(aXULWindow) {}, + QueryInterface: ChromeUtils.generateQI(["nsIWindowMediatorListener"]), +}; -- cgit v1.2.3