Bug 1135303 - Honor the browser.tabs.warnOnCloseOtherTabs for closing tabs to the right. r?dao
MozReview-Commit-ID: GzIAwQkwrKa
--- 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);
+});