patchright-core 1.58.2 → 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 (285) hide show
  1. package/ThirdPartyNotices.txt +126 -650
  2. package/browsers.json +16 -14
  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 +47 -411
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -3
  10. package/lib/client/browser.js +8 -0
  11. package/lib/client/browserContext.js +22 -61
  12. package/lib/client/browserType.js +19 -51
  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 -4
  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 -4
  25. package/lib/client/events.js +3 -3
  26. package/lib/client/fetch.js +0 -1
  27. package/lib/client/frame.js +10 -23
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -44
  31. package/lib/client/network.js +15 -16
  32. package/lib/client/page.js +41 -75
  33. package/lib/client/platform.js +0 -3
  34. package/lib/client/screencast.js +88 -0
  35. package/lib/client/selectors.js +3 -1
  36. package/lib/client/tracing.js +11 -5
  37. package/lib/client/video.js +13 -20
  38. package/lib/client/worker.js +6 -6
  39. package/lib/generated/bindingsControllerSource.js +1 -1
  40. package/lib/generated/clockSource.js +1 -1
  41. package/lib/generated/injectedScriptSource.js +1 -1
  42. package/lib/generated/pollingRecorderSource.js +1 -1
  43. package/lib/generated/storageScriptSource.js +1 -1
  44. package/lib/generated/utilityScriptSource.js +1 -1
  45. package/lib/mcpBundle.js +0 -6
  46. package/lib/mcpBundleImpl.js +91 -0
  47. package/lib/protocol/validator.js +224 -138
  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 +13 -8
  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/bidi/bidiBrowser.js +30 -8
  56. package/lib/server/bidi/bidiChromium.js +18 -5
  57. package/lib/server/bidi/bidiNetworkManager.js +39 -11
  58. package/lib/server/bidi/bidiPage.js +31 -15
  59. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  60. package/lib/server/browser.js +84 -21
  61. package/lib/server/browserContext.js +110 -58
  62. package/lib/server/browserType.js +14 -12
  63. package/lib/server/chromium/chromium.js +15 -12
  64. package/lib/server/chromium/chromiumSwitches.js +14 -2
  65. package/lib/server/chromium/crBrowser.js +20 -17
  66. package/lib/server/chromium/crCoverage.js +1 -13
  67. package/lib/server/chromium/crDevTools.js +1 -0
  68. package/lib/server/chromium/crNetworkManager.js +12 -267
  69. package/lib/server/chromium/crPage.js +67 -199
  70. package/lib/server/chromium/crServiceWorker.js +7 -14
  71. package/lib/server/clock.js +33 -41
  72. package/lib/server/console.js +5 -1
  73. package/lib/server/debugController.js +12 -6
  74. package/lib/server/debugger.js +40 -47
  75. package/lib/server/deviceDescriptorsSource.json +137 -137
  76. package/lib/server/dispatchers/browserContextDispatcher.js +29 -30
  77. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  78. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  79. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  80. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  81. package/lib/server/dispatchers/dispatcher.js +1 -1
  82. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  83. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  84. package/lib/server/dispatchers/frameDispatcher.js +6 -6
  85. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  86. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  87. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  88. package/lib/server/dispatchers/pageDispatcher.js +101 -38
  89. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  90. package/lib/server/disposable.js +41 -0
  91. package/lib/server/dom.js +44 -26
  92. package/lib/server/download.js +3 -2
  93. package/lib/server/electron/electron.js +12 -7
  94. package/lib/server/firefox/ffBrowser.js +9 -19
  95. package/lib/server/firefox/ffInput.js +21 -5
  96. package/lib/server/firefox/ffNetworkManager.js +2 -2
  97. package/lib/server/firefox/ffPage.js +24 -27
  98. package/lib/server/frameSelectors.js +5 -172
  99. package/lib/server/frames.js +234 -687
  100. package/lib/server/har/harRecorder.js +2 -2
  101. package/lib/server/har/harTracer.js +5 -4
  102. package/lib/server/input.js +49 -4
  103. package/lib/server/instrumentation.js +5 -0
  104. package/lib/server/javascript.js +6 -26
  105. package/lib/server/launchApp.js +1 -3
  106. package/lib/server/localUtils.js +6 -6
  107. package/lib/server/network.js +9 -8
  108. package/lib/server/overlay.js +138 -0
  109. package/lib/server/page.js +157 -105
  110. package/lib/server/progress.js +6 -0
  111. package/lib/server/recorder/recorderApp.js +9 -8
  112. package/lib/server/recorder.js +76 -40
  113. package/lib/server/registry/index.js +55 -82
  114. package/lib/server/registry/nativeDeps.js +1 -0
  115. package/lib/server/screencast.js +90 -143
  116. package/lib/server/screenshotter.js +0 -6
  117. package/lib/server/trace/recorder/snapshotter.js +8 -17
  118. package/lib/server/trace/recorder/snapshotterInjected.js +82 -20
  119. package/lib/server/trace/recorder/tracing.js +87 -44
  120. package/lib/server/trace/viewer/traceViewer.js +3 -4
  121. package/lib/server/usKeyboardLayout.js +7 -0
  122. package/lib/server/utils/comparators.js +1 -1
  123. package/lib/server/utils/disposable.js +32 -0
  124. package/lib/server/utils/eventsHelper.js +3 -1
  125. package/lib/server/utils/fileUtils.js +16 -2
  126. package/lib/server/utils/happyEyeballs.js +15 -12
  127. package/lib/server/utils/hostPlatform.js +0 -15
  128. package/lib/server/utils/httpServer.js +5 -3
  129. package/lib/server/utils/network.js +2 -1
  130. package/lib/server/utils/nodePlatform.js +0 -6
  131. package/lib/server/utils/processLauncher.js +8 -6
  132. package/lib/server/utils/zipFile.js +2 -2
  133. package/lib/server/videoRecorder.js +82 -12
  134. package/lib/server/webkit/wkBrowser.js +1 -6
  135. package/lib/server/webkit/wkPage.js +27 -25
  136. package/lib/server/webkit/wkWorkers.js +2 -1
  137. package/lib/serverRegistry.js +156 -0
  138. package/lib/tools/backend/browserBackend.js +79 -0
  139. package/lib/tools/backend/common.js +63 -0
  140. package/lib/tools/backend/config.js +41 -0
  141. package/lib/tools/backend/console.js +66 -0
  142. package/lib/tools/backend/context.js +296 -0
  143. package/lib/tools/backend/cookies.js +152 -0
  144. package/lib/tools/backend/devtools.js +69 -0
  145. package/lib/tools/backend/dialogs.js +59 -0
  146. package/lib/tools/backend/evaluate.js +64 -0
  147. package/lib/tools/backend/files.js +60 -0
  148. package/lib/tools/backend/form.js +64 -0
  149. package/lib/tools/backend/keyboard.js +155 -0
  150. package/lib/tools/backend/logFile.js +95 -0
  151. package/lib/tools/backend/mouse.js +168 -0
  152. package/lib/tools/backend/navigate.js +106 -0
  153. package/lib/tools/backend/network.js +135 -0
  154. package/lib/tools/backend/pdf.js +48 -0
  155. package/lib/tools/backend/response.js +305 -0
  156. package/lib/tools/backend/route.js +140 -0
  157. package/lib/tools/backend/runCode.js +77 -0
  158. package/lib/tools/backend/screenshot.js +88 -0
  159. package/lib/tools/backend/sessionLog.js +74 -0
  160. package/lib/tools/backend/snapshot.js +208 -0
  161. package/lib/tools/backend/storage.js +68 -0
  162. package/lib/tools/backend/tab.js +445 -0
  163. package/lib/tools/backend/tabs.js +67 -0
  164. package/lib/tools/backend/tool.js +47 -0
  165. package/lib/tools/backend/tools.js +102 -0
  166. package/lib/tools/backend/tracing.js +78 -0
  167. package/lib/tools/backend/utils.js +83 -0
  168. package/lib/tools/backend/verify.js +151 -0
  169. package/lib/tools/backend/video.js +98 -0
  170. package/lib/tools/backend/wait.js +63 -0
  171. package/lib/tools/backend/webstorage.js +223 -0
  172. package/lib/tools/cli-client/cli.js +6 -0
  173. package/lib/tools/cli-client/help.json +399 -0
  174. package/lib/tools/cli-client/minimist.js +128 -0
  175. package/lib/tools/cli-client/program.js +350 -0
  176. package/lib/tools/cli-client/registry.js +176 -0
  177. package/lib/tools/cli-client/session.js +289 -0
  178. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  179. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  180. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  181. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  182. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  183. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  184. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  185. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  186. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  187. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  188. package/lib/tools/cli-daemon/command.js +73 -0
  189. package/lib/tools/cli-daemon/commands.js +956 -0
  190. package/lib/tools/cli-daemon/daemon.js +157 -0
  191. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  192. package/lib/tools/cli-daemon/program.js +129 -0
  193. package/lib/tools/dashboard/appIcon.png +0 -0
  194. package/lib/tools/dashboard/dashboardApp.js +284 -0
  195. package/lib/tools/dashboard/dashboardController.js +296 -0
  196. package/lib/tools/exports.js +60 -0
  197. package/lib/tools/mcp/browserFactory.js +233 -0
  198. package/lib/tools/mcp/cdpRelay.js +352 -0
  199. package/lib/tools/mcp/cli-stub.js +7 -0
  200. package/lib/tools/mcp/config.d.js +16 -0
  201. package/lib/tools/mcp/config.js +446 -0
  202. package/lib/tools/mcp/configIni.js +189 -0
  203. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  204. package/lib/tools/mcp/index.js +62 -0
  205. package/lib/tools/mcp/log.js +35 -0
  206. package/lib/tools/mcp/program.js +107 -0
  207. package/lib/tools/mcp/protocol.js +28 -0
  208. package/lib/tools/mcp/watchdog.js +44 -0
  209. package/lib/tools/trace/SKILL.md +171 -0
  210. package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
  211. package/lib/tools/trace/traceActions.js +142 -0
  212. package/lib/tools/trace/traceAttachments.js +69 -0
  213. package/lib/tools/trace/traceCli.js +87 -0
  214. package/lib/tools/trace/traceConsole.js +97 -0
  215. package/lib/tools/trace/traceErrors.js +55 -0
  216. package/lib/tools/trace/traceOpen.js +69 -0
  217. package/lib/tools/trace/traceParser.js +96 -0
  218. package/lib/tools/trace/traceRequests.js +182 -0
  219. package/lib/tools/trace/traceScreenshot.js +68 -0
  220. package/lib/tools/trace/traceSnapshot.js +149 -0
  221. package/lib/tools/trace/traceUtils.js +153 -0
  222. package/lib/tools/utils/connect.js +32 -0
  223. package/lib/tools/utils/mcp/http.js +152 -0
  224. package/lib/tools/utils/mcp/server.js +230 -0
  225. package/lib/tools/utils/mcp/tool.js +47 -0
  226. package/lib/tools/utils/socketConnection.js +108 -0
  227. package/lib/utils/isomorphic/formatUtils.js +64 -0
  228. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  229. package/lib/utils/isomorphic/mimeType.js +7 -2
  230. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  231. package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
  232. package/lib/utils/isomorphic/stringUtils.js +3 -3
  233. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  234. package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
  235. package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
  236. package/lib/utils/isomorphic/trace/traceModel.js +3 -2
  237. package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
  238. package/lib/utils/isomorphic/urlMatch.js +54 -1
  239. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  240. package/lib/utils.js +6 -2
  241. package/lib/utilsBundle.js +3 -21
  242. package/lib/utilsBundleImpl/index.js +132 -133
  243. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  244. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  245. package/lib/vite/dashboard/index.html +28 -0
  246. package/lib/vite/htmlReport/index.html +2 -70
  247. package/lib/vite/htmlReport/report.css +1 -0
  248. package/lib/vite/htmlReport/report.js +72 -0
  249. package/lib/vite/recorder/assets/{codeMirrorModule-CFUTFUO7.js → codeMirrorModule-C8KMvO9L.js} +20 -20
  250. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  251. package/lib/vite/recorder/index.html +1 -1
  252. package/lib/vite/traceViewer/assets/{codeMirrorModule-BVA4h_ZY.js → codeMirrorModule-DS0FLvoc.js} +20 -20
  253. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  254. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  255. package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
  256. package/lib/vite/traceViewer/{index.BtyWtaE-.js → index.Dtstcb7U.js} +1 -1
  257. package/lib/vite/traceViewer/index.html +4 -4
  258. package/lib/vite/traceViewer/sw.bundle.js +4 -4
  259. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  260. package/lib/vite/traceViewer/uiMode.html +3 -3
  261. package/lib/zipBundleImpl.js +2 -2
  262. package/lib/zodBundle.js +39 -0
  263. package/lib/zodBundleImpl.js +40 -0
  264. package/package.json +6 -1
  265. package/types/protocol.d.ts +947 -51
  266. package/types/types.d.ts +854 -74
  267. package/lib/client/pageAgent.js +0 -64
  268. package/lib/mcpBundleImpl/index.js +0 -147
  269. package/lib/server/agent/actionRunner.js +0 -335
  270. package/lib/server/agent/actions.js +0 -128
  271. package/lib/server/agent/codegen.js +0 -111
  272. package/lib/server/agent/context.js +0 -150
  273. package/lib/server/agent/expectTools.js +0 -156
  274. package/lib/server/agent/pageAgent.js +0 -204
  275. package/lib/server/agent/performTools.js +0 -262
  276. package/lib/server/agent/tool.js +0 -109
  277. package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
  278. package/lib/server/pageBinding.js +0 -87
  279. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  280. package/lib/vite/recorder/assets/index-CVkBxsGf.js +0 -193
  281. package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +0 -266
  282. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
  283. package/lib/vite/traceViewer/uiMode.fyrXARf2.js +0 -5
  284. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  285. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -38,6 +38,7 @@ var import_snapshotter = require("./snapshotter");
