commit 3d4d2f96a0c489728e59a5e9d9a629f4ce0baaed
parent 6d91498cf88ec45d892676ef7a6f155b3661f1a8
Author: DJ <dj@walker.dev>
Date: Wed, 7 Jan 2026 20:58:04 +0000
Bug 2007838 - dismiss tab preview at beginning of tab drag. r=tabbrowser-reviewers,sthompson
Differential Revision: https://phabricator.services.mozilla.com/D277879
Diffstat:
2 files changed, 86 insertions(+), 0 deletions(-)
diff --git a/browser/components/tabbrowser/content/tab-hover-preview.mjs b/browser/components/tabbrowser/content/tab-hover-preview.mjs
@@ -83,6 +83,16 @@ export default class TabHoverPanelSet {
);
this.#setExternalPopupListeners();
+ this.#win.gBrowser.tabContainer.addEventListener("dragstart", event => {
+ const target = event.target.closest?.("tab, .tab-group-label");
+ if (
+ target &&
+ (this.#win.gBrowser.isTab(target) ||
+ this.#win.gBrowser.isTabGroupLabel(target))
+ ) {
+ this.deactivate(null, { force: true });
+ }
+ });
}
/**
@@ -191,6 +201,7 @@ export default class TabHoverPanelSet {
return (
// All other popups are closed.
!this.#openPopups.size &&
+ !this.#win.gBrowser.tabContainer.hasAttribute("movingtab") &&
// TODO (bug 1899556): for now disable in background windows, as there are
// issues with windows ordering on Linux (bug 1897475), plus intermittent
// persistence of previews after session restore (bug 1888148).
diff --git a/browser/components/tabbrowser/test/browser/tabs/browser_tab_preview.js b/browser/components/tabbrowser/test/browser/tabs/browser_tab_preview.js
@@ -1292,6 +1292,81 @@ add_task(async function testDragToCancelPreview() {
await SpecialPowers.popPrefEnv();
});
+add_task(async function tabPreviewHidesWhenDraggingOverPanel() {
+ const tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:robots"
+ );
+ const previewElement = document.getElementById(TAB_PREVIEW_PANEL_ID);
+
+ await openTabPreview(tab);
+
+ const previewHidden = BrowserTestUtils.waitForPopupEvent(
+ previewElement,
+ "hidden"
+ );
+ const dragend = BrowserTestUtils.waitForEvent(tab, "dragend");
+
+ EventUtils.synthesizePlainDragAndDrop({
+ srcElement: tab,
+ destElement: null,
+ stepX: 10,
+ stepY: 0,
+ });
+
+ await previewHidden;
+ Assert.equal(
+ previewElement.state,
+ "closed",
+ "Preview closes when dragging downward over the panel"
+ );
+
+ await dragend;
+
+ BrowserTestUtils.removeTab(tab);
+ await resetState();
+
+ const groupTab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:robots"
+ );
+ const group = gBrowser.addTabGroup([groupTab]);
+ group.collapsed = true;
+
+ await openGroupPreview(group);
+
+ const groupPreviewElement = document.getElementById(
+ TAB_GROUP_PREVIEW_PANEL_ID
+ );
+ const groupPreviewHidden = BrowserTestUtils.waitForPopupEvent(
+ groupPreviewElement,
+ "hidden"
+ );
+ const groupDragend = BrowserTestUtils.waitForEvent(
+ group.labelElement,
+ "dragend"
+ );
+
+ EventUtils.synthesizePlainDragAndDrop({
+ srcElement: group.labelElement,
+ destElement: null,
+ stepX: 10,
+ stepY: 0,
+ });
+
+ await groupPreviewHidden;
+ Assert.equal(
+ groupPreviewElement.state,
+ "closed",
+ "Group preview closes when dragging downward over the panel"
+ );
+
+ await groupDragend;
+
+ BrowserTestUtils.removeTab(groupTab);
+ await resetState();
+});
+
/**
* Other open panels should prevent tab preview from opening
*/