tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit bf027a10140b8904d111126cd4c66143ebb4b828
parent ced62a04f4ed340ba1a7970ab2efac69fbd12cf6
Author: Gabriel Astorgano <gaastorgano@gmail.com>
Date:   Fri,  2 Jan 2026 16:17:41 +0000

Bug 1970541 Precompute unmovingTabStripItems and dropIndexSearchArray r=sthompson,tabbrowser-reviewers

Moves data structure creations to the on_dragstart event in _dragData. Apply their
use on drag-and-drop.js and tab-stacking.js

Differential Revision: https://phabricator.services.mozilla.com/D264661

Diffstat:
Mbrowser/components/tabbrowser/content/drag-and-drop.js | 58+++++++++++++++++++++++++++++++---------------------------
Mbrowser/components/tabbrowser/content/tab-stacking.js | 18++++++------------
2 files changed, 37 insertions(+), 39 deletions(-)

diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js @@ -1114,6 +1114,11 @@ let movingTabs = tab.multiselected ? gBrowser.selectedTabs : [tab]; let movingTabsSet = new Set(movingTabs); + let unmovingTabStripItems = + this._tabbrowserTabs.dragAndDropElements.filter( + t => !movingTabsSet.has(t) + ); + let dropIndexSearchArray = [tab, ...unmovingTabStripItems]; let dropEffect = this.getDropEffectForTabDrag(event); let isMovingInTabStrip = !fromTabList && dropEffect == "move"; @@ -1135,6 +1140,8 @@ screenY: event.screenY, movingTabs, movingTabsSet, + dropIndexSearchArray, + unmovingTabStripItems, fromTabList, tabGroupCreationColor: gBrowser.tabGroupMenu.nextUnusedColor, expandGroupOnDrop: collapseTabGroupDuringDrag, @@ -1710,7 +1717,7 @@ // * We're doing a binary search in order to reduce the amount of // tabs we need to check. - tabs = tabs.filter(t => !movingTabs.includes(t) || t == draggedTab); + let dropIndexSearchArray = dragData.dropIndexSearchArray; let firstTabCenterX = firstMovingTabScreenX + translateX + tabWidth / 2; let lastTabCenterX = lastMovingTabScreenX + translateX + tabWidth / 2; let tabCenterX = directionX ? lastTabCenterX : firstTabCenterX; @@ -1759,18 +1766,18 @@ }; let low = 0; - let high = tabs.length - 1; + let high = dropIndexSearchArray.length - 1; let newIndex = -1; let oldIndex = dragData.animDropElementIndex ?? movingTabs[0].elementIndex; while (low <= high) { let mid = Math.floor((low + high) / 2); - if (tabs[mid] == draggedTab && ++mid > high) { + if (dropIndexSearchArray[mid] == draggedTab && ++mid > high) { break; } - let [shiftX, shiftY] = getTabShift(tabs[mid], oldIndex); - screenX = tabs[mid].screenX + shiftX; - screenY = tabs[mid].screenY + shiftY; + let [shiftX, shiftY] = getTabShift(dropIndexSearchArray[mid], oldIndex); + screenX = dropIndexSearchArray[mid].screenX + shiftX; + screenY = dropIndexSearchArray[mid].screenY + shiftY; if (screenY + tabHeight < tabCenterY) { low = mid + 1; @@ -1785,12 +1792,12 @@ ) { low = mid + 1; } else { - newIndex = tabs[mid].elementIndex; + newIndex = dropIndexSearchArray[mid].elementIndex; break; } } - if (newIndex >= oldIndex && newIndex < tabs.length) { + if (newIndex >= oldIndex && newIndex < dropIndexSearchArray.length) { newIndex++; } @@ -1803,17 +1810,18 @@ } dragData.animDropElementIndex = newIndex; - dragData.dropElement = tabs[Math.min(newIndex, tabs.length - 1)]; - dragData.dropBefore = newIndex < tabs.length; + dragData.dropElement = + dropIndexSearchArray[ + Math.min(newIndex, dropIndexSearchArray.length - 1) + ]; + dragData.dropBefore = newIndex < dropIndexSearchArray.length; // Shift background tabs to leave a gap where the dragged tab // would currently be dropped. - for (let tab of tabs) { - if (tab != draggedTab) { - let [shiftX, shiftY] = getTabShift(tab, newIndex); - tab.style.transform = - shiftX || shiftY ? `translate(${shiftX}px, ${shiftY}px)` : ""; - } + for (let tab of dragData.unmovingTabStripItems) { + let [shiftX, shiftY] = getTabShift(tab, newIndex); + tab.style.transform = + shiftX || shiftY ? `translate(${shiftX}px, ${shiftY}px)` : ""; } } @@ -1932,7 +1940,7 @@ dragData.translatePos = translate; - tabs = tabs.filter(t => !movingTabsSet.has(t) || t == draggedTab); + let dropIndexSearchArray = dragData.dropIndexSearchArray; /** * When the `draggedTab` is just starting to move, the `draggedTab` is in @@ -2057,13 +2065,13 @@ (screenForward ? lastMovingTabScreen : firstMovingTabScreen) + translate; let low = 0; - let high = tabs.length - 1; + let high = dropIndexSearchArray.length - 1; while (low <= high) { let mid = Math.floor((low + high) / 2); - if (tabs[mid] == draggedTab && ++mid > high) { + if (dropIndexSearchArray[mid] == draggedTab && ++mid > high) { break; } - let element = tabs[mid]; + let element = dropIndexSearchArray[mid]; let elementForSize = elementToMove(element); screen = elementForSize[screenAxis] + @@ -2124,8 +2132,8 @@ // valuë of `movingTabs[0].elementIndex`. In this case, the drop element // shouldn't be a moving tab, so keep it `undefined`. let lastPossibleDropElement = this._rtlMode - ? tabs.find(t => t != draggedTab) - : tabs.findLast(t => t != draggedTab); + ? dropIndexSearchArray.find(t => t != draggedTab) + : dropIndexSearchArray.findLast(t => t != draggedTab); let maxElementIndexForDropElement = lastPossibleDropElement?.elementIndex; if (Number.isInteger(maxElementIndexForDropElement)) { @@ -2332,11 +2340,7 @@ // Shift background tabs to leave a gap where the dragged tab // would currently be dropped. - for (let item of tabs) { - if (item == draggedTab) { - continue; - } - + for (let item of dragData.unmovingTabStripItems) { let shift = getTabShift(item, newDropElementIndex); let transform = shift ? `${translateAxis}(${shift}px)` : ""; item = elementToMove(item); diff --git a/browser/components/tabbrowser/content/tab-stacking.js b/browser/components/tabbrowser/content/tab-stacking.js @@ -965,8 +965,7 @@ } dragData.translatePos = translate; - - tabs = tabs.filter(t => !movingTabsSet.has(t) || t == draggedTab); + tabs = dragData.dropIndexSearchArray; /** * When the `draggedTab` is just starting to move, the `draggedTab` is in @@ -1372,10 +1371,7 @@ // Shift background tabs to leave a gap where the dragged tab // would currently be dropped. - for (let item of tabs) { - if (item == draggedTab) { - continue; - } + for (let item of dragData.unmovingTabStripItems) { let shift = getTabShift(item, newDropElementIndex); let transform = shift ? `${translateAxis}(${shift}px)` : ""; item = elementToMove(item); @@ -1558,12 +1554,10 @@ // Shift background tabs to leave a gap where the dragged tab // would currently be dropped. - for (let tab of tabs) { - if (tab != draggedTab) { - let [shiftX, shiftY] = getTabShift(tab, newIndex); - tab.style.transform = - shiftX || shiftY ? `translate(${shiftX}px, ${shiftY}px)` : ""; - } + for (let tab of dragData.unmovingTabStripItems) { + let [shiftX, shiftY] = getTabShift(tab, newIndex); + tab.style.transform = + shiftX || shiftY ? `translate(${shiftX}px, ${shiftY}px)` : ""; } }