From 3e9a74fc7a777c99c56856877aa35995d044cca8 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 15:33:51 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Optimize=20importChromeTabGroups=20?= =?UTF-8?q?to=20avoid=20N+1=20queries?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moved `await chrome.tabs.query` and `await loadStore` outside the loop, saving multiple IPC calls and repetitive store loads during import. Tabs are now grouped into a Map, preventing severe N+1 bottlenecks. Co-authored-by: matuyuhi <92073990+matuyuhi@users.noreply.github.com> --- src/background/space-manager.ts | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/background/space-manager.ts b/src/background/space-manager.ts index 23689d8..8a310fc 100644 --- a/src/background/space-manager.ts +++ b/src/background/space-manager.ts @@ -724,18 +724,29 @@ export async function addTabsToFolder( export async function importChromeTabGroups(windowId: number): Promise { const groups = await chrome.tabGroups.query({ windowId }) const created: Space[] = [] - for (const g of groups) { - let groupTabs: chrome.tabs.Tab[] - try { - groupTabs = await chrome.tabs.query({ groupId: g.id }) - } catch { - continue - } - const store = await loadStore() - const claimed = new Set() - for (const f of Object.values(store.folders)) { - for (const it of f.items) if (it.kind === 'tab') claimed.add(it.tabId) + + const allTabs = await chrome.tabs.query({ windowId }) + const tabsByGroupId = new Map() + for (const tab of allTabs) { + if (tab.groupId !== undefined && tab.groupId !== chrome.tabGroups.TAB_GROUP_ID_NONE) { + let groupTabs = tabsByGroupId.get(tab.groupId) + if (!groupTabs) { + groupTabs = [] + tabsByGroupId.set(tab.groupId, groupTabs) + } + groupTabs.push(tab) } + } + + const store = await loadStore() + const claimed = new Set() + for (const f of Object.values(store.folders)) { + for (const it of f.items) if (it.kind === 'tab') claimed.add(it.tabId) + } + + for (const g of groups) { + const groupTabs = tabsByGroupId.get(g.id) || [] + const tabIds = groupTabs .map((t) => t.id) .filter((id): id is number => typeof id === 'number' && !claimed.has(id))