patchright-core 1.57.0 → 1.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/ThirdPartyNotices.txt +2688 -297
  2. package/browsers.json +23 -22
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +48 -413
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -0
  10. package/lib/client/browser.js +11 -5
  11. package/lib/client/browserContext.js +20 -23
  12. package/lib/client/browserType.js +23 -54
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/clientHelper.js +2 -1
  16. package/lib/client/clock.js +0 -1
  17. package/lib/client/{webSocket.js → connect.js} +57 -7
  18. package/lib/client/connection.js +8 -0
  19. package/lib/client/consoleMessage.js +3 -0
  20. package/lib/client/debugger.js +57 -0
  21. package/lib/client/dialog.js +8 -1
  22. package/lib/client/disposable.js +76 -0
  23. package/lib/client/electron.js +1 -0
  24. package/lib/client/elementHandle.js +1 -1
  25. package/lib/client/events.js +3 -0
  26. package/lib/client/fetch.js +2 -4
  27. package/lib/client/frame.js +9 -13
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -36
  31. package/lib/client/network.js +14 -11
  32. package/lib/client/page.js +44 -50
  33. package/lib/client/screencast.js +88 -0
  34. package/lib/client/selectors.js +3 -1
  35. package/lib/client/tracing.js +11 -5
  36. package/lib/client/video.js +13 -20
  37. package/lib/client/worker.js +6 -6
  38. package/lib/generated/bindingsControllerSource.js +1 -1
  39. package/lib/generated/clockSource.js +1 -1
  40. package/lib/generated/injectedScriptSource.js +1 -1
  41. package/lib/generated/pollingRecorderSource.js +1 -1
  42. package/lib/generated/storageScriptSource.js +1 -1
  43. package/lib/generated/utilityScriptSource.js +1 -1
  44. package/lib/mcpBundle.js +78 -0
  45. package/lib/mcpBundleImpl.js +91 -0
  46. package/lib/protocol/serializers.js +5 -0
  47. package/lib/protocol/validator.js +228 -58
  48. package/lib/protocol/validatorPrimitives.js +1 -1
  49. package/lib/remote/playwrightConnection.js +10 -8
  50. package/lib/remote/playwrightPipeServer.js +100 -0
  51. package/lib/remote/playwrightServer.js +14 -10
  52. package/lib/remote/playwrightWebSocketServer.js +73 -0
  53. package/lib/remote/serverTransport.js +96 -0
  54. package/lib/server/android/android.js +2 -2
  55. package/lib/server/artifact.js +1 -1
  56. package/lib/server/bidi/bidiBrowser.js +80 -14
  57. package/lib/server/bidi/bidiChromium.js +23 -14
  58. package/lib/server/bidi/bidiConnection.js +1 -0
  59. package/lib/server/bidi/bidiDeserializer.js +116 -0
  60. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  61. package/lib/server/bidi/bidiFirefox.js +6 -8
  62. package/lib/server/bidi/bidiNetworkManager.js +40 -12
  63. package/lib/server/bidi/bidiPage.js +67 -40
  64. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  65. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  66. package/lib/server/browser.js +84 -21
  67. package/lib/server/browserContext.js +137 -77
  68. package/lib/server/browserType.js +26 -16
  69. package/lib/server/chromium/chromium.js +28 -31
  70. package/lib/server/chromium/chromiumSwitches.js +16 -4
  71. package/lib/server/chromium/crBrowser.js +40 -27
  72. package/lib/server/chromium/crConnection.js +0 -5
  73. package/lib/server/chromium/crDevTools.js +1 -2
  74. package/lib/server/chromium/crNetworkManager.js +54 -229
  75. package/lib/server/chromium/crPage.js +74 -260
  76. package/lib/server/chromium/crServiceWorker.js +7 -14
  77. package/lib/server/clock.js +33 -41
  78. package/lib/server/codegen/javascript.js +6 -29
  79. package/lib/server/console.js +5 -1
  80. package/lib/server/debugController.js +12 -6
  81. package/lib/server/debugger.js +40 -47
  82. package/lib/server/deviceDescriptorsSource.json +137 -137
  83. package/lib/server/dispatchers/browserContextDispatcher.js +30 -30
  84. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  85. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  86. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  87. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  88. package/lib/server/dispatchers/dispatcher.js +7 -14
  89. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  90. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  91. package/lib/server/dispatchers/frameDispatcher.js +7 -7
  92. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  93. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  94. package/lib/server/dispatchers/pageDispatcher.js +101 -34
  95. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  96. package/lib/server/disposable.js +41 -0
  97. package/lib/server/dom.js +56 -29
  98. package/lib/server/download.js +3 -2
  99. package/lib/server/electron/electron.js +17 -9
  100. package/lib/server/firefox/ffBrowser.js +9 -29
  101. package/lib/server/firefox/ffConnection.js +0 -5
  102. package/lib/server/firefox/ffInput.js +21 -5
  103. package/lib/server/firefox/ffNetworkManager.js +4 -4
  104. package/lib/server/firefox/ffPage.js +27 -33
  105. package/lib/server/firefox/firefox.js +6 -8
  106. package/lib/server/frameSelectors.js +14 -169
  107. package/lib/server/frames.js +263 -551
  108. package/lib/server/har/harRecorder.js +2 -2
  109. package/lib/server/har/harTracer.js +5 -4
  110. package/lib/server/input.js +49 -4
  111. package/lib/server/instrumentation.js +8 -0
  112. package/lib/server/javascript.js +6 -22
  113. package/lib/server/launchApp.js +0 -1
  114. package/lib/server/localUtils.js +6 -6
  115. package/lib/server/network.js +59 -20
  116. package/lib/server/overlay.js +138 -0
  117. package/lib/server/page.js +179 -157
  118. package/lib/server/progress.js +32 -6
  119. package/lib/server/recorder/recorderApp.js +84 -104
  120. package/lib/server/recorder.js +76 -40
  121. package/lib/server/registry/browserFetcher.js +6 -4
  122. package/lib/server/registry/index.js +222 -226
  123. package/lib/server/registry/nativeDeps.js +1 -0
  124. package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
  125. package/lib/server/screencast.js +137 -0
  126. package/lib/server/trace/recorder/snapshotter.js +2 -2
  127. package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
  128. package/lib/server/trace/recorder/tracing.js +98 -47
  129. package/lib/server/trace/viewer/traceViewer.js +24 -21
  130. package/lib/server/usKeyboardLayout.js +7 -0
  131. package/lib/server/utils/comparators.js +1 -1
  132. package/lib/server/utils/disposable.js +32 -0
  133. package/lib/server/utils/eventsHelper.js +3 -1
  134. package/lib/server/utils/expectUtils.js +87 -2
  135. package/lib/server/utils/fileUtils.js +16 -2
  136. package/lib/server/utils/happyEyeballs.js +15 -12
  137. package/lib/server/utils/httpServer.js +10 -23
  138. package/lib/server/utils/network.js +39 -29
  139. package/lib/server/utils/processLauncher.js +8 -6
  140. package/lib/server/utils/zipFile.js +2 -2
  141. package/lib/server/videoRecorder.js +194 -0
  142. package/lib/server/webkit/webkit.js +4 -6
  143. package/lib/server/webkit/wkBrowser.js +1 -10
  144. package/lib/server/webkit/wkConnection.js +1 -6
  145. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  146. package/lib/server/webkit/wkPage.js +88 -57
  147. package/lib/server/webkit/wkWorkers.js +2 -1
  148. package/lib/serverRegistry.js +156 -0
  149. package/lib/tools/backend/browserBackend.js +79 -0
  150. package/lib/tools/backend/common.js +63 -0
  151. package/lib/tools/backend/config.js +41 -0
  152. package/lib/tools/backend/console.js +66 -0
  153. package/lib/tools/backend/context.js +296 -0
  154. package/lib/tools/backend/cookies.js +152 -0
  155. package/lib/tools/backend/devtools.js +69 -0
  156. package/lib/tools/backend/dialogs.js +59 -0
  157. package/lib/tools/backend/evaluate.js +64 -0
  158. package/lib/tools/backend/files.js +60 -0
  159. package/lib/tools/backend/form.js +64 -0
  160. package/lib/tools/backend/keyboard.js +155 -0
  161. package/lib/tools/backend/logFile.js +95 -0
  162. package/lib/tools/backend/mouse.js +168 -0
  163. package/lib/tools/backend/navigate.js +106 -0
  164. package/lib/tools/backend/network.js +135 -0
  165. package/lib/tools/backend/pdf.js +48 -0
  166. package/lib/tools/backend/response.js +305 -0
  167. package/lib/tools/backend/route.js +140 -0
  168. package/lib/tools/backend/runCode.js +77 -0
  169. package/lib/tools/backend/screenshot.js +88 -0
  170. package/lib/tools/backend/sessionLog.js +74 -0
  171. package/lib/tools/backend/snapshot.js +208 -0
  172. package/lib/tools/backend/storage.js +68 -0
  173. package/lib/tools/backend/tab.js +445 -0
  174. package/lib/tools/backend/tabs.js +67 -0
  175. package/lib/tools/backend/tool.js +47 -0
  176. package/lib/tools/backend/tools.js +102 -0
  177. package/lib/tools/backend/tracing.js +78 -0
  178. package/lib/tools/backend/utils.js +83 -0
  179. package/lib/tools/backend/verify.js +151 -0
  180. package/lib/tools/backend/video.js +98 -0
  181. package/lib/tools/backend/wait.js +63 -0
  182. package/lib/tools/backend/webstorage.js +223 -0
  183. package/lib/tools/cli-client/cli.js +6 -0
  184. package/lib/tools/cli-client/help.json +399 -0
  185. package/lib/tools/cli-client/minimist.js +128 -0
  186. package/lib/tools/cli-client/program.js +350 -0
  187. package/lib/tools/cli-client/registry.js +176 -0
  188. package/lib/tools/cli-client/session.js +289 -0
  189. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  190. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  191. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  192. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  193. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  194. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  195. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  196. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  197. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  198. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  199. package/lib/tools/cli-daemon/command.js +73 -0
  200. package/lib/tools/cli-daemon/commands.js +956 -0
  201. package/lib/tools/cli-daemon/daemon.js +157 -0
  202. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  203. package/lib/tools/cli-daemon/program.js +129 -0
  204. package/lib/tools/dashboard/appIcon.png +0 -0
  205. package/lib/tools/dashboard/dashboardApp.js +284 -0
  206. package/lib/tools/dashboard/dashboardController.js +296 -0
  207. package/lib/tools/exports.js +60 -0
  208. package/lib/tools/mcp/browserFactory.js +233 -0
  209. package/lib/tools/mcp/cdpRelay.js +352 -0
  210. package/lib/tools/mcp/cli-stub.js +7 -0
  211. package/lib/tools/mcp/config.d.js +16 -0
  212. package/lib/tools/mcp/config.js +446 -0
  213. package/lib/tools/mcp/configIni.js +189 -0
  214. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  215. package/lib/tools/mcp/index.js +62 -0
  216. package/lib/tools/mcp/log.js +35 -0
  217. package/lib/tools/mcp/program.js +107 -0
  218. package/lib/tools/mcp/protocol.js +28 -0
  219. package/lib/tools/mcp/watchdog.js +44 -0
  220. package/lib/tools/trace/SKILL.md +171 -0
  221. package/lib/tools/trace/installSkill.js +48 -0
  222. package/lib/tools/trace/traceActions.js +142 -0
  223. package/lib/tools/trace/traceAttachments.js +69 -0
  224. package/lib/tools/trace/traceCli.js +87 -0
  225. package/lib/tools/trace/traceConsole.js +97 -0
  226. package/lib/tools/trace/traceErrors.js +55 -0
  227. package/lib/tools/trace/traceOpen.js +69 -0
  228. package/lib/tools/trace/traceParser.js +96 -0
  229. package/lib/tools/trace/traceRequests.js +182 -0
  230. package/lib/tools/trace/traceScreenshot.js +68 -0
  231. package/lib/tools/trace/traceSnapshot.js +149 -0
  232. package/lib/tools/trace/traceUtils.js +153 -0
  233. package/lib/tools/utils/connect.js +32 -0
  234. package/lib/tools/utils/mcp/http.js +152 -0
  235. package/lib/tools/utils/mcp/server.js +230 -0
  236. package/lib/tools/utils/mcp/tool.js +47 -0
  237. package/lib/tools/utils/socketConnection.js +108 -0
  238. package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
  239. package/lib/utils/isomorphic/formatUtils.js +64 -0
  240. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  241. package/lib/utils/isomorphic/lruCache.js +51 -0
  242. package/lib/utils/isomorphic/mimeType.js +7 -2
  243. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  244. package/lib/utils/isomorphic/protocolMetainfo.js +127 -98
  245. package/lib/utils/isomorphic/stringUtils.js +49 -0
  246. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  247. package/lib/utils/isomorphic/trace/entries.js +16 -0
  248. package/lib/utils/isomorphic/trace/snapshotRenderer.js +492 -0
  249. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  250. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  251. package/lib/utils/isomorphic/trace/traceLoader.js +132 -0
  252. package/lib/utils/isomorphic/trace/traceModel.js +366 -0
  253. package/lib/utils/isomorphic/trace/traceModernizer.js +401 -0
  254. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  255. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  256. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  257. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  258. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  259. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  260. package/lib/utils/isomorphic/urlMatch.js +54 -1
  261. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  262. package/lib/utils/isomorphic/yaml.js +84 -0
  263. package/lib/utils.js +8 -2
  264. package/lib/utilsBundle.js +5 -26
  265. package/lib/utilsBundleImpl/index.js +172 -173
  266. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  267. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  268. package/lib/vite/dashboard/index.html +28 -0
  269. package/lib/vite/htmlReport/index.html +2 -70
  270. package/lib/vite/htmlReport/report.css +1 -0
  271. package/lib/vite/htmlReport/report.js +72 -0
  272. package/lib/vite/recorder/assets/codeMirrorModule-C8KMvO9L.js +32 -0
  273. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  274. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  275. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  276. package/lib/vite/recorder/index.html +2 -2
  277. package/lib/vite/traceViewer/assets/codeMirrorModule-DS0FLvoc.js +32 -0
  278. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  279. package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
  280. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  281. package/lib/vite/traceViewer/index.CzXZzn5A.css +1 -0
  282. package/lib/vite/traceViewer/index.Dtstcb7U.js +2 -0
  283. package/lib/vite/traceViewer/index.html +4 -4
  284. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  285. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  286. package/lib/vite/traceViewer/uiMode.html +3 -3
  287. package/lib/zipBundleImpl.js +2 -2
  288. package/lib/zodBundle.js +39 -0
  289. package/lib/zodBundleImpl.js +40 -0
  290. package/package.json +7 -1
  291. package/types/protocol.d.ts +1696 -221
  292. package/types/types.d.ts +879 -112
  293. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
  294. package/lib/server/chromium/videoRecorder.js +0 -115
  295. package/lib/server/pageBinding.js +0 -87
  296. package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
  297. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  298. package/lib/vite/recorder/assets/codeMirrorModule-CBbSe-ZI.js +0 -25
  299. package/lib/vite/recorder/assets/index-CpZVd2nA.js +0 -193
  300. package/lib/vite/traceViewer/assets/codeMirrorModule-DHz0wP2C.js +0 -25
  301. package/lib/vite/traceViewer/assets/defaultSettingsView-WsZP88O6.js +0 -266
  302. package/lib/vite/traceViewer/defaultSettingsView.ConWv5KN.css +0 -1
  303. package/lib/vite/traceViewer/index.C4Y3Aw8n.css +0 -1
  304. package/lib/vite/traceViewer/index.C8xAeo93.js +0 -2
  305. package/lib/vite/traceViewer/uiMode.BltraIJB.js +0 -5
  306. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  307. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -38,6 +38,7 @@ var import_bidiBrowser = require("./bidiBrowser");
