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
@@ -51,12 +51,10 @@ class WebKit extends import_browserType.BrowserType {
51
51
  CURL_COOKIE_JAR_PATH: process.platform === "win32" && isPersistent ? import_path.default.join(userDataDir, "cookiejar.db") : void 0
52
52
  };
53
53
  }
54
- doRewriteStartupLog(error) {
55
- if (!error.logs)
56
- return error;
57
- if (error.logs.includes("Failed to open display") || error.logs.includes("cannot open display"))
58
- error.logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
59
- return error;
54
+ doRewriteStartupLog(logs) {
55
+ if (logs.includes("Failed to open display") || logs.includes("cannot open display"))
56
+ logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
57
+ return logs;
60
58
  }
61
59
  attemptToGracefullyCloseBrowser(transport) {
62
60
  transport.send({ method: "Playwright.close", params: {}, id: import_wkConnection.kBrowserCloseMessageId });
@@ -38,9 +38,8 @@ var import_browserContext = require("../browserContext");
38
38
  var network = __toESM(require("../network"));
39
39
  var import_wkConnection = require("./wkConnection");
40
40
  var import_wkPage = require("./wkPage");
41
- var import_errors = require("../errors");
42
41
  var import_webkit = require("./webkit");
43
- const BROWSER_VERSION = "26.0";
42
+ const BROWSER_VERSION = "26.4";
44
43
  const DEFAULT_USER_AGENT = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${BROWSER_VERSION} Safari/605.1.15`;
45
44
  class WKBrowser extends import_browser.Browser {
46
45
  constructor(parent, transport, options) {
@@ -56,7 +55,6 @@ class WKBrowser extends import_browser.Browser {
56
55
  this._browserSession.on("Playwright.downloadCreated", this._onDownloadCreated.bind(this));
57
56
  this._browserSession.on("Playwright.downloadFilenameSuggested", this._onDownloadFilenameSuggested.bind(this));
58
57
  this._browserSession.on("Playwright.downloadFinished", this._onDownloadFinished.bind(this));
59
- this._browserSession.on("Playwright.screencastFinished", this._onScreencastFinished.bind(this));
60
58
  this._browserSession.on(import_wkConnection.kPageProxyMessageReceived, this._onPageProxyMessageReceived.bind(this));
61
59
  }
62
60
  static async connect(parent, transport, options) {
@@ -78,9 +76,6 @@ class WKBrowser extends import_browser.Browser {
78
76
  for (const wkPage of this._wkPages.values())
79
77
  wkPage.didClose();
80
78
  this._wkPages.clear();
81
- for (const video of this._idToVideo.values())
82
- video.artifact.reportFinished(new import_errors.TargetClosedError());
83
- this._idToVideo.clear();
84
79
  this._didClose();
85
80
  }
86
81
  async doCreateNewContext(options) {
@@ -131,9 +126,6 @@ class WKBrowser extends import_browser.Browser {
131
126
  _onDownloadFinished(payload) {
132
127
  this._downloadFinished(payload.uuid, payload.error);
133
128
  }
134
- _onScreencastFinished(payload) {
135
- this._takeVideo(payload.screencastId)?.reportFinished();
136
- }
137
129
  _onPageProxyCreated(event) {
138
130
  const pageProxyId = event.pageProxyId;
139
131
  let context = null;
@@ -315,7 +307,6 @@ class WKBrowserContext extends import_browserContext.BrowserContext {
315
307
  }
316
308
  async doClose(reason) {
317
309
  if (!this._browserContextId) {
318
- await Promise.all(this._wkPages().map((wkPage) => wkPage._stopVideo()));
319
310
  await this._browser.close({ reason });
320
311
  } else {
321
312
  await this._browser._browserSession.send("Playwright.deleteContext", { browserContextId: this._browserContextId });
@@ -89,11 +89,6 @@ class WKSession extends import_events.EventEmitter {
89
89
  this.connection = connection;
90
90
  this.sessionId = sessionId;
91
91
  this._rawSend = rawSend;
92
- this.on = super.on;
93
- this.off = super.removeListener;
94
- this.addListener = super.addListener;
95
- this.removeListener = super.removeListener;
96
- this.once = super.once;
97
92
  }
98
93
  async send(method, params) {
99
94
  if (this._crashed || this._disposed || this.connection._browserDisconnectedLogs)
@@ -134,7 +129,7 @@ class WKSession extends import_events.EventEmitter {
134
129
  callback.resolve(object.result);
135
130
  }
136
131
  } else if (object.id && !object.error) {
137
- (0, import_utils.assert)(this.isDisposed());
132
+ (0, import_utils.assert)(this.isDisposed(), JSON.stringify(object));
138
133
  } else {
139
134
  Promise.resolve().then(() => this.emit(object.method, object.params));
140
135
  }
@@ -54,7 +54,7 @@ class WKInterceptableRequest {
54
54
  constructor(session, frame, event, redirectedFrom, documentId) {
55
55
  this._session = session;
56
56
  this._requestId = event.requestId;
57
- const resourceType = event.type ? event.type.toLowerCase() : redirectedFrom ? redirectedFrom.request.resourceType() : "other";
57
+ const resourceType = event.type ? toResourceType(event.type) : redirectedFrom ? redirectedFrom.request.resourceType() : "other";
58
58
  let postDataBuffer = null;
59
59
  this._timestamp = event.timestamp;
60
60
  this._wallTime = event.walltime * 1e3;
@@ -162,6 +162,34 @@ function wkMillisToRoundishMillis(value) {
162
162
  }
163
163
  return (value * 1e3 | 0) / 1e3;
164
164
  }
165
+ function toResourceType(type) {
166
+ switch (type) {
167
+ case "Document":
168
+ return "document";
169
+ case "StyleSheet":
170
+ return "stylesheet";
171
+ case "Image":
172
+ return "image";
173
+ case "Font":
174
+ return "font";
175
+ case "Script":
176
+ return "script";
177
+ case "XHR":
178
+ return "xhr";
179
+ case "Fetch":
180
+ return "fetch";
181
+ case "Ping":
182
+ return "ping";
183
+ case "Beacon":
184
+ return "beacon";
185
+ case "WebSocket":
186
+ return "websocket";
187
+ case "EventSource":
188
+ return "eventsource";
189
+ default:
190
+ return "other";
191
+ }
192
+ }
165
193
  // Annotate the CommonJS export names for ESM import in node:
166
194
  0 && (module.exports = {
167
195
  WKInterceptableRequest,
@@ -31,14 +31,13 @@ __export(wkPage_exports, {
31
31
  WKPage: () => WKPage
32
32
  });
33
33
  module.exports = __toCommonJS(wkPage_exports);
34
- var import_path = __toESM(require("path"));
35
34
  var import_utils = require("../../utils");
36
35
  var import_headers = require("../../utils/isomorphic/headers");
37
- var import_crypto = require("../utils/crypto");
38
36
  var import_eventsHelper = require("../utils/eventsHelper");
39
37
  var import_hostPlatform = require("../utils/hostPlatform");
40
38
  var import_stackTrace = require("../../utils/isomorphic/stackTrace");
41
39
  var import_utilsBundle = require("../../utilsBundle");
40
+ var import_browserContext = require("../browserContext");
42
41
  var dialog = __toESM(require("../dialog"));
43
42
  var dom = __toESM(require("../dom"));
44
43
  var import_errors = require("../errors");
@@ -51,12 +50,15 @@ var import_wkInput = require("./wkInput");
51
50
  var import_wkInterceptableRequest = require("./wkInterceptableRequest");
52
51
  var import_wkProvisionalPage = require("./wkProvisionalPage");
53
52
  var import_wkWorkers = require("./wkWorkers");
54
- var import_debugLogger = require("../utils/debugLogger");
55
53
  var import_webkit = require("./webkit");
54
+ var import_registry = require("../registry");
55
+ var import_videoRecorder = require("../videoRecorder");
56
56
  const UTILITY_WORLD_NAME = "__playwright_utility_world__";
57
+ const enableFrameSessions = !process.env.WK_DISABLE_FRAME_SESSIONS && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) >= 2245 && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) <= 2255;
57
58
  class WKPage {
58
59
  constructor(browserContext, pageProxySession, opener) {
59
60
  this._provisionalPage = null;
61
+ this._targetIdToFrameSession = /* @__PURE__ */ new Map();
60
62
  this._requestIdToRequest = /* @__PURE__ */ new Map();
61
63
  this._requestIdToRequestWillBeSentEvent = /* @__PURE__ */ new Map();
62
64
  this._sessionListeners = [];
@@ -66,7 +68,6 @@ class WKPage {
66
68
  };
67
69
  this._lastConsoleMessage = null;
68
70
  this._requestIdToResponseReceivedPayloadEvent = /* @__PURE__ */ new Map();
69
- this._recordingVideoFile = null;
70
71
  this._screencastGeneration = 0;
71
72
  this._pageProxySession = pageProxySession;
72
73
  this._opener = opener;
@@ -116,16 +117,7 @@ class WKPage {
116
117
  for (const [key, value] of this._browserContext._permissions)
117
118
  promises.push(this._grantPermissions(key, value));
118
119
  }
119
- if (this._browserContext._options.recordVideo) {
120
- const outputFile = import_path.default.join(this._browserContext._options.recordVideo.dir, (0, import_crypto.createGuid)() + ".webm");
121
- promises.push(this._browserContext._ensureVideosPath().then(() => {
122
- return this._startVideo({
123
- // validateBrowserContextOptions ensures correct video size.
124
- ...this._browserContext._options.recordVideo.size,
125
- outputFile
126
- });
127
- }));
128
- }
120
+ (0, import_videoRecorder.startAutomaticVideoRecording)(this._page);
129
121
  await Promise.all(promises);
130
122
  }
131
123
  _setSession(session) {
@@ -159,10 +151,13 @@ class WKPage {
159
151
  session.send("Page.createUserWorld", { name: UTILITY_WORLD_NAME }).catch((_) => {
160
152
  }),
161
153
  // Worlds are per-process
162
- session.send("Console.enable"),
163
154
  session.send("Network.enable"),
164
155
  this._workers.initializeSession(session)
165
156
  ];
157
+ if (enableFrameSessions)
158
+ this._initializeFrameSessions(frameTree.frameTree, promises);
159
+ else
160
+ promises.push(session.send("Console.enable"));
166
161
  if (this._page.browserContext.needsPlaywrightBinding())
167
162
  promises.push(session.send("Runtime.addBinding", { name: import_page.PageBinding.kBindingName }));
168
163
  if (this._page.needsRequestInterception()) {
@@ -219,6 +214,13 @@ class WKPage {
219
214
  promises.push(session.send("Page.overrideSetting", { setting: "FixedBackgroundsPaintRelativeToDocument", value: contextOptions.isMobile }));
220
215
  await Promise.all(promises);
221
216
  }
217
+ _initializeFrameSessions(frame, promises) {
218
+ const session = this._targetIdToFrameSession.get(`frame-${frame.frame.id}`);
219
+ if (session)
220
+ promises.push(session.initialize());
221
+ for (const childFrame of frame.childFrames || [])
222
+ this._initializeFrameSessions(childFrame, promises);
223
+ }
222
224
  _onDidCommitProvisionalTarget(event) {
223
225
  const { oldTargetId, newTargetId } = event;
224
226
  (0, import_utils.assert)(this._provisionalPage);
@@ -244,6 +246,9 @@ class WKPage {
244
246
  this._session.markAsCrashed();
245
247
  this._page._didCrash();
246
248
  }
249
+ } else if (this._targetIdToFrameSession.has(targetId)) {
250
+ this._targetIdToFrameSession.get(targetId).dispose();
251
+ this._targetIdToFrameSession.delete(targetId);
247
252
  }
248
253
  }
249
254
  didClose() {
@@ -257,7 +262,7 @@ class WKPage {
257
262
  this._provisionalPage.dispose();
258
263
  this._provisionalPage = null;
259
264
  }
260
- this._firstNonInitialNavigationCommittedReject(new import_errors.TargetClosedError());
265
+ this._firstNonInitialNavigationCommittedReject(new import_errors.TargetClosedError(this._page.closeReason()));
261
266
  this._page._didClose();
262
267
  }
263
268
  dispatchMessageToSession(message) {
@@ -288,8 +293,15 @@ class WKPage {
288
293
  session.dispatchMessage({ id: message.id, error: { message: e.message } });
289
294
  });
290
295
  });
291
- if (targetInfo.type === "frame")
296
+ if (targetInfo.type === "frame") {
297
+ if (enableFrameSessions) {
298
+ const wkFrame = new WKFrame(this, session);
299
+ this._targetIdToFrameSession.set(targetInfo.targetId, wkFrame);
300
+ await wkFrame.initialize().catch((e) => {
301
+ });
302
+ }
292
303
  return;
304
+ }
293
305
  (0, import_utils.assert)(targetInfo.type === "page", "Only page targets are expected in WebKit, received: " + targetInfo.type);
294
306
  if (!targetInfo.isProvisional) {
295
307
  (0, import_utils.assert)(!this._page.initializedOrUndefined());
@@ -331,6 +343,8 @@ class WKPage {
331
343
  this._provisionalPage._session.dispatchMessage(JSON.parse(message));
332
344
  else if (this._session.sessionId === targetId)
333
345
  this._session.dispatchMessage(JSON.parse(message));
346
+ else if (this._targetIdToFrameSession.has(targetId))
347
+ this._targetIdToFrameSession.get(targetId)._session.dispatchMessage(JSON.parse(message));
334
348
  else
335
349
  throw new Error("Unknown target: " + targetId);
336
350
  }
@@ -453,7 +467,7 @@ class WKPage {
453
467
  }
454
468
  async navigateFrame(frame, url, referrer) {
455
469
  if (this._pageProxySession.isDisposed())
456
- throw new import_errors.TargetClosedError();
470
+ throw new import_errors.TargetClosedError(this._page.closeReason());
457
471
  const pageProxyId = this._pageProxySession.sessionId;
458
472
  const result = await this._pageProxySession.connection.browserSession.send("Playwright.navigate", { url, pageProxyId, frameId: frame._id, referrer });
459
473
  return { newDocumentId: result.loaderId };
@@ -506,7 +520,7 @@ class WKPage {
506
520
  columnNumber: (columnNumber || 1) - 1
507
521
  }
508
522
  };
509
- this._onConsoleRepeatCountUpdated({ count: 1 });
523
+ this._onConsoleRepeatCountUpdated({ count: 1, timestamp: event.message.timestamp });
510
524
  }
511
525
  _onConsoleRepeatCountUpdated(event) {
512
526
  if (this._lastConsoleMessage) {
@@ -517,8 +531,9 @@ class WKPage {
517
531
  count,
518
532
  location
519
533
  } = this._lastConsoleMessage;
534
+ const timestamp = event.timestamp ? event.timestamp * 1e3 : Date.now();
520
535
  for (let i = count; i < event.count; ++i)
521
- this._page.addConsoleMessage(null, derivedType, handles, location, handles.length ? void 0 : text);
536
+ this._page.addConsoleMessage(null, derivedType, handles, location, handles.length ? void 0 : text, timestamp);
522
537
  this._lastConsoleMessage.count = event.count;
523
538
  }
524
539
  }
@@ -633,9 +648,11 @@ class WKPage {
633
648
  async updateUserAgent() {
634
649
  const contextOptions = this._browserContext._options;
635
650
  this._updateState("Page.overrideUserAgent", { value: contextOptions.userAgent });
651
+ const { navigatorPlatform } = (0, import_browserContext.calculateUserAgentEmulation)(contextOptions);
652
+ this._updateState("Page.overridePlatform", navigatorPlatform ? { value: navigatorPlatform } : {});
636
653
  }
637
654
  async bringToFront() {
638
- this._pageProxySession.send("Target.activate", {
655
+ await this._pageProxySession.send("Target.activate", {
639
656
  targetId: this._session.sessionId
640
657
  });
641
658
  }
@@ -748,7 +765,6 @@ class WKPage {
748
765
  await this._updateState("Page.setBootstrapScript", { source: this._calculateBootstrapScript() });
749
766
  }
750
767
  async closePage(runBeforeUnload) {
751
- await this._stopVideo();
752
768
  await this._pageProxySession.sendMayFail("Target.close", {
753
769
  targetId: this._session.sessionId,
754
770
  runBeforeUnload
@@ -762,23 +778,6 @@ class WKPage {
762
778
  return import_hostPlatform.hostPlatform === "mac10.15" ? 55 : 59;
763
779
  return 0;
764
780
  }
765
- async _startVideo(options) {
766
- (0, import_utils.assert)(!this._recordingVideoFile);
767
- const { screencastId } = await this._pageProxySession.send("Screencast.startVideo", {
768
- file: this._browserContext._browser.options.channel === "webkit-wsl" ? await (0, import_webkit.translatePathToWSL)(options.outputFile) : options.outputFile,
769
- width: options.width,
770
- height: options.height,
771
- toolbarHeight: this._toolbarHeight()
772
- });
773
- this._recordingVideoFile = options.outputFile;
774
- this._browserContext._browser._videoStarted(this._browserContext, screencastId, options.outputFile, this._page.waitForInitializedOrError());
775
- }
776
- async _stopVideo() {
777
- if (!this._recordingVideoFile)
778
- return;
779
- await this._pageProxySession.sendMayFail("Screencast.stopVideo");
780
- this._recordingVideoFile = null;
781
- }
782
781
  validateScreenshotDimension(side, omitDeviceScaleFactor) {
783
782
  if (process.platform === "darwin")
784
783
  return;
@@ -845,25 +844,28 @@ class WKPage {
845
844
  throw e;
846
845
  });
847
846
  }
848
- async setScreencastOptions(options) {
849
- if (options) {
850
- const so = { ...options, toolbarHeight: this._toolbarHeight() };
851
- const { generation } = await this._pageProxySession.send("Screencast.startScreencast", so);
852
- this._screencastGeneration = generation;
853
- } else {
854
- await this._pageProxySession.send("Screencast.stopScreencast");
855
- }
847
+ startScreencast(options) {
848
+ this._pageProxySession.send("Screencast.startScreencast", {
849
+ quality: options.quality,
850
+ width: options.width,
851
+ height: options.height,
852
+ toolbarHeight: this._toolbarHeight()
853
+ }).then(({ generation }) => this._screencastGeneration = generation).catch(() => {
854
+ });
855
+ }
856
+ stopScreencast() {
857
+ this._pageProxySession.sendMayFail("Screencast.stopScreencast");
856
858
  }
857
859
  _onScreencastFrame(event) {
858
860
  const generation = this._screencastGeneration;
859
- this._page.throttleScreencastFrameAck(() => {
860
- this._pageProxySession.send("Screencast.screencastFrameAck", { generation }).catch((e) => import_debugLogger.debugLogger.log("error", e));
861
- });
862
861
  const buffer = Buffer.from(event.data, "base64");
863
- this._page.emit(import_page.Page.Events.ScreencastFrame, {
862
+ this._page.screencast.onScreencastFrame({
864
863
  buffer,
865
- width: event.deviceWidth,
866
- height: event.deviceHeight
864
+ frameSwapWallTime: event.timestamp ? event.timestamp * 1e3 : Date.now(),
865
+ viewportWidth: event.deviceWidth,
866
+ viewportHeight: event.deviceHeight
867
+ }, () => {
868
+ this._pageProxySession.sendMayFail("Screencast.screencastFrameAck", { generation });
867
869
  });
868
870
  }
869
871
  rafCountForStablePosition() {
@@ -886,7 +888,7 @@ class WKPage {
886
888
  const pageProxyId = this._pageProxySession.sessionId;
887
889
  const objectId = handle._objectId;
888
890
  if (this._browserContext._browser?.options.channel === "webkit-wsl")
889
- paths = await Promise.all(paths.map((path2) => (0, import_webkit.translatePathToWSL)(path2)));
891
+ paths = await Promise.all(paths.map((path) => (0, import_webkit.translatePathToWSL)(path)));
890
892
  await Promise.all([
891
893
  this._pageProxySession.connection.browserSession.send("Playwright.grantFileReadAccess", { pageProxyId, paths }),
892
894
  this._session.send("DOM.setInputFiles", { objectId, paths })
@@ -977,6 +979,7 @@ class WKPage {
977
979
  }
978
980
  _handleRequestRedirect(request, requestId, responsePayload, timestamp) {
979
981
  const response = request.createResponse(responsePayload);
982
+ response._setHttpVersion(null);
980
983
  response._securityDetailsFinished();
981
984
  response._serverAddrFinished();
982
985
  response.setResponseHeadersSize(null);
@@ -1029,8 +1032,7 @@ class WKPage {
1029
1032
  validFrom: responseReceivedPayload?.response.security?.certificate?.validFrom,
1030
1033
  validTo: responseReceivedPayload?.response.security?.certificate?.validUntil
1031
1034
  });
1032
- if (event.metrics?.protocol)
1033
- response._setHttpVersion(event.metrics.protocol);
1035
+ response._setHttpVersion(event.metrics?.protocol ?? null);
1034
1036
  response.setEncodedBodySize(event.metrics?.responseBodyBytesReceived ?? null);
1035
1037
  response.setResponseHeadersSize(event.metrics?.responseHeaderBytesReceived ?? null);
1036
1038
  response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
@@ -1054,6 +1056,7 @@ class WKPage {
1054
1056
  if (response) {
1055
1057
  response._serverAddrFinished();
1056
1058
  response._securityDetailsFinished();
1059
+ response._setHttpVersion(null);
1057
1060
  response.setResponseHeadersSize(null);
1058
1061
  response.setEncodedBodySize(null);
1059
1062
  response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
@@ -1068,7 +1071,8 @@ class WKPage {
1068
1071
  const webPermissionToProtocol = /* @__PURE__ */ new Map([
1069
1072
  ["geolocation", "geolocation"],
1070
1073
  ["notifications", "notifications"],
1071
- ["clipboard-read", "clipboard-read"]
1074
+ ["clipboard-read", "clipboard-read"],
1075
+ ["screen-wake-lock", "screen-wake-lock"]
1072
1076
  ]);
1073
1077
  const filtered = permissions.map((permission) => {
1074
1078
  const protocolPermission = webPermissionToProtocol.get(permission);
@@ -1084,6 +1088,33 @@ class WKPage {
1084
1088
  shouldToggleStyleSheetToSyncAnimations() {
1085
1089
  return true;
1086
1090
  }
1091
+ async setDockTile(image) {
1092
+ }
1093
+ }
1094
+ class WKFrame {
1095
+ constructor(page, session) {
1096
+ this._sessionListeners = [];
1097
+ this._initializePromise = null;
1098
+ this._page = page;
1099
+ this._session = session;
1100
+ }
1101
+ async initialize() {
1102
+ if (this._initializePromise)
1103
+ return this._initializePromise;
1104
+ this._initializePromise = this._initializeImpl();
1105
+ return this._initializePromise;
1106
+ }
1107
+ async _initializeImpl() {
1108
+ this._sessionListeners = [
1109
+ import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageAdded", (event) => this._page._onConsoleMessage(event)),
1110
+ import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageRepeatCountUpdated", (event) => this._page._onConsoleRepeatCountUpdated(event))
1111
+ ];
1112
+ await this._session.send("Console.enable");
1113
+ }
1114
+ dispose() {
1115
+ import_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
1116
+ this._session.dispose();
1117
+ }
1087
1118
  }
1088
1119
  function parseRemoteAddress(value) {
1089
1120
  if (!value)
@@ -96,7 +96,8 @@ class WKWorkers {
96
96
  lineNumber: (lineNumber || 1) - 1,
97
97
  columnNumber: (columnNumber || 1) - 1
98
98
  };
99
- this._page.addConsoleMessage(worker, derivedType, handles, location, handles.length ? void 0 : text);
99
+ const timestamp = event.message.timestamp ? event.message.timestamp * 1e3 : Date.now();
100
+ this._page.addConsoleMessage(worker, derivedType, handles, location, handles.length ? void 0 : text, timestamp);
100
101
  }
101
102
  }
102
103
  // Annotate the CommonJS export names for ESM import in node:
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var serverRegistry_exports = {};
30
+ __export(serverRegistry_exports, {
31
+ serverRegistry: () => serverRegistry
32
+ });
33
+ module.exports = __toCommonJS(serverRegistry_exports);
34
+ var import_fs = __toESM(require("fs"));
35
+ var import_net = __toESM(require("net"));
36
+ var import_path = __toESM(require("path"));
37
+ var import_os = __toESM(require("os"));
38
+ const packageVersion = require("../package.json").version;
39
+ class ServerRegistry {
40
+ async list() {
41
+ const files = await import_fs.default.promises.readdir(this._browsersDir()).catch(() => []);
42
+ const result = /* @__PURE__ */ new Map();
43
+ for (const file of files) {
44
+ try {
45
+ const filePath = import_path.default.join(this._browsersDir(), file);
46
+ const content = await import_fs.default.promises.readFile(filePath, "utf-8");
47
+ const descriptor = JSON.parse(content);
48
+ const key = descriptor.workspaceDir ?? "";
49
+ let list = result.get(key);
50
+ if (!list) {
51
+ list = [];
52
+ result.set(key, list);
53
+ }
54
+ list.push(canConnect(descriptor).then((connectable) => ({ ...descriptor, canConnect: connectable, file: filePath })));
55
+ } catch {
56
+ }
57
+ }
58
+ const resolvedResult = /* @__PURE__ */ new Map();
59
+ for (const [key, promises] of result) {
60
+ const entries = await Promise.all(promises);
61
+ const descriptors = [];
62
+ for (const entry of entries) {
63
+ if (!entry.canConnect && !entry.browser.userDataDir) {
64
+ await import_fs.default.promises.unlink(entry.file).catch(() => {
65
+ });
66
+ continue;
67
+ }
68
+ descriptors.push(entry);
69
+ }
70
+ if (descriptors.length)
71
+ resolvedResult.set(key, descriptors);
72
+ }
73
+ return resolvedResult;
74
+ }
75
+ async create(browser, endpoint) {
76
+ const file = import_path.default.join(this._browsersDir(), browser.guid);
77
+ await import_fs.default.promises.mkdir(this._browsersDir(), { recursive: true });
78
+ const descriptor = {
79
+ playwrightVersion: packageVersion,
80
+ playwrightLib: require.resolve(".."),
81
+ title: endpoint.title,
82
+ browser,
83
+ endpoint: endpoint.endpoint,
84
+ workspaceDir: endpoint.workspaceDir
85
+ };
86
+ await import_fs.default.promises.writeFile(file, JSON.stringify(descriptor), "utf-8");
87
+ }
88
+ async delete(guid) {
89
+ const file = import_path.default.join(this._browsersDir(), guid);
90
+ await import_fs.default.promises.unlink(file).catch(() => {
91
+ });
92
+ }
93
+ async deleteUserData(guid) {
94
+ const filePath = import_path.default.join(this._browsersDir(), guid);
95
+ const content = await import_fs.default.promises.readFile(filePath, "utf-8");
96
+ const descriptor = JSON.parse(content);
97
+ if (descriptor.browser.userDataDir)
98
+ await import_fs.default.promises.rm(descriptor.browser.userDataDir, { recursive: true, force: true });
99
+ await import_fs.default.promises.unlink(filePath);
100
+ }
101
+ readDescriptor(guid) {
102
+ const filePath = import_path.default.join(this._browsersDir(), guid);
103
+ const content = import_fs.default.readFileSync(filePath, "utf-8");
104
+ const descriptor = JSON.parse(content);
105
+ return descriptor;
106
+ }
107
+ async find(name) {
108
+ const entries = await this.list();
109
+ for (const [, browsers] of entries) {
110
+ for (const browser of browsers) {
111
+ if (browser.title === name)
112
+ return browser;
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+ _browsersDir() {
118
+ return process.env.PLAYWRIGHT_SERVER_REGISTRY || registryDirectory;
119
+ }
120
+ }
121
+ async function canConnect(descriptor) {
122
+ if (!descriptor.endpoint)
123
+ return false;
124
+ if (descriptor.endpoint.startsWith("ws://") || descriptor.endpoint.startsWith("wss://")) {
125
+ return await new Promise((resolve) => {
126
+ const url = new URL(descriptor.endpoint);
127
+ const socket = import_net.default.createConnection(Number(url.port), url.hostname, () => {
128
+ socket.destroy();
129
+ resolve(true);
130
+ });
131
+ socket.on("error", () => resolve(false));
132
+ });
133
+ }
134
+ return await new Promise((resolve) => {
135
+ const socket = import_net.default.createConnection(descriptor.endpoint ?? descriptor.pipeName, () => {
136
+ socket.destroy();
137
+ resolve(true);
138
+ });
139
+ socket.on("error", () => resolve(false));
140
+ });
141
+ }
142
+ const defaultCacheDirectory = (() => {
143
+ if (process.platform === "linux")
144
+ return process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
145
+ if (process.platform === "darwin")
146
+ return import_path.default.join(import_os.default.homedir(), "Library", "Caches");
147
+ if (process.platform === "win32")
148
+ return process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
149
+ throw new Error("Unsupported platform: " + process.platform);
150
+ })();
151
+ const registryDirectory = import_path.default.join(defaultCacheDirectory, "ms-playwright", "b");
152
+ const serverRegistry = new ServerRegistry();
153
+ // Annotate the CommonJS export names for ESM import in node:
154
+ 0 && (module.exports = {
155
+ serverRegistry
156
+ });