38
38
  var import_protocolMetainfo = require("../../../utils/isomorphic/protocolMetainfo");
39
39
  var import_assert = require("../../../utils/isomorphic/assert");
40
40
  var import_time = require("../../../utils/isomorphic/time");
41
+ var import_manualPromise = require("../../../utils/isomorphic/manualPromise");
41
42
  var import_eventsHelper = require("../../utils/eventsHelper");
42
43
  var import_crypto = require("../../utils/crypto");
43
44
  var import_userAgent = require("../../utils/userAgent");
@@ -48,15 +49,14 @@ var import_errors = require("../../errors");
48
49
  var import_fileUtils = require("../../utils/fileUtils");
49
50
  var import_harTracer = require("../../har/harTracer");
50
51
  var import_instrumentation = require("../../instrumentation");
51
- var import_page = require("../../page");
52
52
  var import_progress = require("../../progress");
53
53
  const version = 8;
54
- const kScreencastOptions = { width: 800, height: 600, quality: 90 };
55
54
  class Tracing extends import_instrumentation.SdkObject {
56
55
  constructor(context, tracesDir) {
57
56
  super(context, "tracing");
58
57
  this._fs = new import_fileUtils.SerializedFS();
59
58
  this._screencastListeners = [];
59
+ this._pageTracingRecorders = /* @__PURE__ */ new Map();
60
60
  this._eventListeners = [];
61
61
  this._isStopping = false;
62
62
  this._allResources = /* @__PURE__ */ new Set();
@@ -219,10 +219,9 @@ class Tracing extends import_instrumentation.SdkObject {
219
219
  }
220
220
  _stopScreencast() {
221
221
  import_eventsHelper.eventsHelper.removeEventListeners(this._screencastListeners);
222
- if (!(this._context instanceof import_browserContext.BrowserContext))
223
- return;
224
- for (const page of this._context.pages())
225
- page.screencast.setOptions(null);
222
+ for (const recorder of this._pageTracingRecorders.values())
223
+ recorder.dispose();
224
+ this._pageTracingRecorders.clear();
226
225
  }
227
226
  _allocateNewTraceFile(state) {
228
227
  const suffix = state.chunkOrdinal ? `-chunk${state.chunkOrdinal}` : ``;
@@ -331,15 +330,27 @@ class Tracing extends import_instrumentation.SdkObject {
331
330
  await this._snapshotter?.captureSnapshot(sdkObject.attribution.page, metadata.id, snapshotName).catch(() => {
332
331
  });
333
332
  }
334
- _shouldCaptureSnapshot(sdkObject, metadata) {
335
- return !!this._snapshotter?.started() && shouldCaptureSnapshot(metadata) && !!sdkObject.attribution.page;
333
+ _shouldCaptureSnapshot(sdkObject, metadata, phase) {
334
+ if (!sdkObject.attribution.page || !this._snapshotter?.started())
335
+ return;
336
+ const metainfo = (0, import_protocolMetainfo.getMetainfo)(metadata);
337
+ if (!metainfo?.snapshot)
338
+ return false;
339
+ switch (phase) {
340
+ case "before":
341
+ return !metainfo.input || !!metainfo.isAutoWaiting;
342
+ case "input":
343
+ return !!metainfo.input;
344
+ case "after":
345
+ return true;
346
+ }
336
347
  }
337
348
  onBeforeCall(sdkObject, metadata, parentId) {
338
349
  const event = createBeforeActionTraceEvent(metadata, parentId ?? this._currentGroupId());
339
350
  if (!event)
340
351
  return Promise.resolve();
341
- sdkObject.attribution.page?.screencast.temporarilyDisableThrottling();
342
- if (this._shouldCaptureSnapshot(sdkObject, metadata))
352
+ this._temporarilyDisableThrottling(sdkObject.attribution.page);
353
+ if (this._shouldCaptureSnapshot(sdkObject, metadata, "before"))
343
354
  event.beforeSnapshot = `before@${metadata.id}`;
344
355
  this._state?.callIds.add(metadata.id);
345
356
  this._appendTraceEvent(event);
@@ -351,8 +362,8 @@ class Tracing extends import_instrumentation.SdkObject {
351
362
  const event = createInputActionTraceEvent(metadata);
352
363
  if (!event)
353
364
  return Promise.resolve();
354
- sdkObject.attribution.page?.screencast.temporarilyDisableThrottling();
355
- if (this._shouldCaptureSnapshot(sdkObject, metadata))
365
+ this._temporarilyDisableThrottling(sdkObject.attribution.page);
366
+ if (this._shouldCaptureSnapshot(sdkObject, metadata, "input"))
356
367
  event.inputSnapshot = `input@${metadata.id}`;
357
368
  this._appendTraceEvent(event);
358
369
  return this._captureSnapshot(event.inputSnapshot, sdkObject, metadata);
@@ -375,8 +386,8 @@ class Tracing extends import_instrumentation.SdkObject {
375
386
  const event = createAfterActionTraceEvent(metadata);
376
387
  if (!event)
377
388
  return Promise.resolve();
378
- sdkObject.attribution.page?.screencast.temporarilyDisableThrottling();
379
- if (this._shouldCaptureSnapshot(sdkObject, metadata))
389
+ this._temporarilyDisableThrottling(sdkObject.attribution.page);
390
+ if (this._shouldCaptureSnapshot(sdkObject, metadata, "after"))
380
391
  event.afterSnapshot = `after@${metadata.id}`;
381
392
  this._appendTraceEvent(event);
382
393
  return this._captureSnapshot(event.afterSnapshot, sdkObject, metadata);
@@ -483,26 +494,28 @@ class Tracing extends import_instrumentation.SdkObject {
483
494
  };
484
495
  this._appendTraceEvent(event);
485
496
  }
497
+ _temporarilyDisableThrottling(page) {
498
+ if (page)
499
+ this._pageTracingRecorders.get(page)?.temporarilyDisableThrottling();
500
+ }
486
501
  _startScreencastInPage(page) {
487
- page.screencast.setOptions(kScreencastOptions);
488
502
  const prefix = page.guid;
489
- this._screencastListeners.push(
490
- import_eventsHelper.eventsHelper.addEventListener(page, import_page.Page.Events.ScreencastFrame, (params) => {
491
- const suffix = params.timestamp || Date.now();
492
- const sha1 = `${prefix}-${suffix}.jpeg`;
493
- const event = {
494
- type: "screencast-frame",
495
- pageId: page.guid,
496
- sha1,
497
- width: params.width,
498
- height: params.height,
499
- timestamp: (0, import_time.monotonicTime)(),
500
- frameSwapWallTime: params.frameSwapWallTime
501
- };
502
- this._appendResource(sha1, params.buffer);
503
- this._appendTraceEvent(event);
504
- })
505
- );
503
+ const onFrame = (params) => {
504
+ const suffix = Date.now();
505
+ const sha1 = `${prefix}-${suffix}.jpeg`;
506
+ const event = {
507
+ type: "screencast-frame",
508
+ pageId: page.guid,
509
+ sha1,
510
+ width: params.viewportWidth,
511
+ height: params.viewportHeight,
512
+ timestamp: (0, import_time.monotonicTime)(),
513
+ frameSwapWallTime: params.frameSwapWallTime
514
+ };
515
+ this._appendResource(sha1, params.buffer);
516
+ this._appendTraceEvent(event);
517
+ };
518
+ this._pageTracingRecorders.set(page, new ScreencastTracingRecorder(page.screencast, onFrame));
506
519
  }
507
520
  _appendTraceEvent(event) {
508
521
  const visited = visitTraceEvent(event, this._state.traceSha1s);
@@ -545,13 +558,7 @@ function visitTraceEvent(object, sha1s) {
545
558
  }
546
559
  return object;
547
560
  }
548
- function shouldCaptureSnapshot(metadata) {
549
- const metainfo = import_protocolMetainfo.methodMetainfo.get(metadata.type + "." + metadata.method);
550
- return !!metainfo?.snapshot;
551
- }
552
561
  function createBeforeActionTraceEvent(metadata, parentId) {
553
- if (metadata.type === "Route" && metadata.method === "continue" && metadata.params?.isFallback)
554
- return null;
555
562
  if (metadata.internal || metadata.method.startsWith("tracing"))
556
563
  return null;
557
564
  const event = {
@@ -570,8 +577,6 @@ function createBeforeActionTraceEvent(metadata, parentId) {
570
577
  return event;
571
578
  }
572
579
  function createInputActionTraceEvent(metadata) {
573
- if (metadata.type === "Route" && metadata.method === "continue" && metadata.params?.isFallback)
574
- return null;
575
580
  if (metadata.internal || metadata.method.startsWith("tracing"))
576
581
  return null;
577
582
  return {
@@ -581,8 +586,6 @@ function createInputActionTraceEvent(metadata) {
581
586
  };
582
587
  }
583
588
  function createActionLogTraceEvent(metadata, message) {
584
- if (metadata.type === "Route" && metadata.method === "continue" && metadata.params?.isFallback)
585
- return null;
586
589
  if (metadata.internal || metadata.method.startsWith("tracing"))
587
590
  return null;
588
591
  return {
@@ -593,8 +596,6 @@ function createActionLogTraceEvent(metadata, message) {
593
596
  };
594
597
  }
595
598
  function createAfterActionTraceEvent(metadata) {
596
- if (metadata.type === "Route" && metadata.method === "continue" && metadata.params?.isFallback)
597
- return null;
598
599
  if (metadata.internal || metadata.method.startsWith("tracing"))
599
600
  return null;
600
601
  return {
@@ -606,6 +607,48 @@ function createAfterActionTraceEvent(metadata) {
606
607
  point: metadata.point
607
608
  };
608
609
  }
610
+ const throttledRate = 200;
611
+ const unthrottleDuration = 500;
612
+ class ScreencastTracingRecorder {
613
+ constructor(screencast, onFrame) {
614
+ this._unthrottledUntil = 0;
615
+ this._screencast = screencast;
616
+ this._client = {
617
+ onFrame: (frame) => {
618
+ const time = (0, import_time.monotonicTime)();
619
+ if (time < this._unthrottledUntil) {
620
+ onFrame(frame);
621
+ return;
622
+ }
623
+ if (this._pendingAck)
624
+ return;
625
+ onFrame(frame);
626
+ this._pendingAck = new import_manualPromise.ManualPromise();
627
+ this._timer = setTimeout(() => this._clearPendingAck(), throttledRate);
628
+ return this._pendingAck;
629
+ },
630
+ gracefulClose: () => this.dispose(),
631
+ dispose: () => this.dispose()
632
+ };
633
+ this._screencast.addClient(this._client);
634
+ }
635
+ dispose() {
636
+ this._screencast.removeClient(this._client);
637
+ this._clearPendingAck();
638
+ }
639
+ temporarilyDisableThrottling() {
640
+ this._unthrottledUntil = (0, import_time.monotonicTime)() + unthrottleDuration;
641
+ this._clearPendingAck();
642
+ }
643
+ _clearPendingAck() {
644
+ this._pendingAck?.resolve();
645
+ this._pendingAck = void 0;
646
+ if (this._timer) {
647
+ clearTimeout(this._timer);
648
+ this._timer = void 0;
649
+ }
650
+ }
651
+ }
609
652
  // Annotate the CommonJS export names for ESM import in node:
610
653
  0 && (module.exports = {
611
654
  Tracing
@@ -91,7 +91,7 @@ async function startTraceViewerServer(options) {
91
91
  });
92
92
  const transport = options?.transport || (options?.isServer ? new StdinServer() : void 0);
93
93
  if (transport)
94
- server.createWebSocket(transport);
94
+ server.createWebSocket(() => transport);
95
95
  const { host, port } = options || {};
96
96
  await server.start({ preferredPort: port, host });
97
97
  return server;
@@ -126,13 +126,12 @@ async function installRootRedirect(server, traceUrl, options) {
126
126
  return true;
127
127
  });
128
128
  }
129
- async function runTraceViewerApp(traceUrl, browserName, options, exitOnClose) {
129
+ async function runTraceViewerApp(traceUrl, browserName, options) {
130
130
  traceUrl = validateTraceUrlOrPath(traceUrl);
131
131
  const server = await startTraceViewerServer(options);
132
132
  await installRootRedirect(server, traceUrl, options);
133
133
  const page = await openTraceViewerApp(server.urlPrefix("precise"), browserName, options);
134
- if (exitOnClose)
135
- page.on("close", () => (0, import_utils.gracefullyProcessExitDoNotHang)(0));
134
+ page.on("close", () => (0, import_utils.gracefullyProcessExitDoNotHang)(0));
136
135
  return page;
137
136
  }
138
137
  async function runTraceInBrowser(traceUrl, options) {
@@ -119,6 +119,13 @@ const USKeyboardLayout = {
119
119
  "ArrowUp": { "keyCode": 38, "key": "ArrowUp" },
120
120
  "ArrowRight": { "keyCode": 39, "key": "ArrowRight" },
121
121
  "ArrowDown": { "keyCode": 40, "key": "ArrowDown" },
122
+ // Media keys
123
+ "AudioVolumeMute": { "keyCode": 173, "key": "AudioVolumeMute" },
124
+ "AudioVolumeDown": { "keyCode": 174, "key": "AudioVolumeDown" },
125
+ "AudioVolumeUp": { "keyCode": 175, "key": "AudioVolumeUp" },
126
+ "MediaTrackNext": { "keyCode": 176, "key": "MediaTrackNext" },
127
+ "MediaTrackPrevious": { "keyCode": 177, "key": "MediaTrackPrevious" },
128
+ "MediaPlayPause": { "keyCode": 179, "key": "MediaPlayPause" },
122
129
  // Numpad
123
130
  "NumLock": { "keyCode": 144, "key": "NumLock" },
124
131
  "NumpadDivide": { "keyCode": 111, "key": "/", "location": 3 },
@@ -37,7 +37,7 @@ var import_pixelmatch = __toESM(require("../../third_party/pixelmatch"));
37
37
  var import_utilsBundle = require("../../utilsBundle");
38
38
  var import_utilsBundle2 = require("../../utilsBundle");
39
39
  var import_utilsBundle3 = require("../../utilsBundle");
40
- var import_imageUtils = require("./imageUtils");
40
+ var import_imageUtils = require("../../utils/isomorphic/imageUtils");
41
41
  function getComparator(mimeType) {
42
42
  if (mimeType === "image/png")
43
43
  return compareImages.bind(null, "image/png");
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var disposable_exports = {};
20
+ __export(disposable_exports, {
21
+ disposeAll: () => disposeAll
22
+ });
23
+ module.exports = __toCommonJS(disposable_exports);
24
+ async function disposeAll(disposables) {
25
+ const copy = [...disposables];
26
+ disposables.length = 0;
27
+ await Promise.all(copy.map((d) => d.dispose()));
28
+ }
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ disposeAll
32
+ });
@@ -24,7 +24,9 @@ module.exports = __toCommonJS(eventsHelper_exports);
24
24
  class EventsHelper {
25
25
  static addEventListener(emitter, eventName, handler) {
26
26
  emitter.on(eventName, handler);
27
- return { emitter, eventName, handler };
27
+ return { emitter, eventName, handler, dispose: async () => {
28
+ emitter.removeListener(eventName, handler);
29
+ } };
28
30
  }
29
31
  static removeEventListeners(listeners) {
30
32
  for (const listener of listeners)
@@ -32,6 +32,7 @@ __export(fileUtils_exports, {
32
32
  canAccessFile: () => canAccessFile,
33
33
  copyFileAndMakeWritable: () => copyFileAndMakeWritable,
34
34
  existsAsync: () => existsAsync,
35
+ makeSocketPath: () => makeSocketPath,
35
36
  mkdirIfNeeded: () => mkdirIfNeeded,
36
37
  removeFolders: () => removeFolders,
37
38
  sanitizeForFilePath: () => sanitizeForFilePath,
@@ -39,9 +40,10 @@ __export(fileUtils_exports, {
39
40
  });
40
41
  module.exports = __toCommonJS(fileUtils_exports);
41
42
  var import_fs = __toESM(require("fs"));
43
+ var import_os = __toESM(require("os"));
42
44
  var import_path = __toESM(require("path"));
45
+ var import_crypto = require("./crypto");
43
46
  var import_manualPromise = require("../../utils/isomorphic/manualPromise");
44
- var import_zipBundle = require("../../zipBundle");
45
47
  const existsAsync = (path2) => new Promise((resolve) => import_fs.default.stat(path2, (err) => resolve(!err)));
46
48
  async function mkdirIfNeeded(filePath) {
47
49
  await import_fs.default.promises.mkdir(import_path.default.dirname(filePath), { recursive: true }).catch(() => {
@@ -72,6 +74,16 @@ function sanitizeForFilePath(s) {
72
74
  function toPosixPath(aPath) {
73
75
  return aPath.split(import_path.default.sep).join(import_path.default.posix.sep);
74
76
  }
77
+ function makeSocketPath(domain, name) {
78
+ const userNameHash = (0, import_crypto.calculateSha1)(process.env.USERNAME || process.env.USER || "default").slice(0, 8);
79
+ if (process.platform === "win32")
80
+ return `\\\\.\\pipe\\pw-${userNameHash}-${domain}-${name}`;
81
+ const baseDir = process.env.PLAYWRIGHT_SOCKETS_DIR || import_path.default.join(import_os.default.tmpdir(), `pw-${userNameHash}`);
82
+ const dir = import_path.default.join(baseDir, domain);
83
+ const result = import_path.default.join(dir, `${name}.sock`);
84
+ import_fs.default.mkdirSync(dir, { recursive: true });
85
+ return result;
86
+ }
75
87
  class SerializedFS {
76
88
  constructor() {
77
89
  this._buffers = /* @__PURE__ */ new Map();
@@ -165,7 +177,8 @@ class SerializedFS {
165
177
  return;
166
178
  }
167
179
  case "zip": {
168
- const zipFile = new import_zipBundle.yazl.ZipFile();
180
+ const { yazl } = await import("playwright-core/lib/zipBundle");
181
+ const zipFile = new yazl.ZipFile();
169
182
  const result = new import_manualPromise.ManualPromise();
170
183
  zipFile.on("error", (error) => result.reject(error));
171
184
  for (const entry of op.entries)
@@ -184,6 +197,7 @@ class SerializedFS {
184
197
  canAccessFile,
185
198
  copyFileAndMakeWritable,
186
199
  existsAsync,
200
+ makeSocketPath,
187
201
  mkdirIfNeeded,
188
202
  removeFolders,
189
203
  sanitizeForFilePath,
@@ -166,20 +166,23 @@ async function createConnectionAsync(options, oncreate, useTLS) {
166
166
  }
167
167
  }
168
168
  async function lookupAddresses(hostname) {
169
- const addresses = await import_dns.default.promises.lookup(hostname, { all: true, family: 0, verbatim: true });
170
- let firstFamily = addresses.filter(({ family }) => family === 6);
171
- let secondFamily = addresses.filter(({ family }) => family === 4);
172
- if (firstFamily.length && firstFamily[0] !== addresses[0]) {
173
- const tmp = firstFamily;
174
- firstFamily = secondFamily;
175
- secondFamily = tmp;
169
+ const [v4Result, v6Result] = await Promise.allSettled([
170
+ import_dns.default.promises.lookup(hostname, { all: true, family: 4 }),
171
+ import_dns.default.promises.lookup(hostname, { all: true, family: 6 })
172
+ ]);
173
+ const v4Addresses = v4Result.status === "fulfilled" ? v4Result.value : [];
174
+ const v6Addresses = v6Result.status === "fulfilled" ? v6Result.value : [];
175
+ if (!v4Addresses.length && !v6Addresses.length) {
176
+ if (v4Result.status === "rejected")
177
+ throw v4Result.reason;
178
+ throw v6Result.reason;
176
179
  }
177
180
  const result = [];
178
- for (let i = 0; i < Math.max(firstFamily.length, secondFamily.length); i++) {
179
- if (firstFamily[i])
180
- result.push(firstFamily[i]);
181
- if (secondFamily[i])
182
- result.push(secondFamily[i]);
181
+ for (let i = 0; i < Math.max(v4Addresses.length, v6Addresses.length); i++) {
182
+ if (v6Addresses[i])
183
+ result.push(v6Addresses[i]);
184
+ if (v4Addresses[i])
185
+ result.push(v4Addresses[i]);
183
186
  }
184
187
  return result;
185
188
  }
@@ -28,13 +28,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var hostPlatform_exports = {};
30
30
  __export(hostPlatform_exports, {
31
- hasGpuMac: () => hasGpuMac,
32
31
  hostPlatform: () => hostPlatform,
33
32
  isOfficiallySupportedPlatform: () => isOfficiallySupportedPlatform,
34
33
  shortPlatform: () => shortPlatform
35
34
  });
36
35
  module.exports = __toCommonJS(hostPlatform_exports);
37
- var import_child_process = require("child_process");
38
36
  var import_os = __toESM(require("os"));
39
37
  var import_linuxUtils = require("./linuxUtils");
40
38
  function calculatePlatform() {
@@ -117,21 +115,8 @@ function toShortPlatform(hostPlatform2) {
117
115
  return hostPlatform2.endsWith("arm64") ? "linux-arm64" : "linux-x64";
118
116
  }
119
117
  const shortPlatform = toShortPlatform(hostPlatform);
120
- let hasGpuMacValue;
121
- function hasGpuMac() {
122
- try {
123
- if (hasGpuMacValue === void 0) {
124
- const output = (0, import_child_process.execSync)("system_profiler SPDisplaysDataType", { stdio: ["ignore", "pipe", "ignore"] }).toString();
125
- hasGpuMacValue = output.includes("Metal: Supported") || output.includes("Metal Support: Metal");
126
- }
127
- return hasGpuMacValue;
128
- } catch (e) {
129
- return false;
130
- }
131
- }
132
118
  // Annotate the CommonJS export names for ESM import in node:
133
119
  0 && (module.exports = {
134
- hasGpuMac,
135
120
  hostPlatform,
136
121
  isOfficiallySupportedPlatform,
137
122
  shortPlatform
@@ -58,14 +58,16 @@ class HttpServer {
58
58
  port() {
59
59
  return this._port;
60
60
  }
61
- createWebSocket(transport, guid) {
61
+ createWebSocket(transportFactory, guid) {
62
62
  (0, import_assert.assert)(!this._wsGuid, "can only create one main websocket transport per server");
63
63
  this._wsGuid = guid || (0, import_crypto.createGuid)();
64
64
  const wss = new import_utilsBundle.wsServer({ server: this._server, path: "/" + this._wsGuid });
65
- wss.on("connection", (ws) => {
66
- transport.onconnect();
65
+ wss.on("connection", (ws, request) => {
66
+ const url = new URL(request.url ?? "/", "http://localhost");
67
+ const transport = transportFactory(url);
67
68
  transport.sendEvent = (method, params) => ws.send(JSON.stringify({ method, params }));
68
69
  transport.close = () => ws.close();
70
+ transport.onconnect();
69
71
  ws.on("message", async (message) => {
70
72
  const { id, method, params } = JSON.parse(String(message));
71
73
  try {
@@ -33,6 +33,7 @@ __export(network_exports, {
33
33
  createHttpServer: () => createHttpServer,
34
34
  createHttpsServer: () => createHttpsServer,
35
35
  createProxyAgent: () => createProxyAgent,
36
+ decorateServer: () => decorateServer,
36
37
  fetchData: () => fetchData,
37
38
  httpRequest: () => httpRequest,
38
39
  isURLAvailable: () => isURLAvailable,
@@ -62,7 +63,6 @@ function httpRequest(params, onResponse, onError) {
62
63
  url = parsedProxyURL;
63
64
  } else {
64
65
  options.agent = new import_utilsBundle.HttpsProxyAgent(parsedProxyURL);
65
- options.rejectUnauthorized = false;
66
66
  }
67
67
  }
68
68
  options.agent ??= url.protocol === "https:" ? import_happyEyeballs.httpsHappyEyeballsAgent : import_happyEyeballs.httpHappyEyeballsAgent;
@@ -235,6 +235,7 @@ function decorateServer(server) {
235
235
  createHttpServer,
236
236
  createHttpsServer,
237
237
  createProxyAgent,
238
+ decorateServer,
238
239
  fetchData,
239
240
  httpRequest,
240
241
  isURLAvailable,
@@ -42,7 +42,6 @@ var import_utilsBundle = require("../../utilsBundle");
42
42
  var import_debugLogger = require("./debugLogger");
43
43
  var import_zones = require("./zones");
44
44
  var import_debug = require("./debug");
45
- var import_mcpBundle = require("../../mcpBundle");
46
45
  const pipelineAsync = util.promisify(import_stream.pipeline);
47
46
  class NodeZone {
48
47
  constructor(zone) {
@@ -106,11 +105,6 @@ const nodePlatform = {
106
105
  streamWritable: (channel) => {
107
106
  return new WritableStreamImpl(channel);
108
107
  },
109
- zodToJsonSchema: (schema) => {
110
- if ("_zod" in schema)
111
- return import_mcpBundle.z.toJSONSchema(schema);
112
- return (0, import_mcpBundle.zodToJsonSchema)(schema);
113
- },
114
108
  zones: {
115
109
  current: () => new NodeZone((0, import_zones.currentZone)()),
116
110
  empty: new NodeZone(import_zones.emptyZone)
@@ -46,11 +46,12 @@ async function gracefullyCloseAll() {
46
46
  await Promise.all(Array.from(gracefullyCloseSet).map((gracefullyClose) => gracefullyClose().catch((e) => {
47
47
  })));
48
48
  }
49
- function gracefullyProcessExitDoNotHang(code) {
50
- setTimeout(() => process.exit(code), 3e4);
51
- gracefullyCloseAll().then(() => {
52
- process.exit(code);
53
- });
49
+ function gracefullyProcessExitDoNotHang(code, onExit) {
50
+ const beforeExit = onExit ? () => onExit().catch(() => {
51
+ }) : () => Promise.resolve();
52
+ const callback = () => beforeExit().then(() => process.exit(code));
53
+ setTimeout(callback, 3e4);
54
+ gracefullyCloseAll().then(callback);
54
55
  }
55
56
  function exitHandler() {
56
57
  for (const kill of killSet)
@@ -109,6 +110,7 @@ async function launchProcess(options) {
109
110
  // process group, making it possible to kill child process tree with `.kill(-pid)` command.
110
111
  // @see https://nodejs.org/api/child_process.html#child_process_options_detached
111
112
  detached: process.platform !== "win32",
113
+ windowsHide: true,
112
114
  env: options.env,
113
115
  cwd: options.cwd,
114
116
  shell: options.shell,
@@ -191,7 +193,7 @@ async function launchProcess(options) {
191
193
  options.log(`[pid=${spawnedProcess.pid}] <will force kill>`);
192
194
  try {
193
195
  if (process.platform === "win32") {
194
- const taskkillProcess = childProcess.spawnSync(`taskkill /pid ${spawnedProcess.pid} /T /F`, { shell: true });
196
+ const taskkillProcess = childProcess.spawnSync(`taskkill /pid ${spawnedProcess.pid} /T /F`, { shell: true, windowsHide: true });
195
197
  const [stdout2, stderr2] = [taskkillProcess.stdout.toString(), taskkillProcess.stderr.toString()];
196
198
  if (stdout2)
197
199
  options.log(`[pid=${spawnedProcess.pid}] taskkill stdout: ${stdout2}`);
@@ -21,7 +21,6 @@ __export(zipFile_exports, {
21
21
  ZipFile: () => ZipFile
22
22
  });
23
23
  module.exports = __toCommonJS(zipFile_exports);
24
- var import_zipBundle = require("../../zipBundle");
25
24
  class ZipFile {
26
25
  constructor(fileName) {
27
26
  this._entries = /* @__PURE__ */ new Map();
@@ -29,8 +28,9 @@ class ZipFile {
29
28
  this._openedPromise = this._open();
30
29
  }
31
30
  async _open() {
31
+ const { yauzl } = require("../../zipBundle");
32
32
  await new Promise((fulfill, reject) => {
33
- import_zipBundle.yauzl.open(this._fileName, { autoClose: false }, (e, z) => {
33
+ yauzl.open(this._fileName, { autoClose: false }, (e, z) => {
34
34
  if (e) {
35
35
  reject(e);
36
36
  return;