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
@@ -34,8 +34,12 @@ var import_networkDispatchers = require("./networkDispatchers");
34
34
  var import_networkDispatchers2 = require("./networkDispatchers");
35
35
  var import_networkDispatchers3 = require("./networkDispatchers");
36
36
  var import_webSocketRouteDispatcher = require("./webSocketRouteDispatcher");
37
+ var import_disposableDispatcher = require("./disposableDispatcher");
37
38
  var import_instrumentation = require("../instrumentation");
38
39
  var import_urlMatch = require("../../utils/isomorphic/urlMatch");
40
+ var import_recorder = require("../recorder");
41
+ var import_disposable = require("../disposable");
42
+ var import_videoRecorder = require("../videoRecorder");
39
43
  class PageDispatcher extends import_dispatcher.Dispatcher {
40
44
  constructor(parentScope, page) {
41
45
  const mainFrame = import_frameDispatcher.FrameDispatcher.from(parentScope, page.mainFrame());
@@ -43,14 +47,14 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
43
47
  mainFrame,
44
48
  viewportSize: page.emulatedSize()?.viewport,
45
49
  isClosed: page.isClosed(),
46
- opener: PageDispatcher.fromNullable(parentScope, page.opener())
50
+ opener: PageDispatcher.fromNullable(parentScope, page.opener()),
51
+ video: page.video ? createVideoDispatcher(parentScope, page.video) : void 0
47
52
  });
48
53
  this._type_EventTarget = true;
49
54
  this._type_Page = true;
50
55
  this._subscriptions = /* @__PURE__ */ new Set();
51
56
  this._webSocketInterceptionPatterns = [];
52
- this._bindings = [];
53
- this._initScripts = [];
57
+ this._disposables = [];
54
58
  this._interceptionUrlMatchers = [];
55
59
  this._locatorHandlers = /* @__PURE__ */ new Set();
56
60
  this._jsCoverageActive = false;
@@ -84,9 +88,6 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
84
88
  this.addObjectListener(import_page.Page.Events.LocatorHandlerTriggered, (uid) => this._dispatchEvent("locatorHandlerTriggered", { uid }));
85
89
  this.addObjectListener(import_page.Page.Events.WebSocket, (webSocket) => this._dispatchEvent("webSocket", { webSocket: new import_networkDispatchers3.WebSocketDispatcher(this, webSocket) }));
86
90
  this.addObjectListener(import_page.Page.Events.Worker, (worker) => this._dispatchEvent("worker", { worker: new WorkerDispatcher(this, worker) }));
87
- this.addObjectListener(import_page.Page.Events.Video, (artifact) => this._dispatchEvent("video", { artifact: import_artifactDispatcher.ArtifactDispatcher.from(parentScope, artifact) }));
88
- if (page.video)
89
- this._dispatchEvent("video", { artifact: import_artifactDispatcher.ArtifactDispatcher.from(this.parentScope(), page.video) });
90
91
  const frames = page.frameManager.frames();
91
92
  for (let i = 1; i < frames.length; i++)
92
93
  this._onFrameAttached(frames[i]);
@@ -111,7 +112,8 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
111
112
  this._dispatchEvent("bindingCall", { binding: binding2 });
112
113
  return binding2.promise();
113
114
  });
114
- this._bindings.push(binding);
115
+ this._disposables.push(binding);
116
+ return { disposable: new import_disposableDispatcher.DisposableDispatcher(this, binding) };
115
117
  }
116
118
  async setExtraHTTPHeaders(params, progress) {
117
119
  await this._page.setExtraHTTPHeaders(progress, params.headers);
@@ -153,7 +155,9 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
153
155
  await this._page.setViewportSize(progress, params.viewportSize);
154
156
  }
155
157
  async addInitScript(params, progress) {
156
- this._initScripts.push(await this._page.addInitScript(progress, params.source));
158
+ const initScript = await this._page.addInitScript(params.source);
159
+ this._disposables.push(initScript);
160
+ return { disposable: new import_disposableDispatcher.DisposableDispatcher(this, initScript) };
157
161
  }
