playwriter 0.0.63 → 0.0.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/a11y-client.js +18 -8
  2. package/dist/aria-snapshot.d.ts +41 -3
  3. package/dist/aria-snapshot.d.ts.map +1 -1
  4. package/dist/aria-snapshot.js +134 -55
  5. package/dist/aria-snapshot.js.map +1 -1
  6. package/dist/aria-snapshot.test.js +5 -2
  7. package/dist/aria-snapshot.test.js.map +1 -1
  8. package/dist/aria-snapshot.unit.test.js +83 -41
  9. package/dist/aria-snapshot.unit.test.js.map +1 -1
  10. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +5 -0
  11. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +1 -0
  12. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +5 -0
  13. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +1 -0
  14. package/dist/bippy.js +1 -1
  15. package/dist/cdp-log.d.ts +1 -1
  16. package/dist/cdp-log.d.ts.map +1 -1
  17. package/dist/cdp-log.js +1 -1
  18. package/dist/cdp-log.js.map +1 -1
  19. package/dist/cdp-relay.d.ts.map +1 -1
  20. package/dist/cdp-relay.js +492 -298
  21. package/dist/cdp-relay.js.map +1 -1
  22. package/dist/cdp-session.d.ts.map +1 -1
  23. package/dist/cdp-session.js.map +1 -1
  24. package/dist/cdp-types.d.ts.map +1 -1
  25. package/dist/cdp-types.js +7 -7
  26. package/dist/cdp-types.js.map +1 -1
  27. package/dist/clean-html.d.ts.map +1 -1
  28. package/dist/clean-html.js +4 -5
  29. package/dist/clean-html.js.map +1 -1
  30. package/dist/cli.js +45 -27
  31. package/dist/cli.js.map +1 -1
  32. package/dist/create-logger.d.ts.map +1 -1
  33. package/dist/create-logger.js +3 -1
  34. package/dist/create-logger.js.map +1 -1
  35. package/dist/debugger-examples-types.d.ts.map +1 -1
  36. package/dist/debugger.d.ts.map +1 -1
  37. package/dist/debugger.js +1 -3
  38. package/dist/debugger.js.map +1 -1
  39. package/dist/diff-utils.d.ts.map +1 -1
  40. package/dist/diff-utils.js +1 -4
  41. package/dist/diff-utils.js.map +1 -1
  42. package/dist/editor-api.md +12 -2
  43. package/dist/editor-examples.d.ts +1 -1
  44. package/dist/editor-examples.d.ts.map +1 -1
  45. package/dist/editor-examples.js +1 -1
  46. package/dist/editor-examples.js.map +1 -1
  47. package/dist/editor.d.ts +1 -1
  48. package/dist/editor.d.ts.map +1 -1
  49. package/dist/editor.js +1 -1
  50. package/dist/editor.js.map +1 -1
  51. package/dist/executor.d.ts +26 -3
  52. package/dist/executor.d.ts.map +1 -1
  53. package/dist/executor.js +297 -64
  54. package/dist/executor.js.map +1 -1
  55. package/dist/executor.unit.test.js +38 -1
  56. package/dist/executor.unit.test.js.map +1 -1
  57. package/dist/extension-connection.test.js +139 -36
  58. package/dist/extension-connection.test.js.map +1 -1
  59. package/dist/ffmpeg.d.ts +148 -0
  60. package/dist/ffmpeg.d.ts.map +1 -0
  61. package/dist/ffmpeg.js +523 -0
  62. package/dist/ffmpeg.js.map +1 -0
  63. package/dist/ghost-browser.d.ts.map +1 -1
  64. package/dist/ghost-browser.js.map +1 -1
  65. package/dist/ghost-cursor-client.js +287 -0
  66. package/dist/ghost-cursor.d.ts +27 -0
  67. package/dist/ghost-cursor.d.ts.map +1 -0
  68. package/dist/ghost-cursor.js +63 -0
  69. package/dist/ghost-cursor.js.map +1 -0
  70. package/dist/htmlrewrite.d.ts.map +1 -1
  71. package/dist/htmlrewrite.js +17 -55
  72. package/dist/htmlrewrite.js.map +1 -1
  73. package/dist/htmlrewrite.test.js.map +1 -1
  74. package/dist/kill-port.d.ts.map +1 -1
  75. package/dist/kill-port.js +1 -3
  76. package/dist/kill-port.js.map +1 -1
  77. package/dist/locator-selector.test.d.ts +2 -0
  78. package/dist/locator-selector.test.d.ts.map +1 -0
  79. package/dist/locator-selector.test.js +96 -0
  80. package/dist/locator-selector.test.js.map +1 -0
  81. package/dist/mcp-client.js.map +1 -1
  82. package/dist/mcp.d.ts.map +1 -1
  83. package/dist/mcp.js +8 -3
  84. package/dist/mcp.js.map +1 -1
  85. package/dist/on-mouse-action.test.d.ts +2 -0
  86. package/dist/on-mouse-action.test.d.ts.map +1 -0
  87. package/dist/on-mouse-action.test.js +155 -0
  88. package/dist/on-mouse-action.test.js.map +1 -0
  89. package/dist/page-markdown.js +4 -4
  90. package/dist/page-markdown.js.map +1 -1
  91. package/dist/prompt.md +450 -377
  92. package/dist/protocol.d.ts +4 -0
  93. package/dist/protocol.d.ts.map +1 -1
  94. package/dist/readability.js +16 -2
  95. package/dist/recording-ghost-cursor.d.ts +41 -0
  96. package/dist/recording-ghost-cursor.d.ts.map +1 -0
  97. package/dist/recording-ghost-cursor.js +79 -0
  98. package/dist/recording-ghost-cursor.js.map +1 -0
  99. package/dist/recording-relay.d.ts.map +1 -1
  100. package/dist/recording-relay.js +8 -8
  101. package/dist/recording-relay.js.map +1 -1
  102. package/dist/relay-client.d.ts +17 -4
  103. package/dist/relay-client.d.ts.map +1 -1
  104. package/dist/relay-client.js +45 -11
  105. package/dist/relay-client.js.map +1 -1
  106. package/dist/relay-core.test.d.ts.map +1 -1
  107. package/dist/relay-core.test.js +515 -26
  108. package/dist/relay-core.test.js.map +1 -1
  109. package/dist/relay-navigation.test.d.ts.map +1 -1
  110. package/dist/relay-navigation.test.js +169 -31
  111. package/dist/relay-navigation.test.js.map +1 -1
  112. package/dist/relay-session.test.d.ts.map +1 -1
  113. package/dist/relay-session.test.js +113 -65
  114. package/dist/relay-session.test.js.map +1 -1
  115. package/dist/relay-state.d.ts +158 -0
  116. package/dist/relay-state.d.ts.map +1 -0
  117. package/dist/relay-state.js +306 -0
  118. package/dist/relay-state.js.map +1 -0
  119. package/dist/relay-state.test.d.ts +2 -0
  120. package/dist/relay-state.test.d.ts.map +1 -0
  121. package/dist/relay-state.test.js +472 -0
  122. package/dist/relay-state.test.js.map +1 -0
  123. package/dist/scoped-fs.d.ts.map +1 -1
  124. package/dist/scoped-fs.js.map +1 -1
  125. package/dist/screen-recording.d.ts +66 -4
  126. package/dist/screen-recording.d.ts.map +1 -1
  127. package/dist/screen-recording.js +150 -13
  128. package/dist/screen-recording.js.map +1 -1
  129. package/dist/screen-recording.test.d.ts +2 -0
  130. package/dist/screen-recording.test.d.ts.map +1 -0
  131. package/dist/screen-recording.test.js +102 -0
  132. package/dist/screen-recording.test.js.map +1 -0
  133. package/dist/selector-generator.js +1 -1
  134. package/dist/snapshot-tools.test.js +71 -28
  135. package/dist/snapshot-tools.test.js.map +1 -1
  136. package/dist/start-relay-server.d.ts +1 -1
  137. package/dist/start-relay-server.d.ts.map +1 -1
  138. package/dist/start-relay-server.js +1 -1
  139. package/dist/start-relay-server.js.map +1 -1
  140. package/dist/styles-api.md +8 -1
  141. package/dist/styles-examples.d.ts +1 -1
  142. package/dist/styles-examples.d.ts.map +1 -1
  143. package/dist/styles-examples.js +1 -1
  144. package/dist/styles-examples.js.map +1 -1
  145. package/dist/styles.d.ts.map +1 -1
  146. package/dist/styles.js +1 -3
  147. package/dist/styles.js.map +1 -1
  148. package/dist/test-declarations.d.ts.map +1 -1
  149. package/dist/test-utils.d.ts +1 -1
  150. package/dist/test-utils.d.ts.map +1 -1
  151. package/dist/test-utils.js +7 -5
  152. package/dist/test-utils.js.map +1 -1
  153. package/dist/utils.d.ts.map +1 -1
  154. package/dist/utils.js.map +1 -1
  155. package/dist/wait-for-page-load.d.ts.map +1 -1
  156. package/dist/wait-for-page-load.js +1 -1
  157. package/dist/wait-for-page-load.js.map +1 -1
  158. package/package.json +4 -3
  159. package/src/a11y-client.ts +5 -4
  160. package/src/aria-snapshot.test.ts +5 -2
  161. package/src/aria-snapshot.ts +306 -117
  162. package/src/aria-snapshot.unit.test.ts +199 -141
  163. package/src/aria-snapshots/github-interactive.txt +2 -0
  164. package/src/aria-snapshots/github-raw.txt +5 -1
  165. package/src/aria-snapshots/hackernews-interactive.txt +238 -241
  166. package/src/aria-snapshots/hackernews-raw.txt +265 -269
  167. package/src/assets/aria-labels-example.png +0 -0
  168. package/src/assets/aria-labels-github.png +0 -0
  169. package/src/assets/aria-labels-hacker-news.png +0 -0
  170. package/src/assets/aria-labels-old-reddit.png +0 -0
  171. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +5 -0
  172. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +18 -0
  173. package/src/cdp-log.ts +4 -1
  174. package/src/cdp-relay.ts +1059 -737
  175. package/src/cdp-session.ts +12 -3
  176. package/src/cdp-types.ts +51 -51
  177. package/src/clean-html.ts +4 -5
  178. package/src/cli.ts +82 -55
  179. package/src/create-logger.ts +5 -3
  180. package/src/debugger-examples-types.ts +4 -1
  181. package/src/debugger.ts +1 -5
  182. package/src/diff-utils.ts +2 -5
  183. package/src/editor-examples.ts +11 -1
  184. package/src/editor.ts +10 -2
  185. package/src/executor.ts +374 -73
  186. package/src/executor.unit.test.ts +48 -1
  187. package/src/extension-connection.test.ts +612 -488
  188. package/src/ffmpeg.ts +769 -0
  189. package/src/ghost-browser.ts +4 -6
  190. package/src/ghost-cursor-client.ts +369 -0
  191. package/src/ghost-cursor.ts +110 -0
  192. package/src/htmlrewrite.test.ts +6 -2
  193. package/src/htmlrewrite.ts +348 -386
  194. package/src/kill-port.ts +1 -3
  195. package/src/locator-selector.test.ts +115 -0
  196. package/src/mcp-client.ts +1 -1
  197. package/src/mcp.ts +21 -15
  198. package/src/on-mouse-action.test.ts +196 -0
  199. package/src/page-markdown.ts +7 -7
  200. package/src/protocol.ts +73 -57
  201. package/src/recording-ghost-cursor.ts +113 -0
  202. package/src/recording-relay.ts +20 -12
  203. package/src/relay-client.ts +85 -18
  204. package/src/relay-core.test.ts +1117 -578
  205. package/src/relay-navigation.test.ts +648 -483
  206. package/src/relay-session.test.ts +984 -929
  207. package/src/relay-state.test.ts +570 -0
  208. package/src/relay-state.ts +497 -0
  209. package/src/resource.md +21 -49
  210. package/src/scoped-fs.ts +9 -3
  211. package/src/screen-recording.test.ts +111 -0
  212. package/src/screen-recording.ts +256 -31
  213. package/src/skill.md +476 -396
  214. package/src/snapshot-tools.test.ts +580 -528
  215. package/src/snapshots/shadcn-ui-accessibility-full.md +8 -8
  216. package/src/snapshots/shadcn-ui-accessibility-interactive.md +8 -8
  217. package/src/start-relay-server.ts +14 -11
  218. package/src/styles-examples.ts +8 -1
  219. package/src/styles.ts +20 -21
  220. package/src/test-declarations.ts +6 -6
  221. package/src/test-utils.ts +104 -91
  222. package/src/utils.ts +2 -1
  223. package/src/wait-for-page-load.ts +6 -1
