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)