add disconnectEverything function. add new test where playwright sees

existing page tab
This commit is contained in:
Tommy D. Rossi
2025-11-22 23:49:40 +01:00
parent 7025836f7e
commit 6b6ac216f2
2 changed files with 78 additions and 5 deletions
+25
View File
@@ -68,6 +68,30 @@ async function toggleExtensionForActiveTab(): Promise<{ isConnected: boolean; st
return { isConnected, state }
}
// @ts-ignore
globalThis.disconnectEverything = disconnectEverything
async function disconnectEverything() {
const { connectedTabs, connection } = useExtensionStore.getState()
// Disconnect all tabs
for (const tabId of connectedTabs.keys()) {
await disconnectTab(tabId)
}
// Force close connection if it still exists
const state = useExtensionStore.getState()
if (state.connection) {
state.connection.close('Manual full disconnect')
useExtensionStore.setState({
connection: undefined,
connectionState: 'disconnected',
connectedTabs: new Map(),
errorText: undefined
})
}
}
// @ts-ignore
globalThis.getExtensionState = () => useExtensionStore.getState()
@@ -75,6 +99,7 @@ declare global {
var state: typeof useExtensionStore
var toggleExtensionForActiveTab: () => Promise<{ isConnected: boolean; state: ExtensionState }>
var getExtensionState: () => ExtensionState
var disconnectEverything: () => Promise<void>
}
async function resetDebugger() {
+53 -5
View File
@@ -39,11 +39,11 @@ function js(strings: TemplateStringsArray, ...values: any[]): string {
async function killProcessOnPort(port: number): Promise<void> {
try {
const { stdout } = await execAsync(`lsof -ti:${port}`)
const pid = stdout.trim()
if (pid) {
await execAsync(`kill -9 ${pid}`)
console.log(`Killed process ${pid} on port ${port}`)
await new Promise((resolve) => setTimeout(resolve, 500))
const pids = stdout.trim().split('\n').filter(Boolean)
if (pids.length > 0) {
await execAsync(`kill -9 ${pids.join(' ')}`)
console.log(`Killed processes ${pids.join(', ')} on port ${port}`)
await new Promise((resolve) => setTimeout(resolve, 1000))
}
} catch (error) {
// No process running on port or already killed
@@ -53,6 +53,7 @@ async function killProcessOnPort(port: number): Promise<void> {
declare global {
var toggleExtensionForActiveTab: () => Promise<{ isConnected: boolean; state: any }>;
var getExtensionState: () => { connectedTabs: Map<number, { targetId: string }> };
var disconnectEverything: () => Promise<void>;
var chrome: any;
}
@@ -116,6 +117,16 @@ describe('MCP Server Tests', () => {
// Wait for service worker and connect
const serviceWorker = await getExtensionServiceWorker(browserContext)
// Wait for extension to initialize global functions
for (let i = 0; i < 50; i++) {
const isReady = await serviceWorker.evaluate(() => {
// @ts-ignore
return typeof globalThis.toggleExtensionForActiveTab === 'function'
})
if (isReady) break
await new Promise(r => setTimeout(r, 100))
}
// Create a page to attach to
const page = await browserContext.newPage()
await page.goto('about:blank')
@@ -662,6 +673,43 @@ describe('MCP Server Tests', () => {
await pageB.close()
})
it('should show correct url when enabling extension after navigation', async () => {
if (!browserContext) throw new Error('Browser not initialized')
const serviceWorker = await getExtensionServiceWorker(browserContext)
// 1. Ensure clean state (disconnected)
await serviceWorker.evaluate(async () => {
await globalThis.disconnectEverything()
})
// 2. Open page and navigate
const page = await browserContext.newPage()
const targetUrl = 'https://example.com/late-enable'
await page.goto(targetUrl)
await page.bringToFront()
// Wait for load
await page.waitForLoadState('networkidle')
// 3. Enable extension
await serviceWorker.evaluate(async () => {
await globalThis.toggleExtensionForActiveTab()
})
// 4. Verify via CDP
const browser = await chromium.connectOverCDP(getCdpUrl())
// Wait for sync
await new Promise(r => setTimeout(r, 1000))
const cdpPage = browser.contexts()[0].pages().find(p => p.url() === targetUrl)
expect(cdpPage).toBeDefined()
expect(cdpPage?.url()).toBe(targetUrl)
await browser.close()
await page.close()
})
})