Bug 1933280 - Fix dragging into and out of tab groups. r=jswinarton,tabbrowser-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D239000
This commit is contained in:
Dão Gottwald
2025-02-20 22:44:21 +00:00
parent 88d0eee4d0
commit e0bb662eef
2 changed files with 43 additions and 25 deletions

View File

@@ -5794,8 +5794,10 @@
this._handleTabMove(tab, () => {
if (dropBefore) {
this.tabContainer.insertBefore(tab, targetElement);
} else {
} else if (targetElement) {
targetElement.after(tab);
} else {
this.tabContainer.appendChild(tab);
}
});
}

View File

@@ -19,14 +19,14 @@
* @returns {boolean}
* `true` if element is a `<tab>`
*/
const isTab = element => element.tagName == "tab";
const isTab = element => !!(element?.tagName == "tab");
/**
* @param {MozTabbrowserTab|MozTabbrowserTabGroup} element
* @returns {boolean}
* `true` if element is a `<tab-group>`
*/
const isTabGroup = element => element.tagName == "tab-group";
const isTabGroup = element => !!(element?.tagName == "tab-group");
/**
* @param {MozTabbrowserTab|MozTextLabel} element
@@ -34,7 +34,7 @@
* `true` if element is the `<label>` in a `<tab-group>`
*/
const isTabGroupLabel = element =>
element.classList?.contains("tab-group-label") ?? false;
!!element?.classList?.contains("tab-group-label");
class MozTabbrowserTabs extends MozElements.TabsBase {
static observedAttributes = ["orient"];
@@ -1043,7 +1043,7 @@
} else {
let isPinned = draggedTab.pinned;
let numPinned = gBrowser.pinnedTabCount;
let tabs = this.visibleTabs.slice(
let tabs = this.ariaFocusableItems.slice(
isPinned ? 0 : numPinned,
isPinned ? numPinned : undefined
);
@@ -1134,7 +1134,7 @@
dropIndex++;
}
}
} else if (dropElement) {
} else {
gBrowser.dropTabs(movingTabs, dropElement, dropBefore);
}
});
@@ -2498,24 +2498,29 @@
};
let dropElement = getOverlappedElement();
if (!dropElement) {
dropElement = this.ariaFocusableItems[oldDropElementIndex];
}
let newDropElementIndex = dropElement
? dropElement.elementIndex
: oldDropElementIndex;
let dropBefore = !screenForward;
let moveOverThreshold;
let firstMovingTabPos;
let dropElementScreen;
let overlapPercent;
if (dropElement) {
let dropElementForOverlap = isTabGroupLabel(dropElement)
? dropElement.parentElement
: dropElement;
let dropElementPosition = dropElementForOverlap[screenAxis];
let dropElementTabShift = getTabShift(dropElement, oldDropElementIndex);
dropElementScreen = dropElementForOverlap[screenAxis];
let dropElementSize = bounds(dropElementForOverlap)[size];
firstMovingTabPos = firstMovingTabScreen + translate;
overlapPercent = greatestOverlap(
firstMovingTabScreen + translate,
firstMovingTabPos,
shiftSize,
dropElementPosition + dropElementTabShift,
dropElementScreen + dropElementTabShift,
dropElementSize
);
@@ -2526,21 +2531,31 @@
: 0.5;
moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold));
let shouldMoveOver = overlapPercent > moveOverThreshold;
if (logicalForward) {
if (shouldMoveOver) {
newDropElementIndex++;
if (logicalForward && shouldMoveOver) {
newDropElementIndex++;
} else if (!logicalForward && !shouldMoveOver) {
newDropElementIndex++;
if (newDropElementIndex > oldDropElementIndex) {
// FIXME: Not quite sure what's going on here, but this check
// prevents jittery back-and-forth movement of background tabs
// in certain cases.
return;
}
dropBefore = !shouldMoveOver;
} else {
if (!shouldMoveOver) {
newDropElementIndex++;
}
dropBefore = shouldMoveOver;
}
}
let shouldCreateGroupOnDrop;
if (dropElement && gBrowser._tabGroupsEnabled && !isPinned) {
let dropBefore;
if (dropElement) {
let dropElementPos =
dropElementScreen + getTabShift(dropElement, newDropElementIndex);
dropBefore = firstMovingTabPos < dropElementPos;
if (this.#rtlMode) {
dropBefore = !dropBefore;
}
}
if (gBrowser._tabGroupsEnabled && !isPinned) {
let dragOverGroupingThreshold =
Services.prefs.getIntPref(
"browser.tabs.groups.dragOverThresholdPercent"
@@ -2555,7 +2570,7 @@
shouldCreateGroupOnDrop =
dropElement != draggedTab &&
isTab(dropElement) &&
!dropElement.group &&
!dropElement?.group &&
overlapPercent > dragOverGroupingThreshold;
if (shouldCreateGroupOnDrop) {
@@ -2593,16 +2608,17 @@
if (dropBefore) {
// Dropping right before the tab group.
dropElement = dropElementGroup;
colorCode = undefined;
} else if (dropElementGroup.collapsed) {
// Dropping right after the collapsed tab group.
dropElement = dropElementGroup;
colorCode = undefined;
} else {
// Dropping right before the first tab in the tab group.
dropElement = dropElementGroup.tabs[0];
dropBefore = true;
}
}
this.#setDragOverGroupColor(colorCode);
this.toggleAttribute("movingtab-ungroup", !colorCode);
}
@@ -2619,9 +2635,9 @@
}
if (
newDropElementIndex == oldDropElementIndex ||
// FIXME: This seems bogus, not sure what's going on with the indexes here:
(!logicalForward && newDropElementIndex > oldDropElementIndex)
newDropElementIndex == oldDropElementIndex &&
dropBefore == dragData.dropBefore &&
dropElement == dragData.dropElement
) {
return;
}