From cc2f6487af19078edff7c8f1c340940c13194ec8 Mon Sep 17 00:00:00 2001 From: Bernard Igiri <bigiri@mozilla.com> Date: Tue, 13 Dec 2022 14:27:17 +0000 Subject: [PATCH] Bug 1799393 - Prevent hidden Fx View tab from triggering the closing multiple tabs warning in Windows and Linux r=Gijs Updated the tab closing prompt logic to use the number of visible tabs open to determine if the prompt should show in Windows and Linux. Differential Revision: https://phabricator.services.mozilla.com/D162627 --- browser/components/BrowserGlue.sys.mjs | 9 +-- .../browser/browser_tab_on_close_warning.js | 57 +++++++++++++++---- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs index 5208cd167336f..f14f07652a99e 100644 --- a/browser/components/BrowserGlue.sys.mjs +++ b/browser/components/BrowserGlue.sys.mjs @@ -3073,8 +3073,8 @@ BrowserGlue.prototype = { return; } - var windowcount = 0; - var pagecount = 0; + let windowcount = 0; + let pagecount = 0; let pinnedcount = 0; for (let win of lazy.BrowserWindowTracker.orderedWindows) { if (win.closed) { @@ -3084,10 +3084,7 @@ BrowserGlue.prototype = { let tabbrowser = win.gBrowser; if (tabbrowser) { pinnedcount += tabbrowser._numPinnedTabs; - pagecount += - tabbrowser.browsers.length - - tabbrowser._numPinnedTabs - - tabbrowser._removingTabs.length; + pagecount += tabbrowser.visibleTabs.length - tabbrowser._numPinnedTabs; } } diff --git a/browser/components/firefoxview/tests/browser/browser_tab_on_close_warning.js b/browser/components/firefoxview/tests/browser/browser_tab_on_close_warning.js index 846de6fd06b10..cd6d30f3d1c00 100644 --- a/browser/components/firefoxview/tests/browser/browser_tab_on_close_warning.js +++ b/browser/components/firefoxview/tests/browser/browser_tab_on_close_warning.js @@ -3,26 +3,61 @@ "use strict"; +class DialogObserver { + constructor() { + this.wasOpened = false; + Services.obs.addObserver(this, "common-dialog-loaded"); + } + cleanup() { + Services.obs.removeObserver(this, "common-dialog-loaded"); + } + observe(win, topic) { + if (topic == "common-dialog-loaded") { + this.wasOpened = true; + // Close dialog. + win.document + .querySelector("dialog") + .getButton("cancel") + .click(); + } + } +} + add_task( async function on_close_warning_should_not_show_for_firefox_view_tab() { - let dialogOpened = false; - function setDialogOpened() { - dialogOpened = true; - } - Services.obs.addObserver(setDialogOpened, "common-dialog-loaded"); + const dialogObserver = new DialogObserver(); await SpecialPowers.pushPrefEnv({ set: [["browser.tabs.warnOnClose", true]], }); info("Opening window..."); - const win = await BrowserTestUtils.openNewBrowserWindow({ - waitForTabURL: "about:newtab", - }); + const win = await BrowserTestUtils.openNewBrowserWindow(); info("Opening Firefox View tab..."); await openFirefoxViewTab(win); - // Trigger warnAboutClosingWindow() + info("Trigger warnAboutClosingWindow()"); win.BrowserTryToCloseWindow(); await BrowserTestUtils.closeWindow(win); - ok(!dialogOpened, "Dialog was not opened"); - Services.obs.removeObserver(setDialogOpened, "common-dialog-loaded"); + ok(!dialogObserver.wasOpened, "Dialog was not opened"); + dialogObserver.cleanup(); + } +); + +add_task( + async function on_close_warning_should_not_show_for_firefox_view_tab_non_macos() { + let initialTab = gBrowser.selectedTab; + const dialogObserver = new DialogObserver(); + await SpecialPowers.pushPrefEnv({ + set: [ + ["browser.tabs.warnOnClose", true], + ["browser.warnOnQuit", true], + ], + }); + info("Opening Firefox View tab..."); + await openFirefoxViewTab(window); + info('Trigger "quit-application-requested"'); + canQuitApplication("lastwindow", "close-button"); + ok(!dialogObserver.wasOpened, "Dialog was not opened"); + await BrowserTestUtils.switchTab(gBrowser, initialTab); + closeFirefoxViewTab(window); + dialogObserver.cleanup(); } ); -- GitLab