patchright-core 1.57.0 → 1.59.0

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 (307) hide show
  1. package/ThirdPartyNotices.txt +2688 -297
  2. package/browsers.json +23 -22
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +48 -413
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -0
  10. package/lib/client/browser.js +11 -5
  11. package/lib/client/browserContext.js +20 -23
  12. package/lib/client/browserType.js +23 -54
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/clientHelper.js +2 -1
  16. package/lib/client/clock.js +0 -1
  17. package/lib/client/{webSocket.js → connect.js} +57 -7
  18. package/lib/client/connection.js +8 -0
  19. package/lib/client/consoleMessage.js +3 -0
  20. package/lib/client/debugger.js +57 -0
  21. package/lib/client/dialog.js +8 -1
  22. package/lib/client/disposable.js +76 -0
  23. package/lib/client/electron.js +1 -0
  24. package/lib/client/elementHandle.js +1 -1
  25. package/lib/client/events.js +3 -0
  26. package/lib/client/fetch.js +2 -4
  27. package/lib/client/frame.js +9 -13
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -36
  31. package/lib/client/network.js +14 -11
  32. package/lib/client/page.js +44 -50
  33. package/lib/client/screencast.js +88 -0
  34. package/lib/client/selectors.js +3 -1
  35. package/lib/client/tracing.js +11 -5
  36. package/lib/client/video.js +13 -20
  37. package/lib/client/worker.js +6 -6
  38. package/lib/generated/bindingsControllerSource.js +1 -1
  39. package/lib/generated/clockSource.js +1 -1
  40. package/lib/generated/injectedScriptSource.js +1 -1
  41. package/lib/generated/pollingRecorderSource.js +1 -1
  42. package/lib/generated/storageScriptSource.js +1 -1
  43. package/lib/generated/utilityScriptSource.js +1 -1
  44. package/lib/mcpBundle.js +78 -0
  45. package/lib/mcpBundleImpl.js +91 -0
  46. package/lib/protocol/serializers.js +5 -0
  47. package/lib/protocol/validator.js +228 -58
  48. package/lib/protocol/validatorPrimitives.js +1 -1
  49. package/lib/remote/playwrightConnection.js +10 -8
  50. package/lib/remote/playwrightPipeServer.js +100 -0
  51. package/lib/remote/playwrightServer.js +14 -10
  52. package/lib/remote/playwrightWebSocketServer.js +73 -0
  53. package/lib/remote/serverTransport.js +96 -0
  54. package/lib/server/android/android.js +2 -2
  55. package/lib/server/artifact.js +1 -1
  56. package/lib/server/bidi/bidiBrowser.js +80 -14
  57. package/lib/server/bidi/bidiChromium.js +23 -14
  58. package/lib/server/bidi/bidiConnection.js +1 -0
  59. package/lib/server/bidi/bidiDeserializer.js +116 -0
  60. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  61. package/lib/server/bidi/bidiFirefox.js +6 -8
  62. package/lib/server/bidi/bidiNetworkManager.js +40 -12
  63. package/lib/server/bidi/bidiPage.js +67 -40
  64. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  65. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  66. package/lib/server/browser.js +84 -21
  67. package/lib/server/browserContext.js +137 -77
  68. package/lib/server/browserType.js +26 -16
  69. package/lib/server/chromium/chromium.js +28 -31
  70. package/lib/server/chromium/chromiumSwitches.js +16 -4
  71. package/lib/server/chromium/crBrowser.js +40 -27
  72. package/lib/server/chromium/crConnection.js +0 -5
  73. package/lib/server/chromium/crDevTools.js +1 -2
  74. package/lib/server/chromium/crNetworkManager.js +54 -229
  75. package/lib/server/chromium/crPage.js +74 -260
  76. package/lib/server/chromium/crServiceWorker.js +7 -14
  77. package/lib/server/clock.js +33 -41
  78. package/lib/server/codegen/javascript.js +6 -29
  79. package/lib/server/console.js +5 -1
  80. package/lib/server/debugController.js +12 -6
  81. package/lib/server/debugger.js +40 -47
  82. package/lib/server/deviceDescriptorsSource.json +137 -137
  83. package/lib/server/dispatchers/browserContextDispatcher.js +30 -30
  84. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  85. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  86. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  87. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  88. package/lib/server/dispatchers/dispatcher.js +7 -14
  89. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  90. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  91. package/lib/server/dispatchers/frameDispatcher.js +7 -7
  92. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  93. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  94. package/lib/server/dispatchers/pageDispatcher.js +101 -34
  95. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  96. package/lib/server/disposable.js +41 -0
  97. package/lib/server/dom.js +56 -29
  98. package/lib/server/download.js +3 -2
  99. package/lib/server/electron/electron.js +17 -9
  100. package/lib/server/firefox/ffBrowser.js +9 -29
  101. package/lib/server/firefox/ffConnection.js +0 -5
  102. package/lib/server/firefox/ffInput.js +21 -5
  103. package/lib/server/firefox/ffNetworkManager.js +4 -4
  104. package/lib/server/firefox/ffPage.js +27 -33
  105. package/lib/server/firefox/firefox.js +6 -8
  106. package/lib/server/frameSelectors.js +14 -169
  107. package/lib/server/frames.js +263 -551
  108. package/lib/server/har/harRecorder.js +2 -2
  109. package/lib/server/har/harTracer.js +5 -4
  110. package/lib/server/input.js +49 -4
  111. package/lib/server/instrumentation.js +8 -0
  112. package/lib/server/javascript.js +6 -22
  113. package/lib/server/launchApp.js +0 -1
  114. package/lib/server/localUtils.js +6 -6
  115. package/lib/server/network.js +59 -20
  116. package/lib/server/overlay.js +138 -0
  117. package/lib/server/page.js +179 -157
  118. package/lib/server/progress.js +32 -6
  119. package/lib/server/recorder/recorderApp.js +84 -104
  120. package/lib/server/recorder.js +76 -40
  121. package/lib/server/registry/browserFetcher.js +6 -4
  122. package/lib/server/registry/index.js +222 -226
  123. package/lib/server/registry/nativeDeps.js +1 -0
  124. package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
  125. package/lib/server/screencast.js +137 -0
  126. package/lib/server/trace/recorder/snapshotter.js +2 -2
  127. package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
  128. package/lib/server/trace/recorder/tracing.js +98 -47
  129. package/lib/server/trace/viewer/traceViewer.js +24 -21
  130. package/lib/server/usKeyboardLayout.js +7 -0
  131. package/lib/server/utils/comparators.js +1 -1
  132. package/lib/server/utils/disposable.js +32 -0
  133. package/lib/server/utils/eventsHelper.js +3 -1
  134. package/lib/server/utils/expectUtils.js +87 -2
  135. package/lib/server/utils/fileUtils.js +16 -2
  136. package/lib/server/utils/happyEyeballs.js +15 -12
  137. package/lib/server/utils/httpServer.js +10 -23
  138. package/lib/server/utils/network.js +39 -29
  139. package/lib/server/utils/processLauncher.js +8 -6
  140. package/lib/server/utils/zipFile.js +2 -2
  141. package/lib/server/videoRecorder.js +194 -0
  142. package/lib/server/webkit/webkit.js +4 -6
  143. package/lib/server/webkit/wkBrowser.js +1 -10
  144. package/lib/server/webkit/wkConnection.js +1 -6
  145. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  146. package/lib/server/webkit/wkPage.js +88 -57
  147. package/lib/server/webkit/wkWorkers.js +2 -1
  148. package/lib/serverRegistry.js +156 -0
  149. package/lib/tools/backend/browserBackend.js +79 -0
  150. package/lib/tools/backend/common.js +63 -0
  151. package/lib/tools/backend/config.js +41 -0
  152. package/lib/tools/backend/console.js +66 -0
  153. package/lib/tools/backend/context.js +296 -0
  154. package/lib/tools/backend/cookies.js +152 -0
  155. package/lib/tools/backend/devtools.js +69 -0
  156. package/lib/tools/backend/dialogs.js +59 -0
  157. package/lib/tools/backend/evaluate.js +64 -0
  158. package/lib/tools/backend/files.js +60 -0
  159. package/lib/tools/backend/form.js +64 -0
  160. package/lib/tools/backend/keyboard.js +155 -0
  161. package/lib/tools/backend/logFile.js +95 -0
  162. package/lib/tools/backend/mouse.js +168 -0
  163. package/lib/tools/backend/navigate.js +106 -0
  164. package/lib/tools/backend/network.js +135 -0
  165. package/lib/tools/backend/pdf.js +48 -0
  166. package/lib/tools/backend/response.js +305 -0
  167. package/lib/tools/backend/route.js +140 -0
  168. package/lib/tools/backend/runCode.js +77 -0
  169. package/lib/tools/backend/screenshot.js +88 -0
  170. package/lib/tools/backend/sessionLog.js +74 -0
  171. package/lib/tools/backend/snapshot.js +208 -0
  172. package/lib/tools/backend/storage.js +68 -0
  173. package/lib/tools/backend/tab.js +445 -0
  174. package/lib/tools/backend/tabs.js +67 -0
  175. package/lib/tools/backend/tool.js +47 -0
  176. package/lib/tools/backend/tools.js +102 -0
  177. package/lib/tools/backend/tracing.js +78 -0
  178. package/lib/tools/backend/utils.js +83 -0
  179. package/lib/tools/backend/verify.js +151 -0
  180. package/lib/tools/backend/video.js +98 -0
  181. package/lib/tools/backend/wait.js +63 -0
  182. package/lib/tools/backend/webstorage.js +223 -0
  183. package/lib/tools/cli-client/cli.js +6 -0
  184. package/lib/tools/cli-client/help.json +399 -0
  185. package/lib/tools/cli-client/minimist.js +128 -0
  186. package/lib/tools/cli-client/program.js +350 -0
  187. package/lib/tools/cli-client/registry.js +176 -0
  188. package/lib/tools/cli-client/session.js +289 -0
  189. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  190. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  191. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  192. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  193. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  194. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  195. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  196. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  197. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  198. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  199. package/lib/tools/cli-daemon/command.js +73 -0
  200. package/lib/tools/cli-daemon/commands.js +956 -0
  201. package/lib/tools/cli-daemon/daemon.js +157 -0
  202. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  203. package/lib/tools/cli-daemon/program.js +129 -0
  204. package/lib/tools/dashboard/appIcon.png +0 -0
  205. package/lib/tools/dashboard/dashboardApp.js +284 -0
  206. package/lib/tools/dashboard/dashboardController.js +296 -0
  207. package/lib/tools/exports.js +60 -0
  208. package/lib/tools/mcp/browserFactory.js +233 -0
  209. package/lib/tools/mcp/cdpRelay.js +352 -0
  210. package/lib/tools/mcp/cli-stub.js +7 -0
  211. package/lib/tools/mcp/config.d.js +16 -0
  212. package/lib/tools/mcp/config.js +446 -0
  213. package/lib/tools/mcp/configIni.js +189 -0
  214. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  215. package/lib/tools/mcp/index.js +62 -0
  216. package/lib/tools/mcp/log.js +35 -0
  217. package/lib/tools/mcp/program.js +107 -0
  218. package/lib/tools/mcp/protocol.js +28 -0
  219. package/lib/tools/mcp/watchdog.js +44 -0
  220. package/lib/tools/trace/SKILL.md +171 -0
  221. package/lib/tools/trace/installSkill.js +48 -0
  222. package/lib/tools/trace/traceActions.js +142 -0
  223. package/lib/tools/trace/traceAttachments.js +69 -0
  224. package/lib/tools/trace/traceCli.js +87 -0
  225. package/lib/tools/trace/traceConsole.js +97 -0
  226. package/lib/tools/trace/traceErrors.js +55 -0
  227. package/lib/tools/trace/traceOpen.js +69 -0
  228. package/lib/tools/trace/traceParser.js +96 -0
  229. package/lib/tools/trace/traceRequests.js +182 -0
  230. package/lib/tools/trace/traceScreenshot.js +68 -0
  231. package/lib/tools/trace/traceSnapshot.js +149 -0
  232. package/lib/tools/trace/traceUtils.js +153 -0
  233. package/lib/tools/utils/connect.js +32 -0
  234. package/lib/tools/utils/mcp/http.js +152 -0
  235. package/lib/tools/utils/mcp/server.js +230 -0
  236. package/lib/tools/utils/mcp/tool.js +47 -0
  237. package/lib/tools/utils/socketConnection.js +108 -0
  238. package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
  239. package/lib/utils/isomorphic/formatUtils.js +64 -0
  240. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  241. package/lib/utils/isomorphic/lruCache.js +51 -0
  242. package/lib/utils/isomorphic/mimeType.js +7 -2
  243. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  244. package/lib/utils/isomorphic/protocolMetainfo.js +127 -98
  245. package/lib/utils/isomorphic/stringUtils.js +49 -0
  246. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  247. package/lib/utils/isomorphic/trace/entries.js +16 -0
  248. package/lib/utils/isomorphic/trace/snapshotRenderer.js +492 -0
  249. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  250. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  251. package/lib/utils/isomorphic/trace/traceLoader.js +132 -0
  252. package/lib/utils/isomorphic/trace/traceModel.js +366 -0
  253. package/lib/utils/isomorphic/trace/traceModernizer.js +401 -0
  254. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  255. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  256. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  257. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  258. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  259. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  260. package/lib/utils/isomorphic/urlMatch.js +54 -1
  261. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  262. package/lib/utils/isomorphic/yaml.js +84 -0
  263. package/lib/utils.js +8 -2
  264. package/lib/utilsBundle.js +5 -26
  265. package/lib/utilsBundleImpl/index.js +172 -173
  266. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  267. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  268. package/lib/vite/dashboard/index.html +28 -0
  269. package/lib/vite/htmlReport/index.html +2 -70
  270. package/lib/vite/htmlReport/report.css +1 -0
  271. package/lib/vite/htmlReport/report.js +72 -0
  272. package/lib/vite/recorder/assets/codeMirrorModule-C8KMvO9L.js +32 -0
  273. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  274. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  275. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  276. package/lib/vite/recorder/index.html +2 -2
  277. package/lib/vite/traceViewer/assets/codeMirrorModule-DS0FLvoc.js +32 -0
  278. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  279. package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
  280. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  281. package/lib/vite/traceViewer/index.CzXZzn5A.css +1 -0
  282. package/lib/vite/traceViewer/index.Dtstcb7U.js +2 -0
  283. package/lib/vite/traceViewer/index.html +4 -4
  284. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  285. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  286. package/lib/vite/traceViewer/uiMode.html +3 -3
  287. package/lib/zipBundleImpl.js +2 -2
  288. package/lib/zodBundle.js +39 -0
  289. package/lib/zodBundleImpl.js +40 -0
  290. package/package.json +7 -1
  291. package/types/protocol.d.ts +1696 -221
  292. package/types/types.d.ts +879 -112
  293. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
  294. package/lib/server/chromium/videoRecorder.js +0 -115
  295. package/lib/server/pageBinding.js +0 -87
  296. package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
  297. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  298. package/lib/vite/recorder/assets/codeMirrorModule-CBbSe-ZI.js +0 -25
  299. package/lib/vite/recorder/assets/index-CpZVd2nA.js +0 -193
  300. package/lib/vite/traceViewer/assets/codeMirrorModule-DHz0wP2C.js +0 -25
  301. package/lib/vite/traceViewer/assets/defaultSettingsView-WsZP88O6.js +0 -266
  302. package/lib/vite/traceViewer/defaultSettingsView.ConWv5KN.css +0 -1
  303. package/lib/vite/traceViewer/index.C4Y3Aw8n.css +0 -1
  304. package/lib/vite/traceViewer/index.C8xAeo93.js +0 -2
  305. package/lib/vite/traceViewer/uiMode.BltraIJB.js +0 -5
  306. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  307. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -38,82 +38,74 @@ class Clock {
38
38
  this._browserContext = browserContext;
39
39
  }