158
162
  async setNetworkInterceptionPatterns(params, progress) {
159
163
  const hadMatchers = this._interceptionUrlMatchers.length > 0;
@@ -162,7 +166,7 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
162
166
  await this._page.removeRequestInterceptor(this._requestInterceptor);
163
167
  this._interceptionUrlMatchers = [];
164
168
  } else {
165
- this._interceptionUrlMatchers = params.patterns.map((pattern) => pattern.regexSource ? new RegExp(pattern.regexSource, pattern.regexFlags) : pattern.glob);
169
+ this._interceptionUrlMatchers = params.patterns.map(import_urlMatch.deserializeURLMatch);
166
170
  if (!hadMatchers)
167
171
  await this._page.addRequestInterceptor(progress, this._requestInterceptor);
168
172
  }
@@ -208,49 +212,51 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
208
212
  this._subscriptions.delete(params.event);
209
213
  }
210
214
  async keyboardDown(params, progress) {
211
- await this._page.keyboard.down(progress, params.key);
215
+ await this._page.keyboard.apiDown(progress, params.key);
212
216
  }
213
217
  async keyboardUp(params, progress) {
214
- await this._page.keyboard.up(progress, params.key);
218
+ await this._page.keyboard.apiUp(progress, params.key);
215
219
  }
216
220
  async keyboardInsertText(params, progress) {
217
- await this._page.keyboard.insertText(progress, params.text);
221
+ await this._page.keyboard.apiInsertText(progress, params.text);
218
222
  }
219
223
  async keyboardType(params, progress) {
220
- await this._page.keyboard.type(progress, params.text, params);
224
+ await this._page.keyboard.apiType(progress, params.text, params);
221
225
  }
222
226
  async keyboardPress(params, progress) {
223
- await this._page.keyboard.press(progress, params.key, params);
227
+ await this._page.keyboard.apiPress(progress, params.key, params);
228
+ }
229
+ async clearConsoleMessages(params, progress) {
230
+ this._page.clearConsoleMessages();
224
231
  }
225
232
  async consoleMessages(params, progress) {
226
233
  this._subscriptions.add("console");
227
- return { messages: this._page.consoleMessages().map((message) => this.parentScope().serializeConsoleMessage(message, this)) };
234
+ return { messages: this._page.consoleMessages(params.filter).map((message) => this.parentScope().serializeConsoleMessage(message, this)) };
235
+ }
236
+ async clearPageErrors(params, progress) {
237
+ this._page.clearPageErrors();
228
238
  }
229
239
  async pageErrors(params, progress) {
230
- return { errors: this._page.pageErrors().map((error) => (0, import_errors.serializeError)(error)) };
240
+ return { errors: this._page.pageErrors(params.filter).map((error) => (0, import_errors.serializeError)(error)) };
231
241
  }
232
242
  async mouseMove(params, progress) {
233
- progress.metadata.point = { x: params.x, y: params.y };
234
- await this._page.mouse.move(progress, params.x, params.y, params);
243
+ await this._page.mouse.apiMove(progress, params.x, params.y, params);
235
244
  }
236
245
  async mouseDown(params, progress) {
237
- progress.metadata.point = this._page.mouse.currentPoint();
238
- await this._page.mouse.down(progress, params);
246
+ await this._page.mouse.apiDown(progress, params);
239
247
  }
240
248
  async mouseUp(params, progress) {
241
- progress.metadata.point = this._page.mouse.currentPoint();
242
- await this._page.mouse.up(progress, params);
249
+ await this._page.mouse.apiUp(progress, params);
243
250
  }
244
251
  async mouseClick(params, progress) {
245
- progress.metadata.point = { x: params.x, y: params.y };
246
- await this._page.mouse.click(progress, params.x, params.y, params);
252
+ await this._page.mouse.apiClick(progress, params.x, params.y, params);
247
253
  }
248
254
  async mouseWheel(params, progress) {
249
- await this._page.mouse.wheel(progress, params.deltaX, params.deltaY);
255
+ await this._page.mouse.apiWheel(progress, params.deltaX, params.deltaY);
250
256
  }