@@ -6,7 +6,7 @@ import { getCDPSessionForPage } from './cdp-session.js';
6
6
  import { Debugger } from './debugger.js';
7
7
  import { Editor } from './editor.js';
8
8
  import { PlaywrightExecutor } from './executor.js';
9
- import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, createSseServer, safeCloseCDPBrowser, withTimeout, js } from './test-utils.js';
9
+ import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, createSseServer, safeCloseCDPBrowser, withTimeout, js, } from './test-utils.js';
10
10
  import './test-declarations.js';
11
11
  const TEST_PORT = 19993;
12
12
  // --- CDP Session Tests ---
@@ -18,7 +18,7 @@ describe('CDP Session Tests', () => {
18
18
  await serviceWorker.evaluate(async () => {
19
19
  await globalThis.disconnectEverything();
20
20
  });
21
- await new Promise(r => setTimeout(r, 100));
21
+ await new Promise((r) => setTimeout(r, 100));
22
22
  }, 600000);
23
23
  afterAll(async () => {
24
24
  await cleanupTestContext(testCtx);
@@ -39,7 +39,7 @@ describe('CDP Session Tests', () => {
39
39
  await serviceWorker.evaluate(async () => {
40
40
  await globalThis.toggleExtensionForActiveTab();
41
41
  });
42
- await new Promise(r => setTimeout(r, 100));
42
+ await new Promise((r) => setTimeout(r, 100));
43
43
  const wsUrl = getCdpUrl({ port: TEST_PORT });
44
44
  const cdpSession = await getCDPSessionForPage({ page });
45
45
  const dbg = new Debugger({ cdp: cdpSession });
@@ -56,11 +56,11 @@ describe('CDP Session Tests', () => {
56
56
  const numberVar = 42;
57
57
  debugger;
58
58
  return localVar + numberVar;
59
- })()`
59
+ })()`,
60
60
  });
61
61
  await Promise.race([
62
62
  pausedPromise,
63
- new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000))
63
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000)),
64
64
  ]);