40
40
  async uninstall(progress) {
41
- await progress.race(this._browserContext.removeInitScripts(this._initScripts));
41
+ await progress.race(Promise.all(this._initScripts.map((script) => script.dispose())));
42
42
  this._initScripts = [];
43
43
  }
44
- async fastForward(progress, ticks) {
45
- await this._installIfNeeded(progress);
44
+ async fastForward(ticks) {
45
+ await this._installIfNeeded();
46
46
  const ticksMillis = parseTicks(ticks);
47
- this._initScripts.push(await this._browserContext.addInitScript(progress, `globalThis.__pwClock.controller.log('fastForward', ${Date.now()}, ${ticksMillis})`));
48
- await progress.race(this._evaluateInFrames(`globalThis.__pwClock.controller.fastForward(${ticksMillis})`));
47
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('fastForward', ${Date.now()}, ${ticksMillis})`));
48
+ await this._evaluateInFrames(`globalThis.__pwClock.controller.fastForward(${ticksMillis})`);
49
49
  }
50
- async install(progress, time) {
51
- await this._installIfNeeded(progress);
50
+ async install(time) {
51
+ await this._installIfNeeded();
52
52
  const timeMillis = time !== void 0 ? parseTime(time) : Date.now();
53
- this._initScripts.push(await this._browserContext.addInitScript(progress, `globalThis.__pwClock.controller.log('install', ${Date.now()}, ${timeMillis})`));
54
- await progress.race(this._evaluateInFrames(`globalThis.__pwClock.controller.install(${timeMillis})`));
53
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('install', ${Date.now()}, ${timeMillis})`));
54
+ await this._evaluateInFrames(`globalThis.__pwClock.controller.install(${timeMillis})`);
55
55
  }