251
257
  async touchscreenTap(params, progress) {
252
258
  progress.metadata.point = { x: params.x, y: params.y };
253
- await this._page.touchscreen.tap(progress, params.x, params.y);
259
+ await this._page.touchscreen.apiTap(progress, params.x, params.y);
254
260
  }
255
261
  async pdf(params, progress) {
256
262
  if (!this._page.pdf)
@@ -262,12 +268,69 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
262
268
  this._subscriptions.add("request");
263
269
  return { requests: this._page.networkRequests().map((request) => import_networkDispatchers.RequestDispatcher.from(this.parentScope(), request)) };
264
270
  }
265
- async snapshotForAI(params, progress) {
266
- return await this._page.snapshotForAI(progress, params);
267
- }
268
271
  async bringToFront(params, progress) {
269
272
  await progress.race(this._page.bringToFront());
270
273
  }
274
+ async pickLocator(params, progress) {
275
+ const recorder = await import_recorder.Recorder.forContext(this._page.browserContext, { omitCallTracking: true, hideToolbar: true });
276
+ const selector = await recorder.pickLocator(progress, this._page);
277
+ return { selector };
278
+ }
279
+ async cancelPickLocator(params, progress) {
280
+ const recorder = await import_recorder.Recorder.existingForContext(this._page.browserContext);
281
+ await recorder?.setMode("none");
282
+ }
283
+ async screencastShowOverlay(params) {
284
+ const id = await this._page.overlay.show(params.html, params.duration);
285
+ return { id };
286
+ }
287
+ async screencastRemoveOverlay(params) {
288
+ await this._page.overlay.remove(params.id);
289
+ }
290
+ async screencastChapter(params) {
291
+ await this._page.overlay.chapter(params);
292
+ }
293
+ async screencastSetOverlayVisible(params) {
294
+ await this._page.overlay.setVisible(params.visible);
295
+ }
296
+ async screencastShowActions(params) {
297
+ this._page.screencast.showActions({ duration: params.duration, position: params.position, fontSize: params.fontSize });
298
+ }
299
+ async screencastHideActions() {
300
+ this._page.screencast.hideActions();
301
+ }
302
+ async screencastStart(params, progress) {
303
+ if (this._screencastClient || this._videoRecorder)
304
+ throw new Error("Screencast is already running");
305
+ if (params.sendFrames) {
306
+ this._screencastClient = {
307
+ onFrame: (frame) => {
308
+ this._dispatchEvent("screencastFrame", { data: frame.buffer });
309
+ },
310
+ dispose: () => {
311
+ },
312
+ size: params.size,
313
+ quality: params.quality
314
+ };
315
+ this._page.screencast.addClient(this._screencastClient);
316
+ }
317
+ let artifact;
318
+ if (params.record) {
319
+ this._videoRecorder = new import_videoRecorder.VideoRecorder(this._page.screencast);
320
+ artifact = this._videoRecorder.start(params);
321
+ }
322
+ return { artifact: artifact ? createVideoDispatcher(this.parentScope(), artifact) : void 0 };
323
+ }
324
+ async screencastStop(params, progress) {
325
+ if (this._videoRecorder) {
326
+ await this._videoRecorder.stop();
327
+ this._videoRecorder = void 0;
328
+ }
329
+ const client = this._screencastClient;
330
+ this._screencastClient = void 0;
331
+ if (client)
332
+ this._page.screencast.removeClient(client);
333
+ }
271
334
  async startJSCoverage(params, progress) {
272
335
  const coverage = this._page.coverage;
273
336
  await coverage.startJSCoverage(progress, params);
@@ -300,12 +363,8 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
300
363
  this._interceptionUrlMatchers = [];
301
364
  this._page.removeRequestInterceptor(this._requestInterceptor).catch(() => {
302
365
  });
303
- this._page.removeExposedBindings(this._bindings).catch(() => {
304
- });
305
- this._bindings = [];
306
- this._page.removeInitScripts(this._initScripts).catch(() => {
366
+ (0, import_disposable.disposeAll)(this._disposables).catch(() => {
307
367
  });
308
- this._initScripts = [];
309
368
  if (this._routeWebSocketInitScript)
310
369
  import_webSocketRouteDispatcher.WebSocketRouteDispatcher.uninstall(this.connection, this._page, this._routeWebSocketInitScript).catch(() => {
311
370
  });
@@ -323,6 +382,11 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
323
382
  this._page.coverage.stopCSSCoverage().catch(() => {
324
383
  });
325
384
  this._cssCoverageActive = false;
385
+ this.screencastStop({}, void 0).catch(() => {
386
+ });
387
+ }
388
+ async setDockTile(params) {
389
+ await this._page.setDockTile(params.image);
326
390
  }
327
391
  }
328
392
  class WorkerDispatcher extends import_dispatcher.Dispatcher {
@@ -381,6 +445,9 @@ class BindingCallDispatcher extends import_dispatcher.Dispatcher {
381
445
  this._dispose();
382
446
  }
383
447
  }
448
+ function createVideoDispatcher(parentScope, video) {
449
+ return import_artifactDispatcher.ArtifactDispatcher.from(parentScope.parentScope(), video);
450
+ }
384
451
  // Annotate the CommonJS export names for ESM import in node:
385
452
  0 && (module.exports = {
386
453
  BindingCallDispatcher,
@@ -101,7 +101,7 @@ class WebSocketRouteDispatcher extends import_dispatcher.Dispatcher {
101
101
  }, data);
102
102
  }
103
103
  ++data.counter;
104
- return await target.addInitScript(progress, `
104
+ return await target.addInitScript(`
105
105
  (() => {
106
106
  const module = {};
107
107
  ${rawWebSocketMockSource.source}
@@ -115,8 +115,8 @@ class WebSocketRouteDispatcher extends import_dispatcher.Dispatcher {
115
115
  if (!data || data.connection !== connection)
116
116
  return;
117
117
  if (--data.counter <= 0)
118
- await context.removeExposedBindings([data.binding]);
119
- await target.removeInitScripts([initScript]);
118
+ await data.binding.dispose();
119
+ await initScript.dispose();
120
120
  }
121
121
  async connect(params, progress) {
122
122
  await this._evaluateAPIRequest(progress, { id: this._id, type: "connect" });
@@ -152,8 +152,7 @@ class WebSocketRouteDispatcher extends import_dispatcher.Dispatcher {
152
152
  }
153
153
  function matchesPattern(dispatcher, baseURL, url) {
154
154
  for (const pattern of dispatcher._webSocketInterceptionPatterns || []) {
155
- const urlMatch = pattern.regexSource ? new RegExp(pattern.regexSource, pattern.regexFlags) : pattern.glob;
156
- if ((0, import_urlMatch.urlMatches)(baseURL, url, urlMatch, true))
155
+ if ((0, import_urlMatch.urlMatches)(baseURL, url, (0, import_urlMatch.deserializeURLMatch)(pattern), true))
157
156
  return true;
158
157
  }
159
158
  return false;
@@ -0,0 +1,41 @@
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
+ DisposableObject: () => DisposableObject,
22
+ disposeAll: () => disposeAll
23
+ });
24
+ module.exports = __toCommonJS(disposable_exports);
25
+ var import_instrumentation = require("./instrumentation");
26
+ class DisposableObject extends import_instrumentation.SdkObject {
27
+ constructor(parent) {
28
+ super(parent, "disposable");
29
+ this.parent = parent;
30
+ }
31
+ }
32
+ async function disposeAll(disposables) {
33
+ const copy = [...disposables];
34
+ disposables.length = 0;
35
+ await Promise.all(copy.map((d) => d.dispose()));
36
+ }
37
+ // Annotate the CommonJS export names for ESM import in node:
38
+ 0 && (module.exports = {
39
+ DisposableObject,
40
+ disposeAll
41
+ });
package/lib/server/dom.js CHANGED
@@ -202,17 +202,17 @@ class ElementHandle extends js.JSHandle {
202
202
  );
203
203
  }
204
204
  async _clickablePoint() {
205
- const intersectQuadWithViewport = (quad) => {
206
- return quad.map((point) => ({
205
+ const intersectQuadWithViewport = (quad2) => {
206
+ return quad2.map((point) => ({
207
207
  x: Math.min(Math.max(point.x, 0), metrics.width),
208
208
  y: Math.min(Math.max(point.y, 0), metrics.height)
209
209
  }));
210
210
  };
211
- const computeQuadArea = (quad) => {
211
+ const computeQuadArea = (quad2) => {
212
212
  let area = 0;
213
- for (let i = 0; i < quad.length; ++i) {
214
- const p1 = quad[i];
215
- const p2 = quad[(i + 1) % quad.length];
213
+ for (let i = 0; i < quad2.length; ++i) {
214
+ const p1 = quad2[i];
215
+ const p2 = quad2[(i + 1) % quad2.length];
216
216
  area += (p1.x * p2.y - p2.x * p1.y) / 2;
217
217
  }
218
218
  return Math.abs(area);
@@ -225,17 +225,19 @@ class ElementHandle extends js.JSHandle {
225
225
  return quads;
226
226
  if (!quads || !quads.length)
227
227
  return "error:notvisible";
228
- const filtered = quads.map((quad) => intersectQuadWithViewport(quad)).filter((quad) => computeQuadArea(quad) > 0.99);
228
+ const filtered = quads.map((quad2) => intersectQuadWithViewport(quad2)).filter((quad2) => computeQuadArea(quad2) > 0.99);
229
229
  if (!filtered.length)
230
230
  return "error:notinviewport";
231
+ const quad = filtered[0];
232
+ const box = quadToRect(quad);
231
233
  if (this._page.browserContext._browser.options.name === "firefox") {
232
- for (const quad of filtered) {
233
- const integerPoint = findIntegerPointInsideQuad(quad);
234
+ for (const q of filtered) {
235
+ const integerPoint = findIntegerPointInsideQuad(q);
234
236
  if (integerPoint)
235
- return integerPoint;
237
+ return { point: integerPoint, box };
236
238
  }
237
239
  }
238
- return quadMiddlePoint(filtered[0]);
240
+ return { point: quadMiddlePoint(quad), box };
239
241
  }
240
242
  async _offsetPoint(offset) {
241
243
  const [box, border] = await Promise.all([
@@ -248,13 +250,17 @@ class ElementHandle extends js.JSHandle {
248
250
  if (border === "error:notconnected")
249
251
  return border;
250
252
  return {
251
- x: box.x + border.left + offset.x,
252
- y: box.y + border.top + offset.y
253
+ point: {
254
+ x: box.x + border.left + offset.x,
255
+ y: box.y + border.top + offset.y
256
+ },
257
+ box
253
258
  };
254
259
  }
255
260
  async _retryAction(progress, actionName, action, options) {
256
261
  let retry = 0;
257
262
  const waitTime = [0, 20, 100, 100, 500];
263
+ const noAutoWaiting = options.__testHookNoAutoWaiting ?? options.noAutoWaiting;
258
264
  while (true) {
259
265
  if (retry) {
260
266
  progress.log(`retrying ${actionName} action${options.trial ? " (trial run)" : ""}`);
@@ -268,35 +274,43 @@ class ElementHandle extends js.JSHandle {
268
274
  } else {
269
275
  progress.log(`attempting ${actionName} action${options.trial ? " (trial run)" : ""}`);
270
276
  }
271
- if (!options.skipActionPreChecks && !options.force)
277
+ if (!options.skipActionPreChecks && !options.force && !noAutoWaiting)
272
278
  await this._frame._page.performActionPreChecks(progress);
273
279
  const result = await action(retry);
274
280
  ++retry;
275
281
  if (result === "error:notvisible") {
276
- if (options.force)
282
+ if (options.force || noAutoWaiting)
277
283
  throw new NonRecoverableDOMError("Element is not visible");
278
284
  progress.log(" element is not visible");
279
285
  continue;
280
286
  }
281
287
  if (result === "error:notinviewport") {
282
- if (options.force)
288
+ if (options.force || noAutoWaiting)
283
289
  throw new NonRecoverableDOMError("Element is outside of the viewport");
284
290
  progress.log(" element is outside of the viewport");
285
291
  continue;
286
292
  }
287
293
  if (result === "error:optionsnotfound") {
294
+ if (noAutoWaiting)
295
+ throw new NonRecoverableDOMError("Did not find some options");
288
296
  progress.log(" did not find some options");
289
297
  continue;
290
298
  }
291
299
  if (result === "error:optionnotenabled") {
300
+ if (noAutoWaiting)
301
+ throw new NonRecoverableDOMError("Option being selected is not enabled");
292
302
  progress.log(" option being selected is not enabled");
293
303
  continue;
294
304
  }
295
305
  if (typeof result === "object" && "hitTargetDescription" in result) {
306
+ if (noAutoWaiting)
307
+ throw new NonRecoverableDOMError(`${result.hitTargetDescription} intercepts pointer events`);
296
308
  progress.log(` ${result.hitTargetDescription} intercepts pointer events`);
297
309
  continue;
298
310
  }
299
311
  if (typeof result === "object" && "missingState" in result) {
312
+ if (noAutoWaiting)
313
+ throw new NonRecoverableDOMError(`Element is not ${result.missingState}`);
300
314
  progress.log(` element is not ${result.missingState}`);
301
315
  continue;
302
316
  }
@@ -351,11 +365,12 @@ class ElementHandle extends js.JSHandle {
351
365
  if (scrolled !== "done")
352
366
  return scrolled;
353
367
  progress.log(" done scrolling");
354
- const maybePoint = position ? await progress.race(this._offsetPoint(position)) : await progress.race(this._clickablePoint());
355
- if (typeof maybePoint === "string")
356
- return maybePoint;
357
- const point = roundPoint(maybePoint);
368
+ const maybeResult = position ? await progress.race(this._offsetPoint(position)) : await progress.race(this._clickablePoint());
369
+ if (typeof maybeResult === "string")
370
+ return maybeResult;
371
+ const point = roundPoint(maybeResult.point);
358
372
  progress.metadata.point = point;
373
+ progress.metadata.box = maybeResult.box;
359
374
  await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
360
375
  let hitTargetInterceptionHandle;
361
376
  if (force) {
@@ -461,10 +476,15 @@ class ElementHandle extends js.JSHandle {
461
476
  const result = await this._selectOption(progress, elements, values, options);
462
477
  return throwRetargetableDOMError(result);
463
478
  }
479
+ async _beforeNonPointerAction(progress) {
480
+ if (progress.metadata.annotate)
481
+ progress.metadata.box = await this.boundingBox() || void 0;
482
+ await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
483
+ }
464
484
  async _selectOption(progress, elements, values, options) {
465
485
  let resultingOptions = [];
466
486
  const result = await this._retryAction(progress, "select option", async () => {
467
- await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
487
+ await this._beforeNonPointerAction(progress);
468
488
  if (!options.force)
469
489
  progress.log(` waiting for element to be visible and enabled`);
470
490
  const optionsToSelect = [...elements, ...values];
@@ -495,7 +515,7 @@ class ElementHandle extends js.JSHandle {
495
515
  async _fill(progress, value, options) {
496
516
  progress.log(` fill("${value}")`);
497
517
  return await this._retryAction(progress, "fill", async () => {
498
- await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
518
+ await this._beforeNonPointerAction(progress);
499
519
  if (!options.force)
500
520
  progress.log(" waiting for element to be visible, enabled and editable");
501
521
  const result = await progress.race(this.evaluateInUtility(async ([injected, node, { value: value2, force }]) => {
@@ -508,7 +528,7 @@ class ElementHandle extends js.JSHandle {
508
528
  }, { value, force: options.force }));
509
529
  if (result === "needsinput") {
510
530
  if (value)
511
- await this._page.keyboard.insertText(progress, value);
531
+ await this._page.keyboard._insertText(progress, value);
512
532
  else
513
533
  await this._page.keyboard.press(progress, "Delete");
514
534
  return "done";
@@ -559,7 +579,7 @@ class ElementHandle extends js.JSHandle {
559
579
  if (result === "error:notconnected" || !result.asElement())
560
580
  return "error:notconnected";
561
581
  const retargeted = result.asElement();
562
- await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
582
+ await this._beforeNonPointerAction(progress);
563
583
  if (localPaths || localDirectory) {
564
584
  const localPathsOrDirectory = localDirectory ? [localDirectory] : localPaths;
565
585
  await progress.race(Promise.all(localPathsOrDirectory.map((localPath) => import_fs.default.promises.access(localPath, import_fs.default.constants.F_OK))));
@@ -592,7 +612,7 @@ class ElementHandle extends js.JSHandle {
592
612
  }
593
613
  async _type(progress, text, options) {
594
614
  progress.log(`elementHandle.type("${text}")`);
595
- await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
615
+ await this._beforeNonPointerAction(progress);
596
616
  const result = await this._focus(
597
617
  progress,
598
618
  true
@@ -610,7 +630,7 @@ class ElementHandle extends js.JSHandle {
610
630
  }
611
631
  async _press(progress, key, options) {
612
632
  progress.log(`elementHandle.press("${key}")`);
613
- await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
633
+ await this._beforeNonPointerAction(progress);
614
634
  return this._page.frameManager.waitForSignalsCreatedBy(progress, !options.noWaitAfter, async () => {
615
635
  const result = await this._focus(
616
636
  progress,
@@ -657,9 +677,6 @@ class ElementHandle extends js.JSHandle {
657
677
  async boundingBox() {
658
678
  return this._page.delegate.getBoundingBox(this);
659
679
  }
660
- async ariaSnapshot() {
661
- return await this.evaluateInUtility(([injected, element]) => injected.ariaSnapshot(element, { mode: "expect" }), {});
662
- }
663
680
  async screenshot(progress, options) {
664
681
  return await this._page.screenshotter.screenshotElement(progress, this, options);
665
682
  }
@@ -758,6 +775,16 @@ function roundPoint(point) {
758
775
  y: (point.y * 100 | 0) / 100
759
776
  };
760
777
  }
778
+ function quadToRect(quad) {
779
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
780
+ for (const point of quad) {
781
+ minX = Math.min(minX, point.x);
782
+ minY = Math.min(minY, point.y);
783
+ maxX = Math.max(maxX, point.x);
784
+ maxY = Math.max(maxY, point.y);
785
+ }
786
+ return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
787
+ }
761
788
  function quadMiddlePoint(quad) {
762
789
  const result = { x: 0, y: 0 };
763
790
  for (const point of quad) {
@@ -36,9 +36,10 @@ var import_page = require("./page");
36
36
  var import_utils = require("../utils");
37
37
  var import_artifact = require("./artifact");
38
38
  class Download {
39
- constructor(page, downloadsPath, uuid, url, suggestedFilename) {
39
+ constructor(page, downloadsPath, uuid, url, suggestedFilename, downloadFilename) {
40
40
  const unaccessibleErrorMessage = page.browserContext._options.acceptDownloads === "deny" ? "Pass { acceptDownloads: true } when you are creating your browser context." : void 0;
41
- this.artifact = new import_artifact.Artifact(page, import_path.default.join(downloadsPath, uuid), unaccessibleErrorMessage, () => {
41
+ const downloadPath = import_path.default.join(downloadsPath, downloadFilename ?? uuid);
42
+ this.artifact = new import_artifact.Artifact(page, downloadPath, unaccessibleErrorMessage, () => {
42
43
  return this._page.browserContext.cancelDownload(uuid);
43
44
  });
44
45
  this._page = page;
@@ -76,7 +76,6 @@ class ElectronApplication extends import_instrumentation.SdkObject {
76
76
  this._nodeSession.on("Runtime.consoleAPICalled", (event) => this._onConsoleAPI(event));
77
77
  const appClosePromise = new Promise((f) => this.once(ElectronApplication.Events.Close, f));
78
78
  this._browserContext.setCustomCloseHandler(async () => {
79
- await this._browserContext.stopVideoRecording();
80
79
  const electronHandle = await this._nodeElectronHandlePromise;
81
80
  await electronHandle.evaluate(({ app }) => app.quit()).catch(() => {
82
81
  });
@@ -97,7 +96,7 @@ class ElectronApplication extends import_instrumentation.SdkObject {
97
96
  if (!this._nodeExecutionContext)
98
97
  return;
99
98
  const args = event.args.map((arg) => (0, import_crExecutionContext.createHandle)(this._nodeExecutionContext, arg));
100
- const message = new import_console.ConsoleMessage(null, null, event.type, void 0, args, (0, import_crProtocolHelper.toConsoleMessageLocation)(event.stackTrace));
99
+ const message = new import_console.ConsoleMessage(null, null, event.type, void 0, args, (0, import_crProtocolHelper.toConsoleMessageLocation)(event.stackTrace), event.timestamp);
101
100
  this.emit(ElectronApplication.Events.Console, message);
102
101
  }
103
102
  async initialize() {
@@ -131,11 +130,17 @@ class Electron extends import_instrumentation.SdkObject {
131
130
  let app = void 0;
132
131
  let electronArguments = ["--inspect=0", "--remote-debugging-port=0", ...options.args || []];
133
132
  if (import_os.default.platform() === "linux") {
134
- const runningAsRoot = process.geteuid && process.geteuid() === 0;
135
- if (runningAsRoot && electronArguments.indexOf("--no-sandbox") === -1)
133
+ if (!options.chromiumSandbox && electronArguments.indexOf("--no-sandbox") === -1)
136
134
  electronArguments.unshift("--no-sandbox");
137
135
  }
138
- const artifactsDir = await progress.race(import_fs.default.promises.mkdtemp(ARTIFACTS_FOLDER));
136
+ let artifactsDir;
137
+ const tempDirectories = [];
138
+ if (options.artifactsDir) {
139
+ artifactsDir = options.artifactsDir;
140
+ } else {
141
+ artifactsDir = await progress.race(import_fs.default.promises.mkdtemp(ARTIFACTS_FOLDER));
142
+ tempDirectories.push(artifactsDir);
143
+ }
139
144
  const browserLogsCollector = new import_debugLogger.RecentLogsCollector();
140
145
  const env = options.env ? (0, import_processLauncher.envArrayToObject)(options.env) : process.env;
141
146
  let command;
@@ -158,8 +163,8 @@ class Electron extends import_instrumentation.SdkObject {
158
163
  let shell = false;
159
164
  if (process.platform === "win32") {
160
165
  shell = true;
161
- command = `"${command}"`;
162
- electronArguments = electronArguments.map((arg) => `"${arg}"`);
166
+ command = [command, ...electronArguments].map((arg) => `"${escapeDoubleQuotes(arg)}"`).join(" ");
167
+ electronArguments = [];
163
168
  }
164
169
  delete env.NODE_OPTIONS;
165
170
  const { launchedProcess, gracefullyClose, kill } = await (0, import_processLauncher.launchProcess)({
@@ -173,7 +178,7 @@ class Electron extends import_instrumentation.SdkObject {
173
178
  shell,
174
179
  stdio: "pipe",
175
180
  cwd: options.cwd,
176
- tempDirectories: [artifactsDir],
181
+ tempDirectories,
177
182
  attemptToGracefullyClose: () => app.close(),
178
183
  handleSIGINT: true,
179
184
  handleSIGTERM: true,
@@ -219,7 +224,7 @@ class Electron extends import_instrumentation.SdkObject {
219
224
  };
220
225
  const browserOptions = {
221
226
  name: "electron",
222
- isChromium: true,
227
+ browserType: "chromium",
223
228
  headful: true,
224
229
  persistent: contextOptions,
225
230
  browserProcess,
@@ -263,6 +268,9 @@ async function waitForLine(progress, process2, regex) {
263
268
  import_eventsHelper.eventsHelper.removeEventListeners(listeners);
264
269
  }
265
270
  }
271
+ function escapeDoubleQuotes(str) {
272
+ return str.replace(/"/g, '\\"');
273
+ }
266
274
  // Annotate the CommonJS export names for ESM import in node:
267
275
  0 && (module.exports = {
268
276
  Electron,