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 --- .../browser_beforeunload_duplicate_dialogs.js | 114 +++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js (limited to 'browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js') diff --git a/browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js b/browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js new file mode 100644 index 0000000000..8a77f01ce4 --- /dev/null +++ b/browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js @@ -0,0 +1,114 @@ +const TEST_PAGE = + "http://mochi.test:8888/browser/browser/base/content/test/general/file_double_close_tab.html"; + +const CONTENT_PROMPT_SUBDIALOG = Services.prefs.getBoolPref( + "prompts.contentPromptSubDialog", + false +); + +var expectingDialog = false; +var wantToClose = true; +var resolveDialogPromise; + +function onTabModalDialogLoaded(node) { + ok( + !CONTENT_PROMPT_SUBDIALOG, + "Should not be using content prompt subdialogs." + ); + ok(expectingDialog, "Should be expecting this dialog."); + expectingDialog = false; + if (wantToClose) { + // This accepts the dialog, closing it + node.querySelector(".tabmodalprompt-button0").click(); + } else { + // This keeps the page open + node.querySelector(".tabmodalprompt-button1").click(); + } + if (resolveDialogPromise) { + resolveDialogPromise(); + } +} + +function onCommonDialogLoaded(promptWindow) { + ok(CONTENT_PROMPT_SUBDIALOG, "Should be using content prompt subdialogs."); + ok(expectingDialog, "Should be expecting this dialog."); + expectingDialog = false; + let dialog = promptWindow.Dialog; + if (wantToClose) { + // This accepts the dialog, closing it. + dialog.ui.button0.click(); + } else { + // This keeps the page open + dialog.ui.button1.click(); + } + if (resolveDialogPromise) { + resolveDialogPromise(); + } +} + +SpecialPowers.pushPrefEnv({ + set: [["dom.require_user_interaction_for_beforeunload", false]], +}); + +// Listen for the dialog being created +Services.obs.addObserver(onTabModalDialogLoaded, "tabmodal-dialog-loaded"); +Services.obs.addObserver(onCommonDialogLoaded, "common-dialog-loaded"); +registerCleanupFunction(() => { + Services.prefs.clearUserPref("browser.tabs.warnOnClose"); + Services.obs.removeObserver(onTabModalDialogLoaded, "tabmodal-dialog-loaded"); + Services.obs.removeObserver(onCommonDialogLoaded, "common-dialog-loaded"); +}); + +add_task(async function closeLastTabInWindow() { + let newWin = await promiseOpenAndLoadWindow({}, true); + let firstTab = newWin.gBrowser.selectedTab; + await promiseTabLoadEvent(firstTab, TEST_PAGE); + let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin); + expectingDialog = true; + // close tab: + firstTab.closeButton.click(); + await windowClosedPromise; + ok(!expectingDialog, "There should have been a dialog."); + ok(newWin.closed, "Window should be closed."); +}); + +add_task(async function closeWindowWithMultipleTabsIncludingOneBeforeUnload() { + Services.prefs.setBoolPref("browser.tabs.warnOnClose", false); + let newWin = await promiseOpenAndLoadWindow({}, true); + let firstTab = newWin.gBrowser.selectedTab; + await promiseTabLoadEvent(firstTab, TEST_PAGE); + await promiseTabLoadEvent( + BrowserTestUtils.addTab(newWin.gBrowser), + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + "http://example.com/" + ); + let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin); + expectingDialog = true; + newWin.BrowserTryToCloseWindow(); + await windowClosedPromise; + ok(!expectingDialog, "There should have been a dialog."); + ok(newWin.closed, "Window should be closed."); + Services.prefs.clearUserPref("browser.tabs.warnOnClose"); +}); + +add_task(async function closeWindoWithSingleTabTwice() { + let newWin = await promiseOpenAndLoadWindow({}, true); + let firstTab = newWin.gBrowser.selectedTab; + await promiseTabLoadEvent(firstTab, TEST_PAGE); + let windowClosedPromise = BrowserTestUtils.domWindowClosed(newWin); + expectingDialog = true; + wantToClose = false; + let firstDialogShownPromise = new Promise((resolve, reject) => { + resolveDialogPromise = resolve; + }); + firstTab.closeButton.click(); + await firstDialogShownPromise; + info("Got initial dialog, now trying again"); + expectingDialog = true; + wantToClose = true; + resolveDialogPromise = null; + firstTab.closeButton.click(); + await windowClosedPromise; + ok(!expectingDialog, "There should have been a dialog."); + ok(newWin.closed, "Window should be closed."); +}); -- cgit v1.2.3