56
- async pauseAt(progress, ticks) {
57
- await this._installIfNeeded(progress);
56
+ async pauseAt(ticks) {
57
+ await this._installIfNeeded();
58
58
  const timeMillis = parseTime(ticks);
59
- this._initScripts.push(await this._browserContext.addInitScript(progress, `globalThis.__pwClock.controller.log('pauseAt', ${Date.now()}, ${timeMillis})`));
60
- await progress.race(this._evaluateInFrames(`globalThis.__pwClock.controller.pauseAt(${timeMillis})`));
59
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('pauseAt', ${Date.now()}, ${timeMillis})`));
60
+ await this._evaluateInFrames(`globalThis.__pwClock.controller.pauseAt(${timeMillis})`);
61
61
  }
62
62
  resumeNoReply() {
63
63
  if (!this._initScripts.length)
64
64
  return;
65
65
  const doResume = async () => {
66
- this._initScripts.push(await this._browserContext.addInitScript(void 0, `globalThis.__pwClock.controller.log('resume', ${Date.now()})`));
66
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('resume', ${Date.now()})`));
67
67
  await this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`);
68
68
  };
69
69
  doResume().catch(() => {
70
70
  });
71
71
  }
72
72
  async resume(progress) {
73
- await this._installIfNeeded(progress);
74
- this._initScripts.push(await this._browserContext.addInitScript(progress, `globalThis.__pwClock.controller.log('resume', ${Date.now()})`));
75
- await progress.race(this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`));
73
+ await this._installIfNeeded();
74
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('resume', ${Date.now()})`));
75
+ await this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`);
76
76
  }
