// @ts-nocheck import { getActiveTab, getAliases, resolveGroupId, tabInfo } from '../core'; export async function navOpen({ url, background, window: windowName, windowId: explicitWindowId, group: groupNameOrId }) { let windowId; if (explicitWindowId != null) { windowId = explicitWindowId; } else if (windowName) { const aliases = await getAliases(); const entry = Object.entries(aliases).find(([, v]) => v === windowName); if (entry) windowId = parseInt(entry[0]); } const tab = await chrome.tabs.create({ url, active: !background, windowId }); if (groupNameOrId != null) { let groupId; try { groupId = await resolveGroupId(groupNameOrId); // Close any blank placeholder tabs that were created when the group was made const groupTabs = await chrome.tabs.query({ groupId }); const placeholders = groupTabs.filter(t => t.id !== tab.id && (t.url === "chrome://newtab/" || t.url === "about:blank" || t.pendingUrl === "chrome://newtab/") ); await chrome.tabs.group({ tabIds: [tab.id], groupId }); if (placeholders.length) await chrome.tabs.remove(placeholders.map(t => t.id)); } catch (e) { if (!e.message.startsWith("No tab group found")) throw e; // Group doesn't exist — create it with the tab already in it groupId = await chrome.tabs.group({ tabIds: [tab.id] }); await chrome.tabGroups.update(groupId, { title: String(groupNameOrId) }); } } return { id: tab.id, url: tab.url }; } export async function navTo({ tabId, url }) { const tab = await chrome.tabs.update(tabId, { url }); return { id: tab.id, url: tab.url || url }; } export async function navReload({ tabId }, bypassCache) { const tab = tabId ? { id: tabId } : await getActiveTab(); await chrome.tabs.reload(tab.id, { bypassCache }); return { tabId: tab.id }; } export async function navBack({ tabId }) { const tab = tabId ? { id: tabId } : await getActiveTab(); await chrome.tabs.goBack(tab.id); return { tabId: tab.id }; } export async function navForward({ tabId }) { const tab = tabId ? { id: tabId } : await getActiveTab(); await chrome.tabs.goForward(tab.id); return { tabId: tab.id }; } export async function navFocus({ pattern }) { // If pattern is a plain integer, treat it as a tab ID const asInt = parseInt(pattern); let match; if (!isNaN(asInt) && String(asInt) === String(pattern)) { match = await chrome.tabs.get(asInt); } else { const all = await chrome.tabs.query({}); match = all.find(t => (t.url && t.url.includes(pattern)) || (t.pendingUrl && t.pendingUrl.includes(pattern))); } if (!match) return null; await chrome.windows.update(match.windowId, { focused: true }); await chrome.tabs.update(match.id, { active: true }); return { id: match.id, url: match.url || match.pendingUrl, title: match.title }; } export async function navWait({ tabId, timeout = 30000, readyState = "complete" } = {}) { const tab = tabId ? { id: tabId } : await getActiveTab(); const deadline = Date.now() + timeout; const interval = 200; while (Date.now() < deadline) { const t = await chrome.tabs.get(tab.id); if (readyState === "complete" ? t.status === "complete" : t.status !== "loading") { return tabInfo(t); } await new Promise(r => setTimeout(r, interval)); } throw new Error(`Tab ${tab.id} did not reach status '${readyState}' within ${timeout}ms`); } export async function navOpenWait({ url, timeout = 30000, background, window: windowName, group } = {}) { const opened = await navOpen({ url, background, window: windowName, group }); return await navWait({ tabId: opened.id, timeout }); } // ── Tabs ──────────────────────────────────────────────────────────────────────