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