Bug 1962592 - Reduce tab moves in adoptTabGroup r=tabbrowser-reviewers,dao

Differential Revision: https://phabricator.services.mozilla.com/D246702
This commit is contained in:
Rob Wu
2025-04-25 13:44:46 +00:00
parent 6899ed5a68
commit 6521fc35e2
2 changed files with 88 additions and 0 deletions

View File

@@ -86,3 +86,90 @@ add_task(async function tabGroups_move_to_other_window() {
await extension.awaitMessage("done");
await extension.unload();
});
add_task(async function tabGroups_move_multiple_tabs_to_other_window() {
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabGroups"],
},
async background() {
// Setup: The tabs that we are going to group.
const tabs = [
await browser.tabs.create({}),
await browser.tabs.create({}),
];
const oldWinId = tabs[0].windowId;
const tabIds = tabs.map(t => t.id);
browser.test.log(`Tab ID: ${tabIds}, old win ID: ${oldWinId}`);
const groupId = await browser.tabs.group({ tabIds });
// Setup: Create window with two tabs.
const { id: windowId } = await browser.windows.create({});
const tab2 = await browser.tabs.create({ windowId });
browser.test.assertEq(1, tab2.index, `Two tabs in window ${windowId}`);
const events = [];
browser.tabGroups.onCreated.addListener(group => {
browser.test.fail(`Unexpected tabGroups.onCreated: ${group.id}`);
});
browser.tabGroups.onRemoved.addListener(group => {
browser.test.fail(`Unexpected tabGroups.onRemoved: ${group.id}`);
});
browser.tabGroups.onMoved.addListener(group => {
browser.test.assertEq(groupId, group.id, "onMoved fired for group");
events.push("tabGroups.onMoved");
});
browser.tabs.onMoved.addListener((movedTabId, moveInfo) => {
// onDetached & onAttached should fire when moving to another window.
browser.test.fail(
`Unexpected tabs.onMoved: ${JSON.stringify(moveInfo)}`
);
});
browser.tabs.onDetached.addListener((movedTabId, detachInfo) => {
browser.test.assertEq(oldWinId, detachInfo.oldWindowId, "oldWindowId");
events.push(`tabs.onDetached:${detachInfo.oldPosition}:${movedTabId}`);
});
browser.tabs.onAttached.addListener((movedTabId, attachInfo) => {
browser.test.assertEq(windowId, attachInfo.newWindowId, "newWindowId");
events.push(`tabs.onAttached:${attachInfo.newPosition}:${movedTabId}`);
});
browser.test.assertDeepEq([], events, "No tabGroups event yet");
// Move tab group to start of tab strip.
const moved = await browser.tabGroups.move(groupId, {
windowId,
index: 0,
});
browser.test.assertEq(groupId, moved.id, "Group ID did not change");
browser.test.assertEq(windowId, moved.windowId, "Group moved to window");
browser.test.assertEq(
0,
(await browser.tabs.get(tabIds[0])).index,
`First tab appears at the expected index`
);
browser.test.assertEq(
1,
(await browser.tabs.get(tabIds[1])).index,
`Second tab appears at the expected index`
);
await browser.windows.remove(windowId);
browser.test.assertDeepEq(
[
`tabs.onDetached:1:${tabIds[0]}`,
`tabs.onAttached:0:${tabIds[0]}`,
`tabs.onDetached:1:${tabIds[1]}`,
`tabs.onAttached:1:${tabIds[1]}`,
"tabGroups.onMoved",
],
events,
"Expected events when moving tab group (2 tabs) to a new window"
);
browser.test.sendMessage("done");
},
});
await extension.startup();
await extension.awaitMessage("done");
await extension.unload();
});

View File

@@ -3155,6 +3155,7 @@
let newTabs = [];
for (let tab of group.tabs) {
newTabs.push(this.adoptTab(tab, { elementIndex }));
++elementIndex;
}
return this.addTabGroup(newTabs, {