* Get or create a CDP session for the given page. * Enables DOM + CSS domains on first use.
(page: Page)
| 93 | * Enables DOM + CSS domains on first use. |
| 94 | */ |
| 95 | async function getOrCreateSession(page: Page): Promise<any> { |
| 96 | let session = cdpSessions.get(page); |
| 97 | if (session) { |
| 98 | // Verify session is still alive |
| 99 | try { |
| 100 | await session.send('DOM.getDocument', { depth: 0 }); |
| 101 | return session; |
| 102 | } catch (err: any) { |
| 103 | // Session is stale — recreate (CDP disconnects throw on closed/Target errors) |
| 104 | if (!err?.message?.includes('closed') && !err?.message?.includes('Target') && !err?.message?.includes('detached')) throw err; |
| 105 | cdpSessions.delete(page); |
| 106 | initializedPages.delete(page); |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | session = await getOrCreateCdpSession(page, cdpSessions); |
| 111 | |
| 112 | // Enable DOM and CSS domains on first init for this page. The session |
| 113 | // itself is cached + close-detached by getOrCreateCdpSession; the |
| 114 | // initializedPages WeakSet is inspector-layer state that needs its |
| 115 | // own close hook to stay in sync. |
| 116 | if (!initializedPages.has(page)) { |
| 117 | await session.send('DOM.enable'); |
| 118 | await session.send('CSS.enable'); |
| 119 | initializedPages.add(page); |
| 120 | page.once('close', () => initializedPages.delete(page)); |
| 121 | } |
| 122 | |
| 123 | // Auto-detach on navigation — DOM/CSS domain state is tied to the |
| 124 | // document. Close-detach (from getOrCreateCdpSession) handles the |
| 125 | // tab-close case; framenavigated catches in-tab navigation that |
| 126 | // invalidates inspector state without closing the tab. |
| 127 | page.once('framenavigated', () => { |
| 128 | try { |
| 129 | session.detach().catch(() => {}); |
| 130 | } catch (err: any) { |
| 131 | if (!err?.message?.includes('closed') && !err?.message?.includes('Target') && !err?.message?.includes('detached')) throw err; |
| 132 | } |
| 133 | cdpSessions.delete(page); |
| 134 | initializedPages.delete(page); |
| 135 | }); |
| 136 | |
| 137 | return session; |
| 138 | } |
| 139 | |
| 140 | // ─── Modification History ─────────────────────────────────────── |
| 141 |
no test coverage detected