This commit is contained in:
Tommy D. Rossi
2025-12-28 22:13:58 +01:00
parent a4e7ce10bd
commit 59161f6147
+15 -3
View File
@@ -106,6 +106,8 @@ function sendMessage(message: any): void {
async function syncTabGroup(): Promise<void> { async function syncTabGroup(): Promise<void> {
try { try {
// Only tabs with state 'connected' are in the group.
// Tabs in 'connecting' or 'error' state are removed from the group.
const connectedTabIds = Array.from(store.getState().tabs.entries()) const connectedTabIds = Array.from(store.getState().tabs.entries())
.filter(([_, info]) => info.state === 'connected') .filter(([_, info]) => info.state === 'connected')
.map(([tabId]) => tabId) .map(([tabId]) => tabId)
@@ -511,11 +513,18 @@ function handleConnectionClose(reason: string, code: number): void {
return return
} }
store.setState({ connectionState: 'disconnected', errorText: undefined })
if (tabs.size > 0) { if (tabs.size > 0) {
logger.debug('Tabs still connected, triggering reconnection') logger.debug('Tabs still connected, triggering reconnection')
store.setState((state) => {
const newTabs = new Map(state.tabs)
for (const [tabId, tab] of newTabs) {
newTabs.set(tabId, { ...tab, state: 'connecting' })
}
return { tabs: newTabs }
})
void reconnect() void reconnect()
} else {
store.setState({ connectionState: 'disconnected', errorText: undefined })
} }
} }
@@ -657,6 +666,7 @@ async function disconnectTab(tabId: number): Promise<void> {
async function reconnect(): Promise<void> { async function reconnect(): Promise<void> {
logger.debug('Starting reconnection') logger.debug('Starting reconnection')
store.setState({ connectionState: 'reconnecting', errorText: undefined })
const { tabs } = store.getState() const { tabs } = store.getState()
const tabsToReconnect = Array.from(tabs.keys()) const tabsToReconnect = Array.from(tabs.keys())
logger.debug('Tabs to reconnect:', tabsToReconnect) logger.debug('Tabs to reconnect:', tabsToReconnect)
@@ -751,6 +761,8 @@ async function resetDebugger(): Promise<void> {
} }
} }
// undefined URL is for about:blank pages (not restricted) and chrome:// URLs (restricted).
// We can't distinguish them without the `tabs` permission, so we just let attachment fail.
function isRestrictedUrl(url: string | undefined): boolean { function isRestrictedUrl(url: string | undefined): boolean {
if (!url) return false if (!url) return false
const restrictedPrefixes = ['chrome://', 'chrome-extension://', 'devtools://', 'edge://'] const restrictedPrefixes = ['chrome://', 'chrome-extension://', 'devtools://', 'edge://']
@@ -831,11 +843,11 @@ async function updateIcons(): Promise<void> {
const iconConfig = (() => { const iconConfig = (() => {
if (connectionState === 'error') return icons.error if (connectionState === 'error') return icons.error
if (tabId !== undefined && isRestrictedUrl(tabUrl)) return icons.restricted
if (connectionState === 'reconnecting') return icons.connecting if (connectionState === 'reconnecting') return icons.connecting
if (tabInfo?.state === 'error') return icons.error if (tabInfo?.state === 'error') return icons.error
if (tabInfo?.state === 'connecting') return icons.connecting if (tabInfo?.state === 'connecting') return icons.connecting
if (tabInfo?.state === 'connected') return icons.connected if (tabInfo?.state === 'connected') return icons.connected
if (tabId !== undefined && isRestrictedUrl(tabUrl)) return icons.restricted
return icons.disconnected return icons.disconnected
})() })()