diff --git a/extension/icons/icon-black-128.png b/extension/icons/icon-black-128.png new file mode 100644 index 0000000..0ac9e2f Binary files /dev/null and b/extension/icons/icon-black-128.png differ diff --git a/extension/icons/icon-black-16.png b/extension/icons/icon-black-16.png new file mode 100644 index 0000000..57215f2 Binary files /dev/null and b/extension/icons/icon-black-16.png differ diff --git a/extension/icons/icon-black-32.png b/extension/icons/icon-black-32.png new file mode 100644 index 0000000..1f828af Binary files /dev/null and b/extension/icons/icon-black-32.png differ diff --git a/extension/icons/icon-black-48.png b/extension/icons/icon-black-48.png new file mode 100644 index 0000000..bfd946b Binary files /dev/null and b/extension/icons/icon-black-48.png differ diff --git a/extension/icons/icon-gray-128.png b/extension/icons/icon-gray-128.png index 90174a4..adc9d0c 100644 Binary files a/extension/icons/icon-gray-128.png and b/extension/icons/icon-gray-128.png differ diff --git a/extension/icons/icon-gray-16.png b/extension/icons/icon-gray-16.png index 067c36d..76561ac 100644 Binary files a/extension/icons/icon-gray-16.png and b/extension/icons/icon-gray-16.png differ diff --git a/extension/icons/icon-gray-32.png b/extension/icons/icon-gray-32.png index e69526e..22c46d3 100644 Binary files a/extension/icons/icon-gray-32.png and b/extension/icons/icon-gray-32.png differ diff --git a/extension/icons/icon-gray-48.png b/extension/icons/icon-gray-48.png index be86d27..7bc789d 100644 Binary files a/extension/icons/icon-gray-48.png and b/extension/icons/icon-gray-48.png differ diff --git a/extension/icons/playwriter-icon-black.png b/extension/icons/playwriter-icon-black.png new file mode 100644 index 0000000..cada0ae Binary files /dev/null and b/extension/icons/playwriter-icon-black.png differ diff --git a/extension/icons/playwriter-icon-black.svg b/extension/icons/playwriter-icon-black.svg new file mode 100644 index 0000000..9e65fb2 --- /dev/null +++ b/extension/icons/playwriter-icon-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension/icons/playwriter-icon-gray-disabled.png b/extension/icons/playwriter-icon-gray-disabled.png new file mode 100644 index 0000000..dea7bea Binary files /dev/null and b/extension/icons/playwriter-icon-gray-disabled.png differ diff --git a/extension/icons/playwriter-icon-gray-disabled.svg b/extension/icons/playwriter-icon-gray-disabled.svg new file mode 100644 index 0000000..cea3940 --- /dev/null +++ b/extension/icons/playwriter-icon-gray-disabled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension/src/background.ts b/extension/src/background.ts index 14a1edb..f34f8be 100644 --- a/extension/src/background.ts +++ b/extension/src/background.ts @@ -626,6 +626,12 @@ async function resetDebugger(): Promise { } } +function isRestrictedUrl(url: string | undefined): boolean { + if (!url) return true + const restrictedPrefixes = ['chrome://', 'chrome-extension://', 'devtools://', 'edge://'] + return restrictedPrefixes.some((prefix) => url.startsWith(prefix)) +} + const icons = { connected: { path: { @@ -647,29 +653,40 @@ const icons = { }, title: 'Connecting...', badgeText: '...', - badgeColor: '#FF9800', + badgeColor: [0, 0, 0, 0] as [number, number, number, number], }, disconnected: { + path: { + '16': '/icons/icon-black-16.png', + '32': '/icons/icon-black-32.png', + '48': '/icons/icon-black-48.png', + '128': '/icons/icon-black-128.png', + }, + title: 'Click to attach debugger', + badgeText: '', + badgeColor: [0, 0, 0, 0] as [number, number, number, number], + }, + restricted: { path: { '16': '/icons/icon-gray-16.png', '32': '/icons/icon-gray-32.png', '48': '/icons/icon-gray-48.png', - '128': '/icons/icon-gray-48.png', + '128': '/icons/icon-gray-128.png', }, - title: 'Click to attach debugger', + title: 'Cannot attach to this page', badgeText: '', - badgeColor: '#333333', + badgeColor: [0, 0, 0, 0] as [number, number, number, number], }, error: { path: { '16': '/icons/icon-gray-16.png', '32': '/icons/icon-gray-32.png', '48': '/icons/icon-gray-48.png', - '128': '/icons/icon-gray-48.png', + '128': '/icons/icon-gray-128.png', }, title: 'Error', badgeText: '!', - badgeColor: '#f44336', + badgeColor: [0, 0, 0, 0] as [number, number, number, number], }, } as const @@ -680,10 +697,12 @@ async function updateIcons(): Promise { const connectedCount = Array.from(tabs.values()).filter((t) => t.state === 'connected').length const allTabs = await chrome.tabs.query({}) + const tabUrlMap = new Map(allTabs.map((tab) => [tab.id, tab.url])) const allTabIds = [undefined, ...allTabs.map((tab) => tab.id).filter((id): id is number => id !== undefined)] for (const tabId of allTabIds) { const tabInfo = tabId !== undefined ? tabs.get(tabId) : undefined + const tabUrl = tabId !== undefined ? tabUrlMap.get(tabId) : undefined const iconConfig = (() => { if (connectionState === 'error') return icons.error @@ -691,6 +710,7 @@ async function updateIcons(): Promise { if (tabInfo?.state === 'error') return icons.error if (tabInfo?.state === 'connecting') return icons.connecting if (tabInfo?.state === 'connected') return icons.connected + if (tabId !== undefined && isRestrictedUrl(tabUrl)) return icons.restricted return icons.disconnected })() @@ -701,7 +721,7 @@ async function updateIcons(): Promise { })() const badgeText = (() => { - if (iconConfig === icons.connected || iconConfig === icons.disconnected) { + if (iconConfig === icons.connected || iconConfig === icons.disconnected || iconConfig === icons.restricted) { return connectedCount > 0 ? String(connectedCount) : '' } return iconConfig.badgeText @@ -731,6 +751,11 @@ async function onActionClicked(tab: chrome.tabs.Tab): Promise { return } + if (isRestrictedUrl(tab.url)) { + logger.debug('Cannot attach to restricted URL:', tab.url) + return + } + const { tabs, connectionState } = store.getState() const tabInfo = tabs.get(tab.id)