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
@@ -496,6 +496,7 @@ const deps = {
496
496
  firefox: [
497
497
  "libasound2t64",
498
498
  "libatk1.0-0t64",
499
+ "libavcodec60",
499
500
  "libcairo-gobject2",
500
501
  "libcairo2",
501
502
  "libdbus-1-3",
@@ -29,6 +29,7 @@ var import_path = __toESM(require("path"));
29
29
  var import_manualPromise = require("../../utils/isomorphic/manualPromise");
30
30
  var import_network = require("../utils/network");
31
31
  var import_zipBundle = require("../../zipBundle");
32
+ var import_fileUtils = require("../utils/fileUtils");
32
33
  function log(message) {
33
34
  process.send?.({ method: "log", params: { message } });
34
35
  }
@@ -99,6 +100,8 @@ function downloadFile(options) {
99
100
  async function main(options) {
100
101
  await downloadFile(options);
101
102
  log(`SUCCESS downloading ${options.title}`);
103
+ log(`removing existing browser directory if any`);
104
+ await (0, import_fileUtils.removeFolders)([options.browserDirectory]);
102
105
  log(`extracting archive`);
103
106
  await (0, import_zipBundle.extract)(options.zipPath, { dir: options.browserDirectory });
104
107
  if (options.executablePath) {
@@ -0,0 +1,137 @@
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 screencast_exports = {};
20
+ __export(screencast_exports, {
21
+ Screencast: () => Screencast
22
+ });
23
+ module.exports = __toCommonJS(screencast_exports);
24
+ var import_utils = require("../utils");
25
+ var import_utils2 = require("../utils");
26
+ class Screencast {
27
+ constructor(page) {
28
+ this._clients = /* @__PURE__ */ new Set();
29
+ this.page = page;
30
+ this.page.instrumentation.addListener(this, page.browserContext);
31
+ }
32
+ async handlePageOrContextClose() {
33
+ const clients = [...this._clients];
34
+ this._clients.clear();
35
+ for (const client of clients) {
36
+ if (client.gracefulClose)
37
+ await client.gracefulClose();
38
+ }
39
+ }
40
+ dispose() {
41
+ for (const client of this._clients)
42
+ client.dispose();
43
+ this._clients.clear();
44
+ this.page.instrumentation.removeListener(this);
45
+ }
46
+ showActions(options) {
47
+ this._actions = options;
48
+ }
49
+ hideActions() {
50
+ this._actions = void 0;
51
+ }
52
+ addClient(client) {
53
+ this._clients.add(client);
54
+ if (this._clients.size === 1)
55
+ this._startScreencast(client.size, client.quality);
56
+ return { size: this._size };
57
+ }
58
+ removeClient(client) {
59
+ if (!this._clients.has(client))
60
+ return;
61
+ this._clients.delete(client);
62
+ if (!this._clients.size)
63
+ this._stopScreencast();
64
+ }
65
+ size() {
66
+ return this._size;
67
+ }
68
+ _startScreencast(size, quality) {
69
+ this._size = size;
70
+ if (!this._size) {
71
+ const viewport = this.page.browserContext._options.viewport || { width: 800, height: 600 };
72
+ const scale = Math.min(1, 800 / Math.max(viewport.width, viewport.height));
73
+ this._size = {
74
+ width: Math.floor(viewport.width * scale),
75
+ height: Math.floor(viewport.height * scale)
76
+ };
77
+ }
78
+ this._size = {
79
+ width: this._size.width & ~1,
80
+ height: this._size.height & ~1
81
+ };
82
+ this.page.delegate.startScreencast({
83
+ width: this._size.width,
84
+ height: this._size.height,
85
+ quality: quality ?? 90
86
+ });
87
+ }
88
+ _stopScreencast() {
89
+ this.page.delegate.stopScreencast();
90
+ }
91
+ onScreencastFrame(frame, ack) {
92
+ const asyncResults = [];
93
+ for (const client of this._clients) {
94
+ const result = client.onFrame(frame);
95
+ if (result)
96
+ asyncResults.push(result);
97
+ }
98
+ if (ack) {
99
+ if (!asyncResults.length)
100
+ ack();
101
+ else
102
+ Promise.race(asyncResults).then(ack);
103
+ }
104
+ }
105
+ async onBeforeCall(sdkObject, metadata, parentId) {
106
+ if (!this._actions)
107
+ return;
108
+ metadata.annotate = true;
109
+ }
110
+ async onBeforeInputAction(sdkObject, metadata) {
111
+ if (!this._actions)
112
+ return;
113
+ const page = sdkObject.attribution.page;
114
+ if (!page)
115
+ return;
116
+ const actionTitle = (0, import_utils.renderTitleForCall)(metadata);
117
+ const utility = await page.mainFrame()._utilityContext();
118
+ await utility.evaluate(async (options) => {
119
+ const { injected, duration } = options;
120
+ injected.setScreencastAnnotation(options);
121
+ await new Promise((f) => injected.utils.builtins.setTimeout(f, duration));
122
+ injected.setScreencastAnnotation(null);
123
+ }, {
124
+ injected: await utility.injectedScript(),
125
+ duration: this._actions?.duration ?? 500,
126
+ point: metadata.point,
127
+ box: metadata.box,
128
+ actionTitle,
129
+ position: this._actions?.position,
130
+ fontSize: this._actions?.fontSize
131
+ }).catch((e) => import_utils2.debugLogger.log("error", e));
132
+ }
133
+ }
134
+ // Annotate the CommonJS export names for ESM import in node:
135
+ 0 && (module.exports = {
136
+ Screencast
137
+ });
@@ -57,7 +57,7 @@ class Snapshotter {
57
57
  async resetForReuse() {
58
58
  if (this._initScript) {
59
59
  import_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
60
- await this._context.removeInitScripts([this._initScript]);
60
+ await this._initScript.dispose();
61
61
  this._initScript = void 0;
62
62
  }
63
63
  }
@@ -69,7 +69,7 @@ class Snapshotter {
69
69
  ];
70
70
  const { javaScriptEnabled } = this._context._options;
71
71
  const initScriptSource = `(${import_snapshotterInjected.frameSnapshotStreamer})("${this._snapshotStreamer}", ${javaScriptEnabled || javaScriptEnabled === void 0})`;
72
- this._initScript = await this._context.addInitScript(void 0, initScriptSource);
72
+ this._initScript = await this._context.addInitScript(initScriptSource);
73
73
  await this._context.safeNonStallingEvaluateInAllFrames(initScriptSource, "main");
74
74
  }
75
75
  dispose() {
@@ -61,6 +61,7 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
61
61
  constructor() {
62
62
  this._lastSnapshotNumber = 0;
63
63
  this._staleStyleSheets = /* @__PURE__ */ new Set();
64
+ this._modifiedStyleSheets = /* @__PURE__ */ new Set();
64
65
  this._readingStyleSheet = false;
65
66
  const invalidateCSSGroupingRule = (rule) => {
66
67
  if (rule.parentStyleSheet)
@@ -76,6 +77,10 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
76
77
  this._interceptNativeMethod(window.CSSGroupingRule.prototype, "insertRule", invalidateCSSGroupingRule);
77
78
  this._interceptNativeMethod(window.CSSGroupingRule.prototype, "deleteRule", invalidateCSSGroupingRule);
78
79
  this._interceptNativeGetter(window.CSSGroupingRule.prototype, "cssRules", invalidateCSSGroupingRule);
80
+ this._interceptNativeSetter(window.StyleSheet.prototype, "disabled", (sheet) => {
81
+ if (sheet instanceof CSSStyleSheet)
82
+ this._invalidateStyleSheet(sheet);
83
+ });
79
84
  this._interceptNativeAsyncMethod(window.CSSStyleSheet.prototype, "replace", (sheet) => this._invalidateStyleSheet(sheet));
80
85
  this._fakeBase = document.createElement("base");
81
86
  this._observer = new MutationObserver((list) => this._handleMutations(list));
@@ -148,6 +153,17 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
148
153
  }
149
154
  });
150
155
  }
156
+ _interceptNativeSetter(obj, prop, cb) {
157
+ const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
158
+ Object.defineProperty(obj, prop, {
159
+ ...descriptor,
160
+ set: function(value) {
161
+ const result = descriptor.set.call(this, value);
162
+ cb(this, value);
163
+ return result;
164
+ }
165
+ });
166
+ }
151
167
  _handleMutations(list) {
152
168
  for (const mutation of list)
153
169
  ensureCachedData(mutation.target).attributesCached = void 0;
@@ -156,6 +172,8 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
156
172
  if (this._readingStyleSheet)
157
173
  return;
158
174
  this._staleStyleSheets.add(sheet);
175
+ if (sheet.href !== null)
176
+ this._modifiedStyleSheets.add(sheet);
159
177
  }
160
178
  _updateStyleElementStyleSheetTextIfNeeded(sheet, forceText) {
161
179
  const data = ensureCachedData(sheet);
@@ -248,6 +266,8 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
248
266
  _getSheetText(sheet) {
249
267
  this._readingStyleSheet = true;
250
268
  try {
269
+ if (sheet.disabled)
270
+ return "";
251
271
  const rules = [];
252
272
  for (const rule of sheet.cssRules)
253
273
  rules.push(rule.cssText);
@@ -518,7 +538,7 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
518
538
  wallTime: Date.now(),
519
539
  collectionTime: 0
520
540
  };
521
- for (const sheet of this._staleStyleSheets) {
541
+ for (const sheet of this._modifiedStyleSheets) {
522
542
  if (sheet.href === null)
523
543
  continue;
524
544
  const content = this._updateLinkStyleSheetTextIfNeeded(sheet, snapshotNumber);
@@ -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.setScreencastOptions(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}` : ``;
@@ -326,23 +325,33 @@ class Tracing extends import_instrumentation.SdkObject {
326
325
  return { artifact };
327
326
  }
328
327
  async _captureSnapshot(snapshotName, sdkObject, metadata) {
329
- if (!this._snapshotter)
330
- return;
331
- if (!sdkObject.attribution.page)
332
- return;
333
- if (!this._snapshotter.started())
334
- return;
335
- if (!shouldCaptureSnapshot(metadata))
328
+ if (!snapshotName || !sdkObject.attribution.page)
336
329
  return;
337
- await this._snapshotter.captureSnapshot(sdkObject.attribution.page, metadata.id, snapshotName).catch(() => {
330
+ await this._snapshotter?.captureSnapshot(sdkObject.attribution.page, metadata.id, snapshotName).catch(() => {
338
331
  });
339
332
  }
340
- onBeforeCall(sdkObject, metadata) {
341
- const event = createBeforeActionTraceEvent(metadata, this._currentGroupId());
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
+ }
347
+ }
348
+ onBeforeCall(sdkObject, metadata, parentId) {
349
+ const event = createBeforeActionTraceEvent(metadata, parentId ?? this._currentGroupId());
342
350
  if (!event)
343
351
  return Promise.resolve();
344
- sdkObject.attribution.page?.temporarilyDisableTracingScreencastThrottling();
345
- event.beforeSnapshot = `before@${metadata.id}`;
352
+ this._temporarilyDisableThrottling(sdkObject.attribution.page);
353
+ if (this._shouldCaptureSnapshot(sdkObject, metadata, "before"))
354
+ event.beforeSnapshot = `before@${metadata.id}`;
346
355
  this._state?.callIds.add(metadata.id);
347
356
  this._appendTraceEvent(event);
348
357
  return this._captureSnapshot(event.beforeSnapshot, sdkObject, metadata);
@@ -353,8 +362,9 @@ class Tracing extends import_instrumentation.SdkObject {
353
362
  const event = createInputActionTraceEvent(metadata);
354
363
  if (!event)
355
364
  return Promise.resolve();
356
- sdkObject.attribution.page?.temporarilyDisableTracingScreencastThrottling();
357
- event.inputSnapshot = `input@${metadata.id}`;
365
+ this._temporarilyDisableThrottling(sdkObject.attribution.page);
366
+ if (this._shouldCaptureSnapshot(sdkObject, metadata, "input"))
367
+ event.inputSnapshot = `input@${metadata.id}`;
358
368
  this._appendTraceEvent(event);
359
369
  return this._captureSnapshot(event.inputSnapshot, sdkObject, metadata);
360
370
  }
@@ -369,15 +379,16 @@ class Tracing extends import_instrumentation.SdkObject {
369
379
  if (event)
370
380
  this._appendTraceEvent(event);
371
381
  }
372
- async onAfterCall(sdkObject, metadata) {
382
+ onAfterCall(sdkObject, metadata) {
373
383
  if (!this._state?.callIds.has(metadata.id))
374
- return;
384
+ return Promise.resolve();
375
385
  this._state?.callIds.delete(metadata.id);
376
386
  const event = createAfterActionTraceEvent(metadata);
377
387
  if (!event)
378
- return;
379
- sdkObject.attribution.page?.temporarilyDisableTracingScreencastThrottling();
380
- event.afterSnapshot = `after@${metadata.id}`;
388
+ return Promise.resolve();
389
+ this._temporarilyDisableThrottling(sdkObject.attribution.page);
390
+ if (this._shouldCaptureSnapshot(sdkObject, metadata, "after"))
391
+ event.afterSnapshot = `after@${metadata.id}`;
381
392
  this._appendTraceEvent(event);
382
393
  return this._captureSnapshot(event.afterSnapshot, sdkObject, metadata);
383
394
  }
@@ -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.setScreencastOptions(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,10 +558,6 @@ 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
562
  if (metadata.internal || metadata.method.startsWith("tracing"))
554
563
  return null;
@@ -598,6 +607,48 @@ function createAfterActionTraceEvent(metadata) {
598
607
  point: metadata.point
599
608
  };
600
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
+ }
601
652
  // Annotate the CommonJS export names for ESM import in node:
602
653
  0 && (module.exports = {
603
654
  Tracing
@@ -47,20 +47,21 @@ var import_launchApp2 = require("../../launchApp");
47
47
  var import_playwright = require("../../playwright");
48
48
  var import_progress = require("../../progress");
49
49
  const tracesDirMarker = "traces.dir";
50
- function validateTraceUrl(traceUrl) {
51
- if (!traceUrl)
52
- return traceUrl;
53
- if (traceUrl.startsWith("http://") || traceUrl.startsWith("https://"))
54
- return traceUrl;
55
- if (traceUrl.endsWith(".json"))
56
- return traceUrl;
50
+ function validateTraceUrlOrPath(traceFileOrUrl) {
51
+ if (!traceFileOrUrl)
52
+ return traceFileOrUrl;
53
+ if (traceFileOrUrl.startsWith("http://") || traceFileOrUrl.startsWith("https://"))
54
+ return traceFileOrUrl;
55
+ let traceFile = traceFileOrUrl;
56
+ if (traceFile.endsWith(".json"))
57
+ return toFilePathUrl(traceFile);
57
58
  try {
58
- const stat = import_fs.default.statSync(traceUrl);
59
+ const stat = import_fs.default.statSync(traceFile);
59
60
  if (stat.isDirectory())
60
- return import_path.default.join(traceUrl, tracesDirMarker);
61
- return traceUrl;
61
+ traceFile = import_path.default.join(traceFile, tracesDirMarker);
62
+ return toFilePathUrl(traceFile);
62
63
  } catch {
63
- throw new Error(`Trace file ${traceUrl} does not exist!`);
64
+ throw new Error(`Trace file ${traceFileOrUrl} does not exist!`);
64
65
  }
65
66
  }
66
67
  async function startTraceViewerServer(options) {
@@ -90,7 +91,7 @@ async function startTraceViewerServer(options) {
90
91
  });
91
92
  const transport = options?.transport || (options?.isServer ? new StdinServer() : void 0);
92
93
  if (transport)
93
- server.createWebSocket(transport);
94
+ server.createWebSocket(() => transport);
94
95
  const { host, port } = options || {};
95
96
  await server.start({ preferredPort: port, host });
96
97
  return server;
@@ -125,17 +126,16 @@ async function installRootRedirect(server, traceUrl, options) {
125
126
  return true;
126
127
  });
127
128
  }
128
- async function runTraceViewerApp(traceUrl, browserName, options, exitOnClose) {
129
- traceUrl = validateTraceUrl(traceUrl);
129
+ async function runTraceViewerApp(traceUrl, browserName, options) {
130
+ traceUrl = validateTraceUrlOrPath(traceUrl);
130
131
  const server = await startTraceViewerServer(options);
131
132
  await installRootRedirect(server, traceUrl, options);
132
133
  const page = await openTraceViewerApp(server.urlPrefix("precise"), browserName, options);
133
- if (exitOnClose)
134
- page.on("close", () => (0, import_utils.gracefullyProcessExitDoNotHang)(0));
134
+ page.on("close", () => (0, import_utils.gracefullyProcessExitDoNotHang)(0));
135
135
  return page;
136
136
  }
137
137
  async function runTraceInBrowser(traceUrl, options) {
138
- traceUrl = validateTraceUrl(traceUrl);
138
+ traceUrl = validateTraceUrlOrPath(traceUrl);
139
139
  const server = await startTraceViewerServer(options);
140
140
  await installRootRedirect(server, traceUrl, options);
141
141
  await openTraceInBrowser(server.urlPrefix("human-readable"));
@@ -177,8 +177,8 @@ async function openTraceInBrowser(url) {
177
177
  class StdinServer {
178
178
  constructor() {
179
179
  process.stdin.on("data", (data) => {
180
- const url = data.toString().trim();
181
- if (url === this._traceUrl)
180
+ const url = validateTraceUrlOrPath(data.toString().trim());
181
+ if (!url || url === this._traceUrl)
182
182
  return;
183
183
  if (url.endsWith(".json"))
184
184
  this._pollLoadTrace(url);
@@ -221,15 +221,18 @@ function traceDescriptor(traceDir, tracePrefix) {
221
221
  };
222
222
  for (const name of import_fs.default.readdirSync(traceDir)) {
223
223
  if (!tracePrefix || name.startsWith(tracePrefix))
224
- result.entries.push({ name, path: import_path.default.join(traceDir, name) });
224
+ result.entries.push({ name, path: toFilePathUrl(import_path.default.join(traceDir, name)) });
225
225
  }
226
226
  const resourcesDir = import_path.default.join(traceDir, "resources");
227
227
  if (import_fs.default.existsSync(resourcesDir)) {
228
228
  for (const name of import_fs.default.readdirSync(resourcesDir))
229
- result.entries.push({ name: "resources/" + name, path: import_path.default.join(resourcesDir, name) });
229
+ result.entries.push({ name: "resources/" + name, path: toFilePathUrl(import_path.default.join(resourcesDir, name)) });
230
230
  }
231
231
  return result;
232
232
  }
233
+ function toFilePathUrl(filePath) {
234
+ return `file?path=${encodeURIComponent(filePath)}`;
235
+ }
233
236
  // Annotate the CommonJS export names for ESM import in node:
234
237
  0 && (module.exports = {
235
238
  installRootRedirect,
@@ -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)