Bug 1135303 - Honor the browser.tabs.warnOnCloseOtherTabs for closing tabs to the right. r?dao draft
authorJared Wein <jwein@mozilla.com>
Thu, 07 Dec 2017 13:33:59 -0500
changeset 709188 c6d36c9cd3c319fd24b3d2c846a19a20945d6ae4
parent 709018 e30c06a1074c2455f47e0bafb9bb84ec1a09d682
child 743352 75843cf5632b3ae891c516716d12319cd6f3ba34
push id92566
push userbmo:jaws@mozilla.com
push dateThu, 07 Dec 2017 18:34:29 +0000
reviewersdao
bugs1135303
milestone59.0a1
Bug 1135303 - Honor the browser.tabs.warnOnCloseOtherTabs for closing tabs to the right. r?dao MozReview-Commit-ID: GzIAwQkwrKa
browser/base/content/tabbrowser.xml
browser/base/content/test/tabs/browser.ini
browser/base/content/test/tabs/browser_closeOtherTabs.js
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -2948,23 +2948,22 @@
           var buttonPressed =
             ps.confirmEx(window,
                          gTabBrowserBundle.GetStringFromName("tabs.closeWarningTitle"),
                          warningMessage,
                          (ps.BUTTON_TITLE_IS_STRING * ps.BUTTON_POS_0)
                          + (ps.BUTTON_TITLE_CANCEL * ps.BUTTON_POS_1),
                          gTabBrowserBundle.GetStringFromName("tabs.closeButtonMultiple"),
                          null, null,
-                         aCloseTabs == this.closingTabsEnum.ALL ?
-                           gTabBrowserBundle.GetStringFromName("tabs.closeWarningPromptMe") : null,
+                         gTabBrowserBundle.GetStringFromName("tabs.closeWarningPromptMe"),
                          warnOnClose);
           var reallyClose = (buttonPressed == 0);
 
           // don't set the pref unless they press OK and it's false
-          if (aCloseTabs == this.closingTabsEnum.ALL && reallyClose && !warnOnClose.value)
+          if (reallyClose && !warnOnClose.value)
             Services.prefs.setBoolPref(pref, false);
 
           return reallyClose;
         ]]>
       </body>
       </method>
 
       <method name="getTabsToTheEndFrom">
--- a/browser/base/content/test/tabs/browser.ini
+++ b/browser/base/content/test/tabs/browser.ini
@@ -1,16 +1,17 @@
 [DEFAULT]
 support-files =
   dummy_page.html
   test_bug1358314.html
 
 [browser_abandonment_telemetry.js]
 [browser_accessibility_indicator.js]
 [browser_allow_process_switches_despite_related_browser.js]
+[browser_closeOtherTabs.js]
 [browser_contextmenu_openlink_after_tabnavigated.js]
 [browser_isLocalAboutURI.js]
 [browser_tabCloseProbes.js]
 [browser_tabSpinnerProbe.js]
 skip-if = !e10s # Tab spinner is e10s only.
 [browser_tabSwitchPrintPreview.js]
 skip-if = os == 'mac'
 [browser_navigatePinnedTab.js]
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabs/browser_closeOtherTabs.js
@@ -0,0 +1,70 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+let oldPrompt;
+let expectedPrompt;
+let dialogReturnValue;
+let warnOnCloseValue;
+let pref = "browser.tabs.warnOnCloseOtherTabs";
+const BUTTON_OK = 0;
+const BUTTON_CANCEL = 1;
+
+add_task(function setup() {
+  oldPrompt = Services.prompt;
+  Services.prompt = {
+    confirmEx: (unused1, unused2, unused3, unused4, unused5, unused6, unused7, unused8, warnOnClose) => {
+      ok(expectedPrompt, (expectedPrompt ? "Should" : "Shouldn't") + " show prompt");
+      warnOnClose.value = warnOnCloseValue;
+      return dialogReturnValue;
+    }
+  };
+  registerCleanupFunction(() => {
+    Services.prompt = oldPrompt;
+  })
+});
+
+function addTabs(numberOfTabsToAdd) {
+  for (let i = 0; i < numberOfTabsToAdd; i++) {
+    BrowserTestUtils.addTab(gBrowser, "about:blank", { skipAnimation: true });
+  }
+}
+
+add_task(async function test_closeOtherTabs() {
+  is(gBrowser.tabs.length, 1, "There should only be one tab to start the test");
+  ok(Services.prefs.getBoolPref(pref), "warnOnCloseOtherTabs should be set to true by default");
+  expectedPrompt = true;
+  dialogReturnValue = BUTTON_CANCEL;
+  warnOnCloseValue = true;
+  addTabs(3);
+
+  gBrowser.removeTabsToTheEndFrom(gBrowser.tabs[0]);
+  is(gBrowser.tabs.length, 4, "All four tabs should still be open");
+  gBrowser.removeAllTabsBut(gBrowser.tabs[0]);
+  is(gBrowser.tabs.length, 4, "All four tabs should still be open");
+
+  dialogReturnValue = BUTTON_OK;
+  gBrowser.removeTabsToTheEndFrom(gBrowser.tabs[0]);
+  is(gBrowser.tabs.length, 1, "Only one tab should remain");
+  addTabs(3);
+  warnOnCloseValue = false;
+  gBrowser.removeAllTabsBut(gBrowser.tabs[0]);
+  // For reasons I don't understand, removeAllTabsBut seems to return
+  // before the tabs have been removed whereas I don't see that same
+  // behavior with removeTabsToTheEndFrom.
+  await TestUtils.waitForCondition(() => gBrowser.tabs.length == 1, "Tab length should be 1");
+  is(gBrowser.tabs.length, 1, "Only one tab should remain");
+  ok(!Services.prefs.getBoolPref(pref), "warnOnCloseOtherTabs should now be false");
+
+  addTabs(3);
+  expectedPrompt = false;
+  gBrowser.removeTabsToTheEndFrom(gBrowser.tabs[0]);
+  is(gBrowser.tabs.length, 1, "Only one tab should remain");
+  addTabs(3);
+  gBrowser.removeAllTabsBut(gBrowser.tabs[0]);
+  await TestUtils.waitForCondition(() => gBrowser.tabs.length == 1, "Tab length should be 1");
+  is(gBrowser.tabs.length, 1, "Only one tab should remain");
+
+  Services.prefs.clearUserPref(pref);
+});