77
- async setFixedTime(progress, time) {
78
- await this._installIfNeeded(progress);
77
+ async setFixedTime(time) {
78
+ await this._installIfNeeded();
79
79
  const timeMillis = parseTime(time);
80
- this._initScripts.push(await this._browserContext.addInitScript(progress, `globalThis.__pwClock.controller.log('setFixedTime', ${Date.now()}, ${timeMillis})`));
81
- await progress.race(this._evaluateInFrames(`globalThis.__pwClock.controller.setFixedTime(${timeMillis})`));
80
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('setFixedTime', ${Date.now()}, ${timeMillis})`));
81
+ await this._evaluateInFrames(`globalThis.__pwClock.controller.setFixedTime(${timeMillis})`);
82
82
  }
83
- async setSystemTime(progress, time) {
84
- await this._installIfNeeded(progress);
83
+ async setSystemTime(time) {
84
+ await this._installIfNeeded();
85
85
  const timeMillis = parseTime(time);
86
- this._initScripts.push(await this._browserContext.addInitScript(progress, `globalThis.__pwClock.controller.log('setSystemTime', ${Date.now()}, ${timeMillis})`));
87
- await progress.race(this._evaluateInFrames(`globalThis.__pwClock.controller.setSystemTime(${timeMillis})`));
86
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('setSystemTime', ${Date.now()}, ${timeMillis})`));
87
+ await this._evaluateInFrames(`globalThis.__pwClock.controller.setSystemTime(${timeMillis})`);
88
88
  }