38
38
  var import_bidiConnection = require("./bidiConnection");
39
39
  var import_chromiumSwitches = require("../chromium/chromiumSwitches");
40
40
  var import_chromium = require("../chromium/chromium");
41
+ var import_crBrowser = require("../chromium/crBrowser");
41
42
  class BidiChromium extends import_browserType.BrowserType {
42
43
  constructor(parent) {
43
44
  super(parent, "chromium");
@@ -56,14 +57,12 @@ class BidiChromium extends import_browserType.BrowserType {
56
57
  throw e;
57
58
  }
58
59
  }
59
- doRewriteStartupLog(error) {
60
- if (!error.logs)
61
- return error;
62
- if (error.logs.includes("Missing X server"))
63
- error.logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
64
- if (!error.logs.includes("crbug.com/357670") && !error.logs.includes("No usable sandbox!") && !error.logs.includes("crbug.com/638180"))
65
- return error;
66
- error.logs = [
60
+ doRewriteStartupLog(logs) {
61
+ if (logs.includes("Missing X server"))
62
+ logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
63
+ if (!logs.includes("crbug.com/357670") && !logs.includes("No usable sandbox!") && !logs.includes("crbug.com/638180"))
64
+ return logs;
65
+ return [
67
66
  `Chromium sandboxing failed!`,
68
67
  `================================`,
69
68
  `To avoid the sandboxing issue, do either of the following:`,
@@ -72,7 +71,6 @@ class BidiChromium extends import_browserType.BrowserType {
72
71
  `================================`,
73
72
  ``
74
73
  ].join("\n");
75
- return error;
76
74
  }
77
75
  amendEnvironment(env) {
78
76
  return env;
@@ -112,8 +110,6 @@ class BidiChromium extends import_browserType.BrowserType {
112
110
  if (import_os.default.platform() === "darwin") {
113
111
  chromeArguments.push("--enable-unsafe-swiftshader");
114
112
  }
115
- if (options.devtools)
116
- chromeArguments.push("--auto-open-devtools-for-tabs");
117
113
  if (options.headless) {
118
114
  chromeArguments.push("--headless");
119
115
  chromeArguments.push(
@@ -133,11 +129,9 @@ class BidiChromium extends import_browserType.BrowserType {
133
129
  }
134
130
  chromeArguments.push(`--proxy-server=${proxy.server}`);
135
131
  const proxyBypassRules = [];
136
- if (options.socksProxyPort)
137
- proxyBypassRules.push("<-loopback>");
138
132
  if (proxy.bypass)
139
133
  proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t));
140
- if (!process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes("<-loopback>"))
134
+ if (options.socksProxyPort || (0, import_crBrowser.shouldProxyLoopback)(proxy.bypass))
141
135
  proxyBypassRules.push("<-loopback>");
142
136
  if (proxyBypassRules.length > 0)
143
137
  chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`);
@@ -145,6 +139,21 @@ class BidiChromium extends import_browserType.BrowserType {
145
139
  chromeArguments.push(...args);
146
140
  return chromeArguments;
147
141
  }
142
+ getExecutableName(options) {
143
+ switch (options.channel) {
144
+ case "bidi-chromium":
145
+ return "chromium";
146
+ case "bidi-chrome":
147
+ return "chrome";
148
+ case "bidi-chrome-beta":
149
+ return "chrome-beta";
150
+ case "bidi-chrome-dev":
151
+ return "chrome-dev";
152
+ case "bidi-chrome-canary":
153
+ return "chrome-canary";
154
+ }
155
+ throw new Error(`Unsupported Bidi Chromium channel: ${options.channel}`);
156
+ }
148
157
  }
149
158
  const kBidiOverCdpWrapper = Symbol("kBidiConnectionWrapper");
150
159
  // Annotate the CommonJS export names for ESM import in node:
@@ -173,6 +173,7 @@ class BidiSession extends import_events.EventEmitter {
173
173
  this._browsingContexts.clear();
174
174
  for (const callback of this._callbacks.values()) {
175
175
  callback.error.type = this._crashed ? "crashed" : "closed";
176
+ callback.error.setMessage(`Internal server error, session ${callback.error.type}.`);
176
177
  callback.error.logs = this.connection._browserDisconnectedLogs;
177
178
  callback.reject(callback.error);
178
179
  }
@@ -0,0 +1,116 @@
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 bidiDeserializer_exports = {};
20
+ __export(bidiDeserializer_exports, {
21
+ deserializeBidiValue: () => deserializeBidiValue
22
+ });
23
+ module.exports = __toCommonJS(bidiDeserializer_exports);
24
+ var import_javascript = require("../javascript");
25
+ function deserializeBidiValue(result, internalIdMap = /* @__PURE__ */ new Map()) {
26
+ switch (result.type) {
27
+ case "undefined":
28
+ return void 0;
29
+ case "null":
30
+ return null;
31
+ case "number":
32
+ return typeof result.value === "number" ? result.value : (0, import_javascript.parseUnserializableValue)(result.value);
33
+ case "boolean":
34
+ return Boolean(result.value);
35
+ case "string":
36
+ return result.value;
37
+ case "bigint":
38
+ return BigInt(result.value);
39
+ case "array":
40
+ return deserializeBidiList(result, internalIdMap);
41
+ case "arraybuffer":
42
+ return getValue(result, internalIdMap, () => ({}));
43
+ case "date":
44
+ return getValue(result, internalIdMap, () => new Date(result.value));
45
+ case "error":
46
+ return getValue(result, internalIdMap, () => {
47
+ const error = new Error();
48
+ error.stack = "";
49
+ return error;
50
+ });
51
+ case "function":
52
+ return void 0;
53
+ case "generator":
54
+ return getValue(result, internalIdMap, () => ({}));
55
+ case "htmlcollection":
56
+ return { ...deserializeBidiList(result, internalIdMap) };
57
+ case "map":
58
+ return getValue(result, internalIdMap, () => ({}));
59
+ case "node":
60
+ return "ref: <Node>";
61
+ case "nodelist":
62
+ return { ...deserializeBidiList(result, internalIdMap) };
63
+ case "object":
64
+ return deserializeBidiMapping(result, internalIdMap);
65
+ case "promise":
66
+ return getValue(result, internalIdMap, () => ({}));
67
+ case "proxy":
68
+ return getValue(result, internalIdMap, () => ({}));
69
+ case "regexp":
70
+ return getValue(result, internalIdMap, () => new RegExp(result.value.pattern, result.value.flags));
71
+ case "set":
72
+ return getValue(result, internalIdMap, () => ({}));
73
+ case "symbol":
74
+ return void 0;
75
+ case "typedarray":
76
+ return void 0;
77
+ case "weakmap":
78
+ return getValue(result, internalIdMap, () => ({}));
79
+ case "weakset":
80
+ return getValue(result, internalIdMap, () => ({}));
81
+ case "window":
82
+ return "ref: <Window>";
83
+ }
84
+ }
85
+ function getValue(bidiValue, internalIdMap, defaultValue) {
86
+ if ("internalId" in bidiValue && bidiValue.internalId) {
87
+ if (internalIdMap.has(bidiValue.internalId)) {
88
+ return internalIdMap.get(bidiValue.internalId);
89
+ } else {
90
+ const value = defaultValue();
91
+ internalIdMap.set(bidiValue.internalId, value);
92
+ return value;
93
+ }
94
+ } else {
95
+ return defaultValue();
96
+ }
97
+ }
98
+ function deserializeBidiList(bidiValue, internalIdMap) {
99
+ const result = getValue(bidiValue, internalIdMap, () => []);
100
+ for (const val of bidiValue.value || [])
101
+ result.push(deserializeBidiValue(val, internalIdMap));
102
+ return result;
103
+ }
104
+ function deserializeBidiMapping(bidiValue, internalIdMap) {
105
+ const result = getValue(bidiValue, internalIdMap, () => ({}));
106
+ for (const [serializedKey, serializedValue] of bidiValue.value || []) {
107
+ const key = typeof serializedKey === "string" ? serializedKey : deserializeBidiValue(serializedKey, internalIdMap);
108
+ const value = deserializeBidiValue(serializedValue, internalIdMap);
109
+ result[key] = value;
110
+ }
111
+ return result;
112
+ }
113
+ // Annotate the CommonJS export names for ESM import in node:
114
+ 0 && (module.exports = {
115
+ deserializeBidiValue
116
+ });
@@ -36,9 +36,9 @@ var import_utils = require("../../utils");
36
36
  var import_utilityScriptSerializers = require("../../utils/isomorphic/utilityScriptSerializers");
37
37
  var js = __toESM(require("../javascript"));
38
38
  var dom = __toESM(require("../dom"));
39
- var import_bidiDeserializer = require("./third_party/bidiDeserializer");
40
39
  var bidi = __toESM(require("./third_party/bidiProtocol"));
41
40
  var import_bidiSerializer = require("./third_party/bidiSerializer");
41
+ var import_bidiDeserializer = require("./bidiDeserializer");
42
42
  class BidiExecutionContext {
43
43
  constructor(session, realmInfo) {
44
44
  this._session = session;
@@ -65,7 +65,7 @@ class BidiExecutionContext {
65
65
  userActivation: true
66
66
  });
67
67
  if (response.type === "success")
68
- return import_bidiDeserializer.BidiDeserializer.deserialize(response.result);
68
+ return (0, import_bidiDeserializer.deserializeBidiValue)(response.result);
69
69
  if (response.type === "exception")
70
70
  throw new js.JavaScriptErrorInEvaluate(response.exceptionDetails.text);
71
71
  throw new js.JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response));
@@ -108,7 +108,7 @@ class BidiExecutionContext {
108
108
  throw new js.JavaScriptErrorInEvaluate(response.exceptionDetails.text);
109
109
  if (response.type === "success") {
110
110
  if (returnByValue)
111
- return (0, import_utilityScriptSerializers.parseEvaluationResultValue)(import_bidiDeserializer.BidiDeserializer.deserialize(response.result));
111
+ return (0, import_utilityScriptSerializers.parseEvaluationResultValue)((0, import_bidiDeserializer.deserializeBidiValue)(response.result));
112
112
  return createHandle(utilityScript._context, response.result);
113
113
  }
114
114
  throw new js.JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response));
@@ -123,7 +123,10 @@ class BidiExecutionContext {
123
123
  }
124
124
  return names2;
125
125
  });
126
- const values = await Promise.all(names.map((name) => handle.evaluateHandle((object, name2) => object[name2], name)));
126
+ const values = await Promise.all(names.map(async (name) => {
127
+ const value = await this._rawCallFunction("(object, name) => object[name]", [{ handle: handle._objectId }, { type: "string", value: name }], true, false);
128
+ return createHandle(handle._context, value);
129
+ }));
127
130
  const map = /* @__PURE__ */ new Map();
128
131
  for (let i = 0; i < names.length; i++)
129
132
  map.set(names[i], values[i]);
@@ -152,7 +155,7 @@ class BidiExecutionContext {
152
155
  return createHandle(context, result);
153
156
  }
154
157
  async contentFrameIdForFrame(handle) {
155
- const contentWindow = await this._rawCallFunction("e => e.contentWindow", { handle: handle._objectId });
158
+ const contentWindow = await this._rawCallFunction("e => e.contentWindow", [{ handle: handle._objectId }]);
156
159
  if (contentWindow?.type === "window")
157
160
  return contentWindow.value.context;
158
161
  return null;
@@ -166,17 +169,17 @@ class BidiExecutionContext {
166
169
  return null;
167
170
  }
168
171
  async _remoteValueForReference(reference, createHandle2) {
169
- return await this._rawCallFunction("e => e", reference, createHandle2);
172
+ return await this._rawCallFunction("e => e", [reference], createHandle2);
170
173
  }
171
- async _rawCallFunction(functionDeclaration, arg, createHandle2) {
174
+ async _rawCallFunction(functionDeclaration, args, createHandle2, awaitPromise = true) {
172
175
  const response = await this._session.send("script.callFunction", {
173
176
  functionDeclaration,
174
177
  target: this._target,
175
- arguments: [arg],
178
+ arguments: args,
176
179
  // "Root" is necessary for the handle to be returned.
177
180
  resultOwnership: createHandle2 ? bidi.Script.ResultOwnership.Root : bidi.Script.ResultOwnership.None,
178
181
  serializationOptions: { maxObjectDepth: 0, maxDomDepth: 0 },
179
- awaitPromise: true,
182
+ awaitPromise,
180
183
  userActivation: true
181
184
  });
182
185
  if (response.type === "exception")
@@ -186,25 +189,65 @@ class BidiExecutionContext {
186
189
  throw new js.JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response));
187
190
  }
188
191
  }
189
- function renderPreview(remoteObject) {
190
- if (remoteObject.type === "undefined")
191
- return "undefined";
192
- if (remoteObject.type === "null")
193
- return "null";
194
- if ("value" in remoteObject)
195
- return String(remoteObject.value);
196
- return `<${remoteObject.type}>`;
197
- }
198
- function remoteObjectValue(remoteObject) {
199
- if (remoteObject.type === "undefined")
200
- return void 0;
201
- if (remoteObject.type === "null")
202
- return null;
203
- if (remoteObject.type === "number" && typeof remoteObject.value === "string")
204
- return js.parseUnserializableValue(remoteObject.value);
205
- if ("value" in remoteObject)
206
- return remoteObject.value;
207
- return void 0;
192
+ function renderPreview(remoteObject, nested = false) {
193
+ switch (remoteObject.type) {
194
+ case "undefined":
195
+ case "null":
196
+ return remoteObject.type;
197
+ case "number":
198
+ case "boolean":
199
+ case "string":
200
+ return String(remoteObject.value);
201
+ case "bigint":
202
+ return `${remoteObject.value}n`;
203
+ case "date":
204
+ return String(new Date(remoteObject.value));
205
+ case "regexp":
206
+ return String(new RegExp(remoteObject.value.pattern, remoteObject.value.flags));
207
+ case "node":
208
+ return remoteObject.value?.localName || "Node";
209
+ case "object":
210
+ if (nested)
211
+ return "Object";
212
+ const tokens = [];
213
+ for (const [name, value] of remoteObject.value || []) {
214
+ if (typeof name === "string")
215
+ tokens.push(`${name}: ${renderPreview(value, true)}`);
216
+ }
217
+ return `{${tokens.join(", ")}}`;
218
+ case "array":
219
+ case "htmlcollection":
220
+ case "nodelist":
221
+ if (nested || !remoteObject.value)
222
+ return remoteObject.value ? `Array(${remoteObject.value.length})` : "Array";
223
+ return `[${remoteObject.value.map((v) => renderPreview(v, true)).join(", ")}]`;
224
+ case "map":
225
+ return remoteObject.value ? `Map(${remoteObject.value.length})` : "Map";
226
+ case "set":
227
+ return remoteObject.value ? `Set(${remoteObject.value.length})` : "Set";
228
+ case "arraybuffer":
229
+ return "ArrayBuffer";
230
+ case "error":
231
+ return "Error";
232
+ case "function":
233
+ return "Function";
234
+ case "generator":
235
+ return "Generator";
236
+ case "promise":
237
+ return "Promise";
238
+ case "proxy":
239
+ return "Proxy";
240
+ case "symbol":
241
+ return "Symbol()";
242
+ case "typedarray":
243
+ return "TypedArray";
244
+ case "weakmap":
245
+ return "WeakMap";
246
+ case "weakset":
247
+ return "WeakSet";
248
+ case "window":
249
+ return "Window";
250
+ }
208
251
  }
209
252
  function createHandle(context, remoteObject) {
210
253
  if (remoteObject.type === "node") {
@@ -212,7 +255,10 @@ function createHandle(context, remoteObject) {
212
255
  return new dom.ElementHandle(context, remoteObject.handle);
213
256
  }
214
257
  const objectId = "handle" in remoteObject ? remoteObject.handle : void 0;
215
- return new js.JSHandle(context, remoteObject.type, renderPreview(remoteObject), objectId, remoteObjectValue(remoteObject));
258
+ const preview = renderPreview(remoteObject);
259
+ const handle = new js.JSHandle(context, remoteObject.type, preview, objectId, (0, import_bidiDeserializer.deserializeBidiValue)(remoteObject));
260
+ handle._setPreview(preview);
261
+ return handle;
216
262
  }
217
263
  // Annotate the CommonJS export names for ESM import in node:
218
264
  0 && (module.exports = {
@@ -49,15 +49,13 @@ class BidiFirefox extends import_browserType.BrowserType {
49
49
  async connectToTransport(transport, options) {
50
50
  return import_bidiBrowser.BidiBrowser.connect(this.attribution.playwright, transport, options);
51
51
  }
52
- doRewriteStartupLog(error) {
53
- if (!error.logs)
54
- return error;
55
- if (error.logs.includes(`as root in a regular user's session is not supported.`))
56
- error.logs = "\n" + (0, import_ascii.wrapInASCIIBox)(`Firefox is unable to launch if the $HOME folder isn't owned by the current user.
52
+ doRewriteStartupLog(logs) {
53
+ if (logs.includes(`as root in a regular user's session is not supported.`))
54
+ logs = "\n" + (0, import_ascii.wrapInASCIIBox)(`Firefox is unable to launch if the $HOME folder isn't owned by the current user.
57
55
  Workaround: Set the HOME=/root environment variable${process.env.GITHUB_ACTION ? " in your GitHub Actions workflow file" : ""} when running Playwright.`, 1);
58
- if (error.logs.includes("no DISPLAY environment variable specified"))
59
- error.logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
60
- return error;
56
+ if (logs.includes("no DISPLAY environment variable specified"))
57
+ logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
58
+ return logs;
61
59
  }
62
60
  amendEnvironment(env) {
63
61
  if (!import_path.default.isAbsolute(import_os.default.homedir()))
@@ -36,6 +36,7 @@ var import_eventsHelper = require("../utils/eventsHelper");
36
36
  var import_cookieStore = require("../cookieStore");
37
37
  var network = __toESM(require("../network"));
38
38
  var bidi = __toESM(require("./third_party/bidiProtocol"));
39
+ const REQUEST_BODY_HEADERS = /* @__PURE__ */ new Set(["content-encoding", "content-language", "content-location", "content-type"]);
39
40
  class BidiNetworkManager {
40
41
  constructor(bidiSession, page) {
41
42
  this._userRequestInterceptionEnabled = false;
@@ -64,12 +65,38 @@ class BidiNetworkManager {
64
65
  return;
65
66
  if (redirectedFrom)
66
67
  this._deleteRequest(redirectedFrom._id);
68
+ if (param.request.method === "OPTIONS") {
69
+ const requestHeaders = Object.fromEntries(param.request.headers.map((h) => [h.name.toLowerCase(), bidiBytesValueToString(h.value)]));
70
+ if (param.initiator?.type === "preflight" || requestHeaders["access-control-request-method"]) {
71
+ if (param.intercepts) {
72
+ const responseHeaders = [
73
+ { name: "Access-Control-Allow-Origin", value: requestHeaders["origin"] || "*" },
74
+ { name: "Access-Control-Allow-Methods", value: requestHeaders["access-control-request-method"] },
75
+ { name: "Access-Control-Allow-Credentials", value: "true" }
76
+ ];
77
+ if (requestHeaders["access-control-request-headers"])
78
+ responseHeaders.push({ name: "Access-Control-Allow-Headers", value: requestHeaders["access-control-request-headers"] });
79
+ this._session.sendMayFail("network.provideResponse", {
80
+ request: param.request.request,
81
+ statusCode: 204,
82
+ headers: toBidiHeaders(responseHeaders)
83
+ });
84
+ }
85
+ return;
86
+ }
87
+ }
67
88
  let route;
89
+ let headersOverride;
68
90
  if (param.intercepts) {
69
91
  if (redirectedFrom) {
70
92
  let params = {};
71
- if (redirectedFrom._originalRequestRoute?._alreadyContinuedHeaders)
72
- params = toBidiRequestHeaders(redirectedFrom._originalRequestRoute._alreadyContinuedHeaders ?? []);
93
+ if (redirectedFrom._originalRequestRoute?._alreadyContinuedHeaders) {
94
+ const originalHeaders = fromBidiHeaders(param.request.headers);
95
+ headersOverride = network.applyHeadersOverrides(originalHeaders, redirectedFrom._originalRequestRoute._alreadyContinuedHeaders);
96
+ if (redirectedFrom.request.method() === "POST" && param.request.method === "GET")
97
+ headersOverride = headersOverride.filter(({ name }) => !REQUEST_BODY_HEADERS.has(name.toLowerCase()));
98
+ params = toBidiRequestHeaders(headersOverride);
99
+ }
73
100
  this._session.sendMayFail("network.continueRequest", {
74
101
  request: param.request.request,
75
102
  ...params
@@ -78,7 +105,7 @@ class BidiNetworkManager {
78
105
  route = new BidiRouteImpl(this._session, param.request.request);
79
106
  }
80
107
  }
81
- const request = new BidiRequest(frame, redirectedFrom, param, route);
108
+ const request = new BidiRequest(frame, redirectedFrom, param, route, headersOverride);
82
109
  this._requests.set(request._id, request);
83
110
  this._page.frameManager.requestStarted(request.request, route);
84
111
  }
@@ -111,6 +138,7 @@ class BidiNetworkManager {
111
138
  const response = new network.Response(request.request, params.response.status, params.response.statusText, fromBidiHeaders(params.response.headers), timing, getResponseBody, false);
112
139
  response._serverAddrFinished();
113
140
  response._securityDetailsFinished();
141
+ response._setHttpVersion(params.response.protocol);
114
142
  response.setRawResponseHeaders(null);
115
143
  response.setResponseHeadersSize(params.response.headersSize);
116
144
  this._page.frameManager.requestReceivedResponse(response);
@@ -130,7 +158,6 @@ class BidiNetworkManager {
130
158
  this._deleteRequest(request._id);
131
159
  response._requestFinished(responseEndTime);
132
160
  }
133
- response._setHttpVersion(params.response.protocol);
134
161
  this._page.frameManager.reportRequestFinished(request.request, response);
135
162
  }
136
163
  _onFetchError(params) {
@@ -194,13 +221,13 @@ class BidiNetworkManager {
194
221
  this._protocolRequestInterceptionEnabled = enabled;
195
222
  if (initial && !enabled)
196
223
  return;
197
- const cachePromise = this._session.send("network.setCacheBehavior", { cacheBehavior: enabled ? "bypass" : "default" });
224
+ const contexts = [this._page.delegate._session.sessionId];
225
+ const cachePromise = this._session.send("network.setCacheBehavior", { cacheBehavior: enabled ? "bypass" : "default", contexts });
198
226
  let interceptPromise = Promise.resolve(void 0);
199
227
  if (enabled) {
200
228
  interceptPromise = this._session.send("network.addIntercept", {
201
- phases: [bidi.Network.InterceptPhase.AuthRequired, bidi.Network.InterceptPhase.BeforeRequestSent],
202
- urlPatterns: [{ type: "pattern" }]
203
- // urlPatterns: [{ type: 'string', pattern: '*' }],
229
+ phases: [bidi.Network.InterceptPhase.BeforeRequestSent],
230
+ contexts
204
231
  }).then((r) => {
205
232
  this._intercepId = r.intercept;
206
233
  });
@@ -212,7 +239,7 @@ class BidiNetworkManager {
212
239
  }
213
240
  }
214
241
  class BidiRequest {
215
- constructor(frame, redirectedFrom, payload, route) {
242
+ constructor(frame, redirectedFrom, payload, route, headersOverride) {
216
243
  this._id = payload.request.request;
217
244
  if (redirectedFrom)
218
245
  redirectedFrom._redirectedTo = this;
@@ -227,7 +254,7 @@ class BidiRequest {
227
254
  resourceTypeFromBidi(payload.request.destination, payload.request.initiatorType, payload.initiator?.type),
228
255
  payload.request.method,
229
256
  postDataBuffer,
230
- fromBidiHeaders(payload.request.headers)
257
+ headersOverride || fromBidiHeaders(payload.request.headers)
231
258
  );
232
259
  this.request.setRawRequestHeaders(null);
233
260
  this.request._setBodySize(payload.request.bodySize || 0);
@@ -269,11 +296,12 @@ class BidiRouteImpl {
269
296
  }
270
297
  async fulfill(response) {
271
298
  const base64body = response.isBase64 ? response.body : Buffer.from(response.body).toString("base64");
299
+ const headers = response.headers.filter((h) => h.name.toLowerCase() !== "content-encoding");
272
300
  await this._session.sendMayFail("network.provideResponse", {
273
301
  request: this._requestId,
274
302
  statusCode: response.status,
275
303
  reasonPhrase: network.statusText(response.status),
276
- ...toBidiResponseHeaders(response.headers),
304
+ ...toBidiResponseHeaders(headers),
277
305
  body: { type: "base64", value: base64body }
278
306
  });
279
307
  }
@@ -342,7 +370,7 @@ function resourceTypeFromBidi(requestDestination, requestInitiatorType, eventIni
342
370
  case "image":
343
371
  return "image";
344
372
  case "object":
345
- return "object";
373
+ return "other";
346
374
  case "paintworklet":
347
375
  return "script";
348
376
  case "script":