commit fa582eed17d875e161c0654cb4fd1a69aebf7a44
parent 60ad45fd7139d48aa1565910899f3fed997f2bb7
Author: DJ <dj@walker.dev>
Date: Wed, 3 Dec 2025 14:58:45 +0000
Bug 1928146 - green up and re-enable browser_tab_groups.js. r=sthompson,tabbrowser-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D273701
Diffstat:
3 files changed, 52 insertions(+), 23 deletions(-)
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
@@ -34,8 +34,10 @@
this.addEventListener("TabHoverEnd", this);
this.addEventListener("TabGroupLabelHoverStart", this);
this.addEventListener("TabGroupLabelHoverEnd", this);
- this.addEventListener("TabGroupExpand", this);
- this.addEventListener("TabGroupCollapse", this);
+ // Capture collapse/expand early so we mark animating groups before
+ // overflow/underflow handlers run.
+ this.addEventListener("TabGroupExpand", this, true);
+ this.addEventListener("TabGroupCollapse", this, true);
this.addEventListener("TabGroupAnimationComplete", this);
this.addEventListener("TabGroupCreate", this);
this.addEventListener("TabGroupRemoved", this);
@@ -388,7 +390,11 @@
}
on_TabGroupAnimationComplete(event) {
- this.#animatingGroups.delete(event.target.id);
+ // Delay clearing the animating flag so overflow/underflow handlers
+ // triggered by the size change can observe it and skip auto-scroll.
+ window.requestAnimationFrame(() => {
+ this.#animatingGroups.delete(event.target.id);
+ });
}
on_TabGroupCreate() {
diff --git a/browser/components/tabbrowser/test/browser/tabs/browser.toml b/browser/components/tabbrowser/test/browser/tabs/browser.toml
@@ -560,11 +560,6 @@ tags = "vertical-tabs"
["browser_tab_groups.js"]
support-files = ["file_new_tab_page.html"]
tags = "vertical-tabs"
-skip-if = [
- "os == 'linux' && os_version == '24.04' && arch == 'x86_64' && display == 'x11' && opt", # Bug 1928146
- "os == 'mac' && os_version == '10.15' && arch == 'x86_64' && opt", # Bug 1928146
- "os == 'win' && os_version == '11.26100' && arch == 'x86_64' && opt", # Bug 1928146
-]
["browser_tab_groups_a11y.js"]
tags = "vertical-tabs"
diff --git a/browser/components/tabbrowser/test/browser/tabs/browser_tab_groups.js b/browser/components/tabbrowser/test/browser/tabs/browser_tab_groups.js
@@ -279,11 +279,11 @@ add_task(async function test_tabGroupPreventScrollOnUncollapse() {
info("scrolling to beginning of tabstrip");
let arrowScrollbox = win.gBrowser.tabContainer.arrowScrollbox;
- let scrolledToStart = BrowserTestUtils.waitForCondition(() =>
- arrowScrollbox.hasAttribute("scrolledtostart")
- );
+ let scrolledToStart = BrowserTestUtils.waitForCondition(() => {
+ return arrowScrollbox.hasAttribute("scrolledtostart");
+ }, "Waiting for tabstrip to be scrolled to start");
- bigGroup.labelElement.scrollIntoView(true);
+ arrowScrollbox.ensureElementIsVisible(bigGroup.labelElement, true);
await scrolledToStart;
Assert.ok(!bigGroup.collapsed, "Group is expanded");
Assert.ok(
@@ -375,6 +375,20 @@ add_task(async function test_groupHasActiveTab() {
let group2 = gBrowser.addTabGroup([tab2]);
async function activeTabTest(tabsMode) {
+ async function addTabToGroup(group, tab) {
+ if (tab.group == group) {
+ return;
+ }
+ let tabGrouped = BrowserTestUtils.waitForEvent(
+ group,
+ "TabGrouped",
+ false,
+ event => event.detail == tab
+ );
+ group.addTabs([tab]);
+ await tabGrouped;
+ }
+
info(`hasactivetab test for ${tabsMode} tabs mode`);
info("tab3 is ungrouped and active");
gBrowser.selectedTab = tab3;
@@ -393,21 +407,23 @@ add_task(async function test_groupHasActiveTab() {
Assert.ok(!group1.hasActiveTab, "group1 hasactivetab=false");
Assert.ok(!group2.hasActiveTab, "group2 hasactivetab=false");
info("tab3 enters group1 as the active tab");
- let tab3InGroup1 = BrowserTestUtils.waitForEvent(group1, "TabGrouped");
- group1.addTabs([tab3]);
- await tab3InGroup1;
+ await addTabToGroup(group1, tab3);
Assert.ok(group1.hasActiveTab, "group1 hasactivetab=true");
Assert.ok(!group2.hasActiveTab, "group2 hasactivetab=false");
info("tab3 enters group2 as the active tab");
- let tab3InGroup2 = BrowserTestUtils.waitForEvent(group2, "TabGrouped");
- group2.addTabs([tab3]);
- await tab3InGroup2;
+ await addTabToGroup(group2, tab3);
Assert.ok(!group1.hasActiveTab, "group1 hasactivetab=false");
Assert.ok(group2.hasActiveTab, "group2 hasactivetab=true");
info("tab3 becomes ungrouped again as the active tab");
let tab3Moved = BrowserTestUtils.waitForEvent(tab3, "TabMove");
+ let tab3Ungrouped = BrowserTestUtils.waitForEvent(
+ group2,
+ "TabUngrouped",
+ false,
+ event => event.detail == tab3
+ );
gBrowser.moveTabToEnd(tab3);
- await tab3Moved;
+ await Promise.all([tab3Moved, tab3Ungrouped]);
Assert.ok(!group1.hasActiveTab, "group1 hasactivetab=false");
Assert.ok(!group2.hasActiveTab, "group2 hasactivetab=false");
}
@@ -575,7 +591,9 @@ add_task(async function test_tabGroupDeletesWhenLastTabClosed() {
let tab = BrowserTestUtils.addTab(gBrowser, "about:blank");
let group = gBrowser.addTabGroup([tab]);
+ let removePromise = BrowserTestUtils.waitForEvent(group, "TabGroupRemoved");
gBrowser.removeTab(tab);
+ await removePromise;
Assert.equal(group.parent, null, "group is removed from tabbrowser");
});
@@ -738,11 +756,21 @@ add_task(async function test_moveTabGroup() {
});
add_task(async function test_moveTabBetweenGroups() {
- let tab1 = BrowserTestUtils.addTab(gBrowser, "about:blank");
- let tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank");
+ let tab1 = await addTab("about:blank");
+ let tab2 = await addTab("about:blank");
- let tab1Added = BrowserTestUtils.waitForEvent(window, "TabGrouped");
- let tab2Added = BrowserTestUtils.waitForEvent(window, "TabGrouped");
+ let tab1Added = BrowserTestUtils.waitForEvent(
+ window,
+ "TabGrouped",
+ false,
+ event => event.detail === tab1
+ );
+ let tab2Added = BrowserTestUtils.waitForEvent(
+ window,
+ "TabGrouped",
+ false,
+ event => event.detail === tab2
+ );
let group1 = gBrowser.addTabGroup([tab1]);
let group2 = gBrowser.addTabGroup([tab2]);
await Promise.allSettled([tab1Added, tab2Added]);