Skip to content

Commit 69e6369

Browse files
authored
fix(browser): open one cdp session per tester (#11542)
1 parent cd423ba commit 69e6369

2 files changed

Lines changed: 25 additions & 23 deletions

File tree

‎packages/browser/src/node/projectParent.ts‎

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import type { ParsedStack, TestError } from 'vitest'
44
import type {
55
BrowserCommand,
66
BrowserScript,
7-
CDPSession,
87
ResolvedConfig,
98
TestProject,
109
Vite,
@@ -172,14 +171,26 @@ export class ParentBrowserProject {
172171
})
173172
}
174173

175-
public readonly cdps: Map<string, BrowserServerCDPHandler> = new Map()
176-
private cdpSessionsPromises = new Map<string, Promise<CDPSession>>()
174+
private cdpHandlers = new Map<string, Promise<BrowserServerCDPHandler>>()
177175

178-
async ensureCDPHandler(sessionId: string, rpcId: string): Promise<BrowserServerCDPHandler> {
179-
const cachedHandler = this.cdps.get(rpcId)
180-
if (cachedHandler) {
181-
return cachedHandler
176+
ensureCDPHandler(sessionId: string, rpcId: string): Promise<BrowserServerCDPHandler> {
177+
let handler = this.cdpHandlers.get(rpcId)
178+
if (!handler) {
179+
handler = this.createCDPHandler(sessionId, rpcId)
180+
this.cdpHandlers.set(rpcId, handler)
181+
handler.catch(() => {
182+
if (this.cdpHandlers.get(rpcId) === handler) {
183+
this.cdpHandlers.delete(rpcId)
184+
}
185+
})
182186
}
187+
return handler
188+
}
189+
190+
private async createCDPHandler(
191+
sessionId: string,
192+
rpcId: string,
193+
): Promise<BrowserServerCDPHandler> {
183194
const browserSession = this.vitest._browserSessions.getSession(sessionId)
184195
if (!browserSession) {
185196
throw new Error(`Session "${sessionId}" not found.`)
@@ -196,28 +207,18 @@ export class ParentBrowserProject {
196207
throw new Error(`CDP is not supported by the provider "${provider.name}".`)
197208
}
198209

199-
const session =
200-
(await this.cdpSessionsPromises.get(rpcId)) ??
201-
(await (async () => {
202-
const promise = provider.getCDPSession!(sessionId).finally(() => {
203-
this.cdpSessionsPromises.delete(rpcId)
204-
})
205-
this.cdpSessionsPromises.set(rpcId, promise)
206-
return promise
207-
})())
210+
const session = await provider.getCDPSession(sessionId)
208211

209212
const rpc = (browser.state as BrowserServerState).testers.get(rpcId)
210213
if (!rpc) {
211214
throw new Error(`Tester RPC "${rpcId}" was not established.`)
212215
}
213216

214-
const handler = new BrowserServerCDPHandler(session, rpc)
215-
this.cdps.set(rpcId, handler)
216-
return handler
217+
return new BrowserServerCDPHandler(session, rpc)
217218
}
218219

219-
removeCDPHandler(sessionId: string): void {
220-
this.cdps.delete(sessionId)
220+
removeCDPHandler(rpcId: string): void {
221+
this.cdpHandlers.delete(rpcId)
221222
}
222223

223224
async formatScripts(scripts: BrowserScript[] | undefined): Promise<HtmlTagDescriptor[]> {

‎test/browser/test/cdp.test.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ describe.runIf(server.provider === 'playwright' && server.browser === 'chromium'
77
it('cdp sends events correctly', async () => {
88
const messageAdded = vi.fn()
99

10-
await cdp().send('Console.enable')
11-
10+
// `on` does not wait for the server, so subscribe before the next request
1211
cdp().on('Console.messageAdded', messageAdded)
1312

13+
await cdp().send('Console.enable')
14+
1415
onTestFinished(async () => {
1516
await cdp().send('Console.disable')
1617
})

0 commit comments

Comments
 (0)