65
65
  expect(dbg.isPaused()).toBe(true);
66
66
  const location = await dbg.getLocation();
@@ -76,7 +76,7 @@ describe('CDP Session Tests', () => {
76
76
  const evalResult = await dbg.evaluate({ expression: 'localVar + " world"' });
77
77
  expect(evalResult.value).toBe('hello world');
78
78
  await dbg.resume();
79
- await new Promise(r => setTimeout(r, 100));
79
+ await new Promise((r) => setTimeout(r, 100));
80
80
  expect(dbg.isPaused()).toBe(false);
81
81
  await evalPromise;
82
82
  await cdpSession.detach();
@@ -92,7 +92,7 @@ describe('CDP Session Tests', () => {
92
92
  await serviceWorker.evaluate(async () => {
93
93
  await globalThis.toggleExtensionForActiveTab();
94
94
  });
95
- await new Promise(r => setTimeout(r, 100));
95
+ await new Promise((r) => setTimeout(r, 100));
96
96
  const executor = new PlaywrightExecutor({
97
97
  cdpConfig: { port: TEST_PORT },
98
98
  logger: {
@@ -114,16 +114,27 @@ describe('CDP Session Tests', () => {
114
114
  it('should list scripts with Debugger class', async () => {
115
115
  const browserContext = getBrowserContext();
116
116
  const serviceWorker = await getExtensionServiceWorker(browserContext);
117
- // Use a page with actual script URLs (not just inline scripts)
117
+ // Use setContent with external script URLs so Debugger.listScripts returns them
118
118
  const page = await browserContext.newPage();
119
- await page.goto('https://news.ycombinator.com/');
119
+ await page.setContent(`
120
+ <html>
121
+ <head>
122
+ <script src="data:text/javascript,function hello() { return 1; }"></script>
123
+ <script src="data:text/javascript,function world() { return 2; }"></script>
124
+ </head>
125
+ <body><h1>Script test</h1></body>
126
+ </html>
127
+ `);
120
128
  await page.bringToFront();
121
129
  await serviceWorker.evaluate(async () => {
122
130
  await globalThis.toggleExtensionForActiveTab();
123
131
  });
124
- await new Promise(r => setTimeout(r, 100));
132
+ await new Promise((r) => setTimeout(r, 100));
125
133
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
126
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('news.ycombinator'));
134
+ const cdpPage = browser
135
+ .contexts()[0]
136
+ .pages()
137
+ .find((p) => p.url().startsWith('about:'));
127
138
  expect(cdpPage).toBeDefined();
128
139
  const wsUrl = getCdpUrl({ port: TEST_PORT });
129
140
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
@@ -153,7 +164,7 @@ describe('CDP Session Tests', () => {
153
164
  await serviceWorker.evaluate(async () => {
154
165
  await globalThis.toggleExtensionForActiveTab();
155
166
  });
156
- await new Promise(r => setTimeout(r, 100));
167
+ await new Promise((r) => setTimeout(r, 100));
157
168
  const wsUrl = getCdpUrl({ port: TEST_PORT });
158
169
  const cdpSession = await getCDPSessionForPage({ page });
159
170
  const dbg = new Debugger({ cdp: cdpSession });
@@ -181,7 +192,7 @@ describe('CDP Session Tests', () => {
181
192
  await serviceWorker.evaluate(async () => {
182
193
  await globalThis.toggleExtensionForActiveTab();
183
194
  });
184
- await new Promise(r => setTimeout(r, 100));
195
+ await new Promise((r) => setTimeout(r, 100));
185
196
  const wsUrl = getCdpUrl({ port: TEST_PORT });
186
197
  const cdpSession = await getCDPSessionForPage({ page });
187
198
  const dbg = new Debugger({ cdp: cdpSession });
@@ -199,7 +210,7 @@ describe('CDP Session Tests', () => {
199
210
  }
200
211
  const result = inner();
201
212
  return result;
202
- })()`
213
+ })()`,
203
214
  });
204
215
  await pausedPromise;
205
216
  expect(dbg.isPaused()).toBe(true);
@@ -236,7 +247,7 @@ describe('CDP Session Tests', () => {
236
247
  await serviceWorker.evaluate(async () => {
237
248
  await globalThis.toggleExtensionForActiveTab();
238
249
  });
239
- await new Promise(r => setTimeout(r, 100));
250
+ await new Promise((r) => setTimeout(r, 100));
240
251
  const wsUrl = getCdpUrl({ port: TEST_PORT });
241
252
  const cdpSession = await getCDPSessionForPage({ page });
242
253
  await cdpSession.send('Profiler.enable');
@@ -253,13 +264,13 @@ describe('CDP Session Tests', () => {
253
264
  for (let i = 0; i < 1000; i++) {
254
265
  document.querySelectorAll('*')
255
266
  }
256
- })()`
267
+ })()`,
257
268
  });
258
269
  const stopResult = await cdpSession.send('Profiler.stop');
259
270
  const profile = stopResult.profile;
260
271
  const functionNames = profile.nodes
261
- .map(n => n.callFrame.functionName)
262
- .filter(name => name && name.length > 0)
272
+ .map((n) => n.callFrame.functionName)
273
+ .filter((name) => name && name.length > 0)
263
274
  .slice(0, 10);
264
275
  expect(profile.nodes.length).toBeGreaterThan(0);
265
276
  expect(profile.endTime - profile.startTime).toBeGreaterThan(0);
@@ -280,24 +291,27 @@ describe('CDP Session Tests', () => {
280
291
  await serviceWorker.evaluate(async () => {
281
292
  await globalThis.toggleExtensionForActiveTab();
282
293
  });
283
- await new Promise(r => setTimeout(r, 100));
294
+ await new Promise((r) => setTimeout(r, 100));
284
295
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
285
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
296
+ const cdpPage = browser
297
+ .contexts()[0]
298
+ .pages()
299
+ .find((p) => p.url().includes('example.com'));
286
300
  expect(cdpPage).toBeDefined();
287
301
  const wsUrl = getCdpUrl({ port: TEST_PORT });
288
302
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
289
303
  const initialTargets = await cdpSession.send('Target.getTargets');
290
- const initialPageTarget = initialTargets.targetInfos.find(t => t.type === 'page' && t.url.includes('example.com'));
304
+ const initialPageTarget = initialTargets.targetInfos.find((t) => t.type === 'page' && t.url.includes('example.com'));
291
305
  expect(initialPageTarget?.url).toBe('https://example.com/');
292
306
  await cdpPage.goto('https://example.org/', { waitUntil: 'domcontentloaded' });
293
- await new Promise(r => setTimeout(r, 100));
307
+ await new Promise((r) => setTimeout(r, 100));
294
308
  const afterNavTargets = await cdpSession.send('Target.getTargets');
295
- const allPageTargets = afterNavTargets.targetInfos.filter(t => t.type === 'page');
296
- const aboutBlankTargets = allPageTargets.filter(t => t.url === 'about:blank');
309
+ const allPageTargets = afterNavTargets.targetInfos.filter((t) => t.type === 'page');
310
+ const aboutBlankTargets = allPageTargets.filter((t) => t.url === 'about:blank');
297
311
  expect(aboutBlankTargets).toHaveLength(0);
298
- const exampleComTargets = allPageTargets.filter(t => t.url.includes('example.com'));
312
+ const exampleComTargets = allPageTargets.filter((t) => t.url.includes('example.com'));
299
313
  expect(exampleComTargets).toHaveLength(0);
300
- const exampleOrgTargets = allPageTargets.filter(t => t.url.includes('example.org'));
314
+ const exampleOrgTargets = allPageTargets.filter((t) => t.url.includes('example.org'));
301
315
  expect(exampleOrgTargets).toHaveLength(1);
302
316
  await cdpSession.detach();
303
317
  await browser.close();
@@ -321,18 +335,21 @@ describe('CDP Session Tests', () => {
321
335
  await serviceWorker.evaluate(async () => {
322
336
  await globalThis.toggleExtensionForActiveTab();
323
337
  });
324
- await new Promise(r => setTimeout(r, 100));
338
+ await new Promise((r) => setTimeout(r, 100));
325
339
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
326
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
340
+ const cdpPage = browser
341
+ .contexts()[0]
342
+ .pages()
343
+ .find((p) => p.url().includes('example.com'));
327
344
  expect(cdpPage).toBeDefined();
328
345
  const wsUrl = getCdpUrl({ port: TEST_PORT });
329
346
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
330
347
  const { targetInfos } = await cdpSession.send('Target.getTargets');
331
- const allPageTargets = targetInfos.filter(t => t.type === 'page');
332
- const aboutBlankTargets = allPageTargets.filter(t => t.url === 'about:blank');
348
+ const allPageTargets = targetInfos.filter((t) => t.type === 'page');
349
+ const aboutBlankTargets = allPageTargets.filter((t) => t.url === 'about:blank');
333
350
  expect(aboutBlankTargets).toHaveLength(0);
334
351
  const pageTargets = allPageTargets
335
- .map(t => ({ type: t.type, url: t.url }))
352
+ .map((t) => ({ type: t.type, url: t.url }))
336
353
  .sort((a, b) => a.url.localeCompare(b.url));
337
354
  expect(pageTargets).toMatchInlineSnapshot(`
338
355
  [
@@ -360,11 +377,14 @@ describe('CDP Session Tests', () => {
360
377
  await serviceWorker.evaluate(async () => {
361
378
  await globalThis.toggleExtensionForActiveTab();
362
379
  });
363
- await new Promise(r => setTimeout(r, 100));
380
+ await new Promise((r) => setTimeout(r, 100));
364
381
  await page.goto('https://example.org/', { waitUntil: 'domcontentloaded' });
365
- await new Promise(r => setTimeout(r, 100));
382
+ await new Promise((r) => setTimeout(r, 100));
366
383
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
367
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.org'));
384
+ const cdpPage = browser
385
+ .contexts()[0]
386
+ .pages()
387
+ .find((p) => p.url().includes('example.org'));
368
388
  expect(cdpPage).toBeDefined();
369
389
  const wsUrl = getCdpUrl({ port: TEST_PORT });
370
390
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
@@ -387,9 +407,12 @@ describe('CDP Session Tests', () => {
387
407
  await serviceWorker.evaluate(async () => {
388
408
  await globalThis.toggleExtensionForActiveTab();
389
409
  });
390
- await new Promise(r => setTimeout(r, 100));
410
+ await new Promise((r) => setTimeout(r, 100));
391
411
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
392
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
412
+ const cdpPage = browser
413
+ .contexts()[0]
414
+ .pages()
415
+ .find((p) => p.url().includes('example.com'));
393
416
  expect(cdpPage).toBeDefined();
394
417
  const wsUrl = getCdpUrl({ port: TEST_PORT });
395
418
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
@@ -427,9 +450,12 @@ describe('CDP Session Tests', () => {
427
450
  await serviceWorker.evaluate(async () => {
428
451
  await globalThis.toggleExtensionForActiveTab();
429
452
  });
430
- await new Promise(r => setTimeout(r, 100));
453
+ await new Promise((r) => setTimeout(r, 100));
431
454
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
432
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
455
+ const cdpPage = browser
456
+ .contexts()[0]
457
+ .pages()
458
+ .find((p) => p.url().includes('example.com'));
433
459
  expect(cdpPage).toBeDefined();
434
460
  const wsUrl = getCdpUrl({ port: TEST_PORT });
435
461
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
@@ -446,11 +472,11 @@ describe('CDP Session Tests', () => {
446
472
  } catch (e) {
447
473
  // caught but should still pause with state 'all'
448
474
  }
449
- })()`
475
+ })()`,
450
476
  });
451
477
  await Promise.race([
452
478
  pausedPromise,
453
- new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000))
479
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000)),
454
480
  ]);
455
481
  expect(dbg.isPaused()).toBe(true);
456
482
  const location = await dbg.getLocation();
@@ -490,7 +516,7 @@ describe('CDP Session Tests', () => {
490
516
  await serviceWorker.evaluate(async () => {
491
517
  await globalThis.toggleExtensionForActiveTab();
492
518
  });
493
- await new Promise(r => setTimeout(r, 100));
519
+ await new Promise((r) => setTimeout(r, 100));
494
520
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
495
521
  let cdpPage;
496
522
  for (const p of browser.contexts()[0].pages()) {
@@ -546,16 +572,21 @@ describe('CDP Session Tests', () => {
546
572
  await serviceWorker.evaluate(async () => {
547
573
  await globalThis.toggleExtensionForActiveTab();
548
574
  });
549
- await new Promise(r => setTimeout(r, 100));
575
+ await new Promise((r) => setTimeout(r, 100));
550
576
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
551
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
577
+ const cdpPage = browser
578
+ .contexts()[0]
579
+ .pages()
580
+ .find((p) => p.url().includes('example.com'));
552
581
  expect(cdpPage).toBeDefined();
553
582
  const h1Bounds = await cdpPage.locator('h1').boundingBox();
554
583
  expect(h1Bounds).toBeDefined();
555
584
  console.log('H1 bounding box:', h1Bounds);
556
585
  await cdpPage.evaluate(() => {
586
+ ;
557
587
  window.clickedAt = null;
558
588
  document.addEventListener('click', (e) => {
589
+ ;
559
590
  window.clickedAt = { x: e.clientX, y: e.clientY };
560
591
  });
561
592
  });
@@ -577,9 +608,12 @@ describe('CDP Session Tests', () => {
577
608
  await serviceWorker.evaluate(async () => {
578
609
  await globalThis.toggleExtensionForActiveTab();
579
610
  });
580
- await new Promise(r => setTimeout(r, 100));
611
+ await new Promise((r) => setTimeout(r, 100));
581
612
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
582
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
613
+ const cdpPage = browser
614
+ .contexts()[0]
615
+ .pages()
616
+ .find((p) => p.url().includes('example.com'));
583
617
  expect(cdpPage).toBeDefined();
584
618
  const wsUrl = getCdpUrl({ port: TEST_PORT });
585
619
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
@@ -593,7 +627,7 @@ describe('CDP Session Tests', () => {
593
627
  }
594
628
  `,
595
629
  });
596
- await new Promise(r => setTimeout(r, 100));
630
+ await new Promise((r) => setTimeout(r, 100));
597
631
  const scripts = await editor.list();
598
632
  expect(scripts.length).toBeGreaterThan(0);
599
633
  const matches = await editor.grep({ regex: /greetUser/ });
@@ -608,13 +642,14 @@ describe('CDP Session Tests', () => {
608
642
  newString: "console.log('Hello, ' + name); console.log('EDITOR_TEST_MARKER');",
609
643
  });
610
644
  const consoleLogs = [];
611
- cdpPage.on('console', msg => {
645
+ cdpPage.on('console', (msg) => {
612
646
  consoleLogs.push(msg.text());
613
647
  });
614
648
  await cdpPage.evaluate(() => {
649
+ ;
615
650
  window.greetUser('World');
616
651
  });
617
- await new Promise(r => setTimeout(r, 100));
652
+ await new Promise((r) => setTimeout(r, 100));
618
653
  expect(consoleLogs).toContain('Hello, World');
619
654
  expect(consoleLogs).toContain('EDITOR_TEST_MARKER');
620
655
  await cdpSession.detach();
@@ -630,9 +665,12 @@ describe('CDP Session Tests', () => {
630
665
  await serviceWorker.evaluate(async () => {
631
666
  await globalThis.toggleExtensionForActiveTab();
632
667
  });
633
- await new Promise(r => setTimeout(r, 100));
668
+ await new Promise((r) => setTimeout(r, 100));
634
669
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
635
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
670
+ const cdpPage = browser
671
+ .contexts()[0]
672
+ .pages()
673
+ .find((p) => p.url().includes('example.com'));
636
674
  expect(cdpPage).toBeDefined();
637
675
  const wsUrl = getCdpUrl({ port: TEST_PORT });
638
676
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
@@ -646,7 +684,7 @@ describe('CDP Session Tests', () => {
646
684
  }
647
685
  `,
648
686
  });
649
- await new Promise(r => setTimeout(r, 100));
687
+ await new Promise((r) => setTimeout(r, 100));
650
688
  const stylesheets = await editor.list({ pattern: /inline-css:/ });
651
689
  expect(stylesheets.length).toBeGreaterThan(0);
652
690
  const cssMatches = await editor.grep({ regex: /editor-test-element/, pattern: /inline-css:/ });
@@ -709,10 +747,10 @@ describe('CDP Session Tests', () => {
709
747
  await serviceWorker.evaluate(async () => {
710
748
  await globalThis.toggleExtensionForActiveTab();
711
749
  });
712
- await new Promise(r => setTimeout(r, 500));
750
+ await new Promise((r) => setTimeout(r, 500));
713
751
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
714
752
  const pages = browser.contexts()[0].pages();
715
- const cdpPage = pages.find(p => p.url().startsWith('about:'));
753
+ const cdpPage = pages.find((p) => p.url().startsWith('about:'));
716
754
  expect(cdpPage).toBeDefined();
717
755
  const btn = cdpPage.locator('#react-btn');
718
756
  const btnCount = await btn.count();
@@ -774,7 +812,7 @@ describe('Service Worker Target Tests', () => {
774
812
  await serviceWorker.evaluate(async () => {
775
813
  await globalThis.toggleExtensionForActiveTab();
776
814
  });
777
- await new Promise(r => setTimeout(r, 500));
815
+ await new Promise((r) => setTimeout(r, 500));
778
816
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
779
817
  const context = browser.contexts()[0];
780
818
  const pages = context.pages();
@@ -784,7 +822,7 @@ describe('Service Worker Target Tests', () => {
784
822
  expect(url).not.toMatch(/sw\.js$/i);
785
823
  expect(url).not.toMatch(/service.?worker/i);
786
824
  }
787
- const targetPage = pages.find(p => p.url().includes('web.dev'));
825
+ const targetPage = pages.find((p) => p.url().includes('web.dev'));
788
826
  expect(targetPage).toBeDefined();
789
827
  const title = await targetPage.title();
790
828
  expect(title).toBeTruthy();
@@ -800,20 +838,23 @@ describe('Service Worker Target Tests', () => {
800
838
  await serviceWorker.evaluate(async () => {
801
839
  await globalThis.toggleExtensionForActiveTab();
802
840
  });
803
- await new Promise(r => setTimeout(r, 100));
841
+ await new Promise((r) => setTimeout(r, 100));
804
842
  const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
805
- const cdpPage = browser.contexts()[0].pages().find(p => p.url().includes('example.com'));
843
+ const cdpPage = browser
844
+ .contexts()[0]
845
+ .pages()
846
+ .find((p) => p.url().includes('example.com'));
806
847
  expect(cdpPage).toBeDefined();
807
848
  const wsUrl = getCdpUrl({ port: TEST_PORT });
808
849
  const cdpSession = await getCDPSessionForPage({ page: cdpPage });
809
850
  await cdpSession.send('Network.disable');
810
851
  await cdpSession.send('Network.enable', {
811
852
  maxTotalBufferSize: 10000000,
812
- maxResourceBufferSize: 5000000
853
+ maxResourceBufferSize: 5000000,
813
854
  });
814
855
  const [response] = await Promise.all([
815
- cdpPage.waitForResponse(resp => resp.url() === 'https://example.com/'),
816
- cdpPage.goto('https://example.com/')
856
+ cdpPage.waitForResponse((resp) => resp.url() === 'https://example.com/'),
857
+ cdpPage.goto('https://example.com/'),
817
858
  ]);
818
859
  const body = await response.text();
819
860
  expect(body).toBeDefined();
@@ -864,7 +905,10 @@ describe('Service Worker Target Tests', () => {
864
905
  timeoutMs: 5000,
865
906
  errorMessage: 'connectOverCDP timed out',
866
907
  });
867
- const cdpPage = browser.contexts()[0].pages().find((p) => {
908
+ const cdpPage = browser
909
+ .contexts()[0]
910
+ .pages()
911
+ .find((p) => {
868
912
  return p.url().startsWith(sseServer.baseUrl);
869
913
  });
870
914
  expect(cdpPage).toBeDefined();
@@ -940,7 +984,7 @@ describe('Auto-enable Tests', () => {
940
984
  await serviceWorker.evaluate(async () => {
941
985
  await globalThis.disconnectEverything();
942
986
  });
943
- await new Promise(r => setTimeout(r, 100));
987
+ await new Promise((r) => setTimeout(r, 100));
944
988
  }, 600000);
945
989
  afterAll(async () => {
946
990
  delete process.env.PLAYWRITER_AUTO_ENABLE;
@@ -959,7 +1003,7 @@ describe('Auto-enable Tests', () => {
959
1003
  await serviceWorker.evaluate(async () => {
960
1004
  await globalThis.disconnectEverything();
961
1005
  });
962
- await new Promise(r => setTimeout(r, 100));
1006
+ await new Promise((r) => setTimeout(r, 100));
963
1007
  const tabCountBefore = await serviceWorker.evaluate(() => {
964
1008
  const state = globalThis.getExtensionState();
965
1009
  return state.tabs.size;
@@ -987,7 +1031,9 @@ describe('Auto-enable Tests', () => {
987
1031
  await serviceWorker.evaluate(async () => {
988
1032
  await globalThis.disconnectEverything();
989
1033
  });
990
- await new Promise((r) => { setTimeout(r, 100); });
1034
+ await new Promise((r) => {
1035
+ setTimeout(r, 100);
1036
+ });
991
1037
  const tabCountBefore = await serviceWorker.evaluate(() => {
992
1038
  const state = globalThis.getExtensionState();
993
1039
  return state.tabs.size;
@@ -1019,7 +1065,9 @@ describe('Auto-enable Tests', () => {
1019
1065
  `,
1020
1066
  },
1021
1067
  });
1022
- await new Promise((r) => { setTimeout(r, 100); });
1068
+ await new Promise((r) => {
1069
+ setTimeout(r, 100);
1070
+ });
1023
1071
  const afterCloseResult = await client.callTool({
1024
1072
  name: 'execute',
1025
1073
  arguments: {