Bug 1473187 - Add support for using both Shift and Ctrl/Cmd at the same time to select tabs. r?Gijs draft multiselect_shift+ctrl
authorAbdoulaye O. Ly <ablayelyfondou@gmail.com>
Sat, 07 Jul 2018 03:22:23 +0000
branchmultiselect_shift+ctrl
changeset 815617 a55c8144214bcad6a2bf43f9bf9d211667b03e20
parent 815328 b38b083c7bbcf8f06d0cd42950060cc787bdeb1b
push id115580
push userbmo:ablayelyfondou@gmail.com
push dateMon, 09 Jul 2018 15:28:12 +0000
reviewersGijs
bugs1473187
milestone63.0a1
Bug 1473187 - Add support for using both Shift and Ctrl/Cmd at the same time to select tabs. r?Gijs MozReview-Commit-ID: 3zqyjSAyIve
browser/base/content/tabbrowser.xml
browser/base/content/test/tabs/browser_multiselect_tabs_using_Shift.js
browser/base/content/test/tabs/browser_multiselect_tabs_using_Shift_and_Ctrl.js
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -2002,24 +2002,28 @@
       ]]>
       </handler>
       <handler event="mouseup">
         this.style.MozUserFocus = "";
       </handler>
 
       <handler event="click" button="0"><![CDATA[
         if (Services.prefs.getBoolPref("browser.tabs.multiselect")) {
-          if (event.shiftKey) {
+          let shiftKey = event.shiftKey;
+          let accelKey = event.getModifierState("Accel");
+          if (shiftKey) {
             const lastSelectedTab = gBrowser.lastMultiSelectedTab;
-            gBrowser.clearMultiSelectedTabs(true);
+            if (!accelKey) {
+              gBrowser.clearMultiSelectedTabs(true);
+            }
             gBrowser.addRangeToMultiSelectedTabs(lastSelectedTab, this);
             gBrowser.selectedTab = lastSelectedTab;
             return;
           }
-          if (event.getModifierState("Accel")) {
+          if (accelKey) {
             // Ctrl (Cmd for mac) key is pressed
             if (this.multiselected) {
               gBrowser.removeFromMultiSelectedTabs(this);
               if (this == gBrowser.selectedTab) {
                 gBrowser.switchToNextMultiSelectedTab();
               }
               gBrowser.updateActiveTabMultiSelectState();
             } else if (this != gBrowser.selectedTab) {
--- a/browser/base/content/test/tabs/browser_multiselect_tabs_using_Shift.js
+++ b/browser/base/content/test/tabs/browser_multiselect_tabs_using_Shift.js
@@ -117,24 +117,8 @@ add_task(async function itemsInTheCollec
 
     BrowserTestUtils.removeTab(tab1);
     BrowserTestUtils.removeTab(tab2);
     BrowserTestUtils.removeTab(tab3);
     BrowserTestUtils.removeTab(tab4);
     BrowserTestUtils.removeTab(tab5);
 });
 
-add_task(async function shiftHasHigherPrecOverCtrl() {
-    const tab1 = await addTab();
-    const tab2 = await addTab();
-
-    await BrowserTestUtils.switchTab(gBrowser, tab1);
-
-    is(gBrowser.multiSelectedTabsCount, 0, "No tab is multi-selected");
-
-    info("Click on tab2 with both Ctrl/Cmd and Shift down");
-    await triggerClickOn(tab2, { ctrlKey: true, shiftKey: true });
-
-    is(gBrowser.multiSelectedTabsCount, 2, "Both tab1 and tab2 are multi-selected");
-
-    BrowserTestUtils.removeTab(tab1);
-    BrowserTestUtils.removeTab(tab2);
-});
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabs/browser_multiselect_tabs_using_Shift_and_Ctrl.js
@@ -0,0 +1,83 @@
+const PREF_MULTISELECT_TABS = "browser.tabs.multiselect";
+
+add_task(async function setPref() {
+  await SpecialPowers.pushPrefEnv({
+    set: [
+      [PREF_MULTISELECT_TABS, true]
+    ]
+  });
+});
+
+add_task(async function selectionWithShiftPreviously() {
+  const tab1 = await addTab();
+  const tab2 = await addTab();
+  const tab3 = await addTab();
+  const tab4 = await addTab();
+  const tab5 = await addTab();
+
+  await BrowserTestUtils.switchTab(gBrowser, tab3);
+
+  is(gBrowser.multiSelectedTabsCount, 0, "No tab is multi-selected");
+
+  info("Click on tab5 with Shift down");
+  await triggerClickOn(tab5, { shiftKey: true });
+
+  is(gBrowser.selectedTab, tab3, "Tab3 has focus");
+  ok(!tab1.multiselected, "Tab1 is not multi-selected");
+  ok(!tab2.multiselected, "Tab2 is not multi-selected ");
+  ok(tab3.multiselected, "Tab3 is multi-selected");
+  ok(tab4.multiselected, "Tab4 is multi-selected");
+  ok(tab5.multiselected, "Tab5 is multi-selected");
+  is(gBrowser.multiSelectedTabsCount, 3, "Three tabs are multi-selected");
+
+  info("Click on tab1 with both Ctrl/Cmd and Shift down");
+  await triggerClickOn(tab1, { ctrlKey: true, shiftKey: true });
+
+  is(gBrowser.selectedTab, tab3, "Tab3 has focus");
+  ok(tab1.multiselected, "Tab1 is multi-selected");
+  ok(tab2.multiselected, "Tab2 is multi-selected ");
+  ok(tab3.multiselected, "Tab3 is multi-selected");
+  ok(tab4.multiselected, "Tab4 is multi-selected");
+  ok(tab5.multiselected, "Tab5 is multi-selected");
+  is(gBrowser.multiSelectedTabsCount, 5, "Five tabs are multi-selected");
+
+  for (let tab of [tab1, tab2, tab3, tab4, tab5])
+    BrowserTestUtils.removeTab(tab);
+});
+
+add_task(async function selectionWithCtrlPreviously() {
+  const tab1 = await addTab();
+  const tab2 = await addTab();
+  const tab3 = await addTab();
+  const tab4 = await addTab();
+  const tab5 = await addTab();
+
+  await BrowserTestUtils.switchTab(gBrowser, tab1);
+
+  is(gBrowser.multiSelectedTabsCount, 0, "No tab is multi-selected");
+
+  info("Click on tab3 with Ctrl key down");
+  await triggerClickOn(tab5, { ctrlKey: true });
+
+  is(gBrowser.selectedTab, tab1, "Tab1 has focus");
+  ok(tab1.multiselected, "Tab1 is multi-selected");
+  ok(!tab2.multiselected, "Tab2 is not multi-selected ");
+  ok(tab3.multiselected, "Tab3 is multi-selected");
+  ok(!tab4.multiselected, "Tab4 is not multi-selected");
+  ok(!tab5.multiselected, "Tab5 is not multi-selected");
+  is(gBrowser.multiSelectedTabsCount, 2, "Two tabs are multi-selected");
+
+  info("Click on tab5 with both Ctrl/Cmd and Shift down");
+  await triggerClickOn(tab5, { ctrlKey: true, shiftKey: true });
+
+  is(gBrowser.selectedTab, tab1, "Tab3 has focus");
+  ok(tab1.multiselected, "Tab1 is multi-selected");
+  ok(!tab2.multiselected, "Tab2 is not multi-selected ");
+  ok(tab3.multiselected, "Tab3 is multi-selected");
+  ok(tab4.multiselected, "Tab4 is multi-selected");
+  ok(tab5.multiselected, "Tab5 is multi-selected");
+  is(gBrowser.multiSelectedTabsCount, 4, "Four tabs are multi-selected");
+
+  for (let tab of [tab1, tab2, tab3, tab4, tab5])
+    BrowserTestUtils.removeTab(tab);
+});