89
- async runFor(progress, ticks) {
90
- await this._installIfNeeded(progress);
89
+ async runFor(ticks) {
90
+ await this._installIfNeeded();
91
91
  const ticksMillis = parseTicks(ticks);
92
- this._initScripts.push(await this._browserContext.addInitScript(progress, `globalThis.__pwClock.controller.log('runFor', ${Date.now()}, ${ticksMillis})`));
93
- await progress.race(this._evaluateInFrames(`globalThis.__pwClock.controller.runFor(${ticksMillis})`));
92
+ this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('runFor', ${Date.now()}, ${ticksMillis})`));
93
+ await this._evaluateInFrames(`globalThis.__pwClock.controller.runFor(${ticksMillis})`);
94
94
  }
95
- async _installIfNeeded(progress) {
95
+ async _installIfNeeded() {
96
96
  if (this._initScripts.length)
97
97
  return;
98
98
  const script = `(() => {
99
99
  const module = {};
100
100
  ${rawClockSource.source}
101
101
  if (!globalThis.__pwClock)
102
- globalThis.__pwClock = (module.exports.inject())(globalThis);
102
+ globalThis.__pwClock = (module.exports.inject())(globalThis, ${JSON.stringify(this._browserContext._browser.options.name)});
103
103
  })();`;
104
- const initScript = await this._browserContext.addInitScript(progress, script);
105
- await progress.race(this._evaluateInFrames(script));
104
+ const initScript = await this._browserContext.addInitScript(script);
105
+ await this._evaluateInFrames(script);
106
106
  this._initScripts.push(initScript);
107
107
  }
108
108
  async _evaluateInFrames(script) {
109
- await Promise.all(this._browserContext.pages().map(async (page) => {
110
- await Promise.all(page.frames().map(async (frame) => {
111
- try {
112
- await frame.evaluateExpression("");
113
- } catch (e) {
114
- }
115
- }));
116
- }));
117
109
  await this._browserContext.safeNonStallingEvaluateInAllFrames(script, "main", { throwOnJSErrors: true });
118
110
  }
119
111
  }
@@ -90,7 +90,7 @@ class JavaScriptLanguageGenerator {
90
90
  case "fill":
91
91
  return `await ${subject}.${this._asLocator(action.selector)}.fill(${quote(action.text)});`;
92
92
  case "setInputFiles":
93
- return `await ${subject}.${this._asLocator(action.selector)}.setInputFiles(${formatObject(action.files.length === 1 ? action.files[0] : action.files)});`;
93
+ return `await ${subject}.${this._asLocator(action.selector)}.setInputFiles(${(0, import_utils.formatObject)(action.files.length === 1 ? action.files[0] : action.files)});`;
94
94
  case "press": {
95
95
  const modifiers = (0, import_language.toKeyboardModifiers)(action.modifiers);
96
96
  const shortcut = [...modifiers, action.key].join("+");
@@ -99,7 +99,7 @@ class JavaScriptLanguageGenerator {
99
99
  case "navigate":
100
100
  return `await ${subject}.goto(${quote(action.url)});`;
101
101
  case "select":
102
- return `await ${subject}.${this._asLocator(action.selector)}.selectOption(${formatObject(action.options.length === 1 ? action.options[0] : action.options)});`;
102
+ return `await ${subject}.${this._asLocator(action.selector)}.selectOption(${(0, import_utils.formatObject)(action.options.length === 1 ? action.options[0] : action.options)});`;
103
103
  case "assertText":
104
104
  return `${this._isTest ? "" : "// "}await expect(${subject}.${this._asLocator(action.selector)}).${action.substring ? "toContainText" : "toHaveText"}(${quote(action.text)});`;
105
105
  case "assertChecked":
@@ -151,7 +151,7 @@ ${useText ? "\ntest.use(" + useText + ");\n" : ""}
151
151
  const { ${options.browserName}${options.deviceName ? ", devices" : ""} } = require('playwright');
152
152
 
153
153
  (async () => {
154
- const browser = await ${options.browserName}.launch(${formatObjectOrVoid(options.launchOptions)});
154
+ const browser = await ${options.browserName}.launch(${(0, import_utils.formatObjectOrVoid)(options.launchOptions)});
155
155
  const context = await browser.newContext(${formatContextOptions(options.contextOptions, options.deviceName, false)});`);
156
156
  if (options.contextOptions.recordHar)
157
157
  formatter.add(` await context.routeFromHAR(${quote(options.contextOptions.recordHar.path)});`);
@@ -171,37 +171,14 @@ function formatOptions(value, hasArguments) {
171
171
  const keys = Object.keys(value).filter((key) => value[key] !== void 0);
172
172
  if (!keys.length)
173
173
  return "";
174
- return (hasArguments ? ", " : "") + formatObject(value);
175
- }
176
- function formatObject(value, indent = " ") {
177
- if (typeof value === "string")
178
- return quote(value);
179
- if (Array.isArray(value))
180
- return `[${value.map((o) => formatObject(o)).join(", ")}]`;
181
- if (typeof value === "object") {
182
- const keys = Object.keys(value).filter((key) => value[key] !== void 0).sort();
183
- if (!keys.length)
184
- return "{}";
185
- const tokens = [];
186
- for (const key of keys)
187
- tokens.push(`${key}: ${formatObject(value[key])}`);
188
- return `{
189
- ${indent}${tokens.join(`,
190
- ${indent}`)}
191
- }`;
192
- }
193
- return String(value);
194
- }
195
- function formatObjectOrVoid(value, indent = " ") {
196
- const result = formatObject(value, indent);
197
- return result === "{}" ? "" : result;
174
+ return (hasArguments ? ", " : "") + (0, import_utils.formatObject)(value);
198
175
  }
199
176
  function formatContextOptions(options, deviceName, isTest) {
200
177
  const device = deviceName && import_deviceDescriptors.deviceDescriptors[deviceName];
201
178
  options = { ...options, recordHar: void 0 };
202
179
  if (!device)
203
- return formatObjectOrVoid(options);
204
- let serializedObject = formatObjectOrVoid((0, import_language.sanitizeDeviceOptions)(device, options));
180
+ return (0, import_utils.formatObjectOrVoid)(options);
181
+ let serializedObject = (0, import_utils.formatObjectOrVoid)((0, import_language.sanitizeDeviceOptions)(device, options));
205
182
  if (!serializedObject)
206
183
  serializedObject = "{\n}";
207
184
  const lines = serializedObject.split("\n");
@@ -22,13 +22,14 @@ __export(console_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(console_exports);
24
24
  class ConsoleMessage {
25
- constructor(page, worker, type, text, args, location) {
25
+ constructor(page, worker, type, text, args, location, timestamp) {
26
26
  this._page = page;
27
27
  this._worker = worker;
28
28
  this._type = type;
29
29
  this._text = text;
30
30
  this._args = args;
31
31
  this._location = location || { url: "", lineNumber: 0, columnNumber: 0 };
32
+ this._timestamp = timestamp;
32
33
  }
33
34
  page() {
34
35
  return this._page;
@@ -50,6 +51,9 @@ class ConsoleMessage {
50
51
  location() {
51
52
  return this._location;
52
53
  }
54
+ timestamp() {
55
+ return this._timestamp;
56
+ }
53
57
  }
54
58
  // Annotate the CommonJS export names for ESM import in node:
55
59
  0 && (module.exports = {
@@ -70,10 +70,12 @@ class DebugController extends import_instrumentation.SdkObject {
70
70
  await progress.race(this._closeBrowsersWithoutPages());
71
71
  this._generateAutoExpect = !!params.generateAutoExpect;
72
72
  if (params.mode === "none") {
73
+ const promises = [];
73
74
  for (const recorder of await progress.race(this._allRecorders())) {
74
- recorder.hideHighlightedSelector();
75
- recorder.setMode("none");
75
+ promises.push(recorder.hideHighlightedSelector());
76
+ promises.push(recorder.setMode("none"));
76
77
  }
78
+ await Promise.all(promises);
77
79
  return;
78
80
  }
79
81
  if (!this._playwright.allBrowsers().length)
@@ -97,18 +99,22 @@ class DebugController extends import_instrumentation.SdkObject {
97
99
  if (params.selector)
98
100
  (0, import_locatorParser.unsafeLocatorOrSelectorAsSelector)(this._sdkLanguage, params.selector, "data-testid");
99
101
  const ariaTemplate = params.ariaTemplate ? (0, import_ariaSnapshot.parseAriaSnapshotUnsafe)(import_utilsBundle.yaml, params.ariaTemplate) : void 0;
102
+ const promises = [];
100
103
  for (const recorder of await progress.race(this._allRecorders())) {
101
104
  if (ariaTemplate)
102
- recorder.setHighlightedAriaTemplate(ariaTemplate);
105
+ promises.push(recorder.setHighlightedAriaTemplate(ariaTemplate));
103
106
  else if (params.selector)
104
- recorder.setHighlightedSelector(params.selector);
107
+ promises.push(recorder.setHighlightedSelector(params.selector));
105
108
  }
109
+ await Promise.all(promises);
106
110
  }
107
111
  async hideHighlight(progress) {
112
+ const promises = [];
108
113
  for (const recorder of await progress.race(this._allRecorders()))
109
- recorder.hideHighlightedSelector();
110
- await Promise.all(this._playwright.allPages().map((p) => p.hideHighlight().catch(() => {
114
+ promises.push(recorder.hideHighlightedSelector());
115
+ promises.push(...this._playwright.allPages().map((p) => p.hideHighlight().catch(() => {
111
116
  })));
117
+ await Promise.all(promises);
112
118
  }
113
119
  async resume(progress) {
114
120
  for (const recorder of await progress.race(this._allRecorders()))
@@ -21,22 +21,20 @@ __export(debugger_exports, {
21
21
  Debugger: () => Debugger
22
22
  });
23
23
  module.exports = __toCommonJS(debugger_exports);
24
- var import_events = require("events");
24
+ var import_instrumentation = require("./instrumentation");
25
25
  var import_utils = require("../utils");
26
26
  var import_browserContext = require("./browserContext");
27
27
  var import_protocolMetainfo = require("../utils/isomorphic/protocolMetainfo");
28
28
  const symbol = Symbol("Debugger");
29
- class Debugger extends import_events.EventEmitter {
29
+ class Debugger extends import_instrumentation.SdkObject {
30
30
  constructor(context) {
31
- super();
32
- this._pauseOnNextStatement = false;
33
- this._pausedCallsMetadata = /* @__PURE__ */ new Map();
31
+ super(context, "debugger");
32
+ this._pauseAt = {};
33
+ this._enabled = false;
34
+ this._pauseBeforeWaitingActions = false;
34
35
  this._muted = false;
35
36
  this._context = context;
36
37
  this._context[symbol] = this;
37
- this._enabled = (0, import_utils.debugMode)() === "inspector";
38
- if (this._enabled)
39
- this.pauseOnNextStatement();
40
38
  context.instrumentation.addListener(this, context);
41
39
  this._context.once(import_browserContext.BrowserContext.Events.Close, () => {
42
40
  this._context.instrumentation.removeListener(this);
@@ -51,67 +49,62 @@ class Debugger extends import_events.EventEmitter {
51
49
  this._muted = muted;
52
50
  }
53
51
  async onBeforeCall(sdkObject, metadata) {
54
- if (this._muted)
52
+ if (this._muted || metadata.internal)
55
53
  return;
56
- if (shouldPauseOnCall(sdkObject, metadata) || this._pauseOnNextStatement && shouldPauseBeforeStep(metadata))
57
- await this.pause(sdkObject, metadata);
54
+ const metainfo = (0, import_protocolMetainfo.getMetainfo)(metadata);
55
+ const pauseOnPauseCall = this._enabled && metadata.type === "BrowserContext" && metadata.method === "pause";
56
+ const pauseBeforeAction = !!this._pauseAt.next && !!metainfo?.pause && (this._pauseBeforeWaitingActions || !metainfo?.isAutoWaiting);
57
+ const pauseOnLocation = !!this._pauseAt.location && matchesLocation(metadata, this._pauseAt.location);
58
+ if (pauseOnPauseCall || pauseBeforeAction || pauseOnLocation)
59
+ await this._pause(sdkObject, metadata);
58
60
  }
59
61
  async onBeforeInputAction(sdkObject, metadata) {
60
- if (this._muted)
62
+ if (this._muted || metadata.internal)
61
63
  return;
62
- if (this._enabled && this._pauseOnNextStatement)
63
- await this.pause(sdkObject, metadata);
64
+ const metainfo = (0, import_protocolMetainfo.getMetainfo)(metadata);
65
+ const pauseBeforeInput = !!this._pauseAt.next && !!metainfo?.pause && !!metainfo?.isAutoWaiting && !this._pauseBeforeWaitingActions;
66
+ if (pauseBeforeInput)
67
+ await this._pause(sdkObject, metadata);
64
68
  }
65
- async pause(sdkObject, metadata) {
66
- if (this._muted)
69
+ async _pause(sdkObject, metadata) {
70
+ if (this._muted || metadata.internal)
67
71
  return;
68
- this._enabled = true;
72
+ if (this._pausedCall)
73
+ return;
74
+ this._pauseAt = {};
69
75
  metadata.pauseStartTime = (0, import_utils.monotonicTime)();
70
76
  const result = new Promise((resolve) => {
71
- this._pausedCallsMetadata.set(metadata, { resolve, sdkObject });
77
+ this._pausedCall = { metadata, sdkObject, resolve };
72
78
  });
73
79
  this.emit(Debugger.Events.PausedStateChanged);
74
80
  return result;
75
81
  }
76
- resume(step) {
77
- if (!this.isPaused())
82
+ resume() {
83
+ if (!this._pausedCall)
78
84
  return;
79
- this._pauseOnNextStatement = step;
80
- const endTime = (0, import_utils.monotonicTime)();
81
- for (const [metadata, { resolve }] of this._pausedCallsMetadata) {
82
- metadata.pauseEndTime = endTime;
83
- resolve();
84
- }
85
- this._pausedCallsMetadata.clear();
85
+ this._pausedCall.metadata.pauseEndTime = (0, import_utils.monotonicTime)();
86
+ this._pausedCall.resolve();
87
+ this._pausedCall = void 0;
86
88
  this.emit(Debugger.Events.PausedStateChanged);
87
89
  }
88
- pauseOnNextStatement() {
89
- this._pauseOnNextStatement = true;
90
+ setPauseBeforeWaitingActions() {
91
+ this._pauseBeforeWaitingActions = true;
92
+ }
93
+ setPauseAt(at = {}) {
94
+ this._enabled = true;
95
+ this._pauseAt = at;
90
96
  }
91
97
  isPaused(metadata) {
92
98
  if (metadata)
93
- return this._pausedCallsMetadata.has(metadata);
94
- return !!this._pausedCallsMetadata.size;
99
+ return this._pausedCall?.metadata === metadata;
100
+ return !!this._pausedCall;
95
101
  }
96
102
  pausedDetails() {
97
- const result = [];
98
- for (const [metadata, { sdkObject }] of this._pausedCallsMetadata)
99
- result.push({ metadata, sdkObject });
100
- return result;
103
+ return this._pausedCall;
101
104
  }
102
105
  }
103
- function shouldPauseOnCall(sdkObject, metadata) {
104
- if (sdkObject.attribution.playwright.options.isServer)
105
- return false;
106
- if (!sdkObject.attribution.browser?.options.headful && !(0, import_utils.isUnderTest)())
107
- return false;
108
- return metadata.method === "pause";
109
- }
110
- function shouldPauseBeforeStep(metadata) {
111
- if (metadata.internal)
112
- return false;
113
- const metainfo = import_protocolMetainfo.methodMetainfo.get(metadata.type + "." + metadata.method);
114
- return !!metainfo?.pausesBeforeAction;
106
+ function matchesLocation(metadata, location) {
107
+ return !!metadata.location?.file.includes(location.file) && (location.line === void 0 || metadata.location.line === location.line) && (location.column === void 0 || metadata.location.column === location.column);
115
108
  }
116
109
  // Annotate the CommonJS export names for ESM import in node:
117
110
  0 && (module.exports = {