patchright-core 1.58.2 → 1.59.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/ThirdPartyNotices.txt +126 -650
  2. package/browsers.json +16 -14
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +47 -411
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -3
  10. package/lib/client/browser.js +8 -0
  11. package/lib/client/browserContext.js +22 -61
  12. package/lib/client/browserType.js +19 -51
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/clientHelper.js +2 -1
  16. package/lib/client/clock.js +0 -1
  17. package/lib/client/{webSocket.js → connect.js} +57 -7
  18. package/lib/client/connection.js +8 -4
  19. package/lib/client/consoleMessage.js +3 -0
  20. package/lib/client/debugger.js +57 -0
  21. package/lib/client/dialog.js +8 -1
  22. package/lib/client/disposable.js +76 -0
  23. package/lib/client/electron.js +1 -0
  24. package/lib/client/elementHandle.js +1 -4
  25. package/lib/client/events.js +3 -3
  26. package/lib/client/fetch.js +0 -1
  27. package/lib/client/frame.js +10 -23
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -44
  31. package/lib/client/network.js +15 -16
  32. package/lib/client/page.js +41 -75
  33. package/lib/client/platform.js +0 -3
  34. package/lib/client/screencast.js +88 -0
  35. package/lib/client/selectors.js +3 -1
  36. package/lib/client/tracing.js +11 -5
  37. package/lib/client/video.js +13 -20
  38. package/lib/client/worker.js +6 -6
  39. package/lib/generated/bindingsControllerSource.js +1 -1
  40. package/lib/generated/clockSource.js +1 -1
  41. package/lib/generated/injectedScriptSource.js +1 -1
  42. package/lib/generated/pollingRecorderSource.js +1 -1
  43. package/lib/generated/storageScriptSource.js +1 -1
  44. package/lib/generated/utilityScriptSource.js +1 -1
  45. package/lib/mcpBundle.js +0 -6
  46. package/lib/mcpBundleImpl.js +91 -0
  47. package/lib/protocol/validator.js +224 -138
  48. package/lib/protocol/validatorPrimitives.js +1 -1
  49. package/lib/remote/playwrightConnection.js +10 -8
  50. package/lib/remote/playwrightPipeServer.js +100 -0
  51. package/lib/remote/playwrightServer.js +13 -8
  52. package/lib/remote/playwrightWebSocketServer.js +73 -0
  53. package/lib/remote/serverTransport.js +96 -0
  54. package/lib/server/android/android.js +2 -2
  55. package/lib/server/bidi/bidiBrowser.js +30 -8
  56. package/lib/server/bidi/bidiChromium.js +18 -5
  57. package/lib/server/bidi/bidiNetworkManager.js +39 -11
  58. package/lib/server/bidi/bidiPage.js +31 -15
  59. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  60. package/lib/server/browser.js +84 -21
  61. package/lib/server/browserContext.js +110 -58
  62. package/lib/server/browserType.js +14 -12
  63. package/lib/server/chromium/chromium.js +15 -12
  64. package/lib/server/chromium/chromiumSwitches.js +14 -2
  65. package/lib/server/chromium/crBrowser.js +20 -17
  66. package/lib/server/chromium/crCoverage.js +1 -13
  67. package/lib/server/chromium/crDevTools.js +1 -0
  68. package/lib/server/chromium/crNetworkManager.js +12 -267
  69. package/lib/server/chromium/crPage.js +67 -199
  70. package/lib/server/chromium/crServiceWorker.js +7 -14
  71. package/lib/server/clock.js +33 -41
  72. package/lib/server/console.js +5 -1
  73. package/lib/server/debugController.js +12 -6
  74. package/lib/server/debugger.js +40 -47
  75. package/lib/server/deviceDescriptorsSource.json +137 -137
  76. package/lib/server/dispatchers/browserContextDispatcher.js +29 -30
  77. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  78. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  79. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  80. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  81. package/lib/server/dispatchers/dispatcher.js +1 -1
  82. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  83. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  84. package/lib/server/dispatchers/frameDispatcher.js +6 -6
  85. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  86. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  87. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  88. package/lib/server/dispatchers/pageDispatcher.js +101 -38
  89. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  90. package/lib/server/disposable.js +41 -0
  91. package/lib/server/dom.js +44 -26
  92. package/lib/server/download.js +3 -2
  93. package/lib/server/electron/electron.js +12 -7
  94. package/lib/server/firefox/ffBrowser.js +9 -19
  95. package/lib/server/firefox/ffInput.js +21 -5
  96. package/lib/server/firefox/ffNetworkManager.js +2 -2
  97. package/lib/server/firefox/ffPage.js +24 -27
  98. package/lib/server/frameSelectors.js +5 -172
  99. package/lib/server/frames.js +234 -687
  100. package/lib/server/har/harRecorder.js +2 -2
  101. package/lib/server/har/harTracer.js +5 -4
  102. package/lib/server/input.js +49 -4
  103. package/lib/server/instrumentation.js +5 -0
  104. package/lib/server/javascript.js +6 -26
  105. package/lib/server/launchApp.js +1 -3
  106. package/lib/server/localUtils.js +6 -6
  107. package/lib/server/network.js +9 -8
  108. package/lib/server/overlay.js +138 -0
  109. package/lib/server/page.js +157 -105
  110. package/lib/server/progress.js +6 -0
  111. package/lib/server/recorder/recorderApp.js +9 -8
  112. package/lib/server/recorder.js +76 -40
  113. package/lib/server/registry/index.js +55 -82
  114. package/lib/server/registry/nativeDeps.js +1 -0
  115. package/lib/server/screencast.js +90 -143
  116. package/lib/server/screenshotter.js +0 -6
  117. package/lib/server/trace/recorder/snapshotter.js +8 -17
  118. package/lib/server/trace/recorder/snapshotterInjected.js +82 -20
  119. package/lib/server/trace/recorder/tracing.js +87 -44
  120. package/lib/server/trace/viewer/traceViewer.js +3 -4
  121. package/lib/server/usKeyboardLayout.js +7 -0
  122. package/lib/server/utils/comparators.js +1 -1
  123. package/lib/server/utils/disposable.js +32 -0
  124. package/lib/server/utils/eventsHelper.js +3 -1
  125. package/lib/server/utils/fileUtils.js +16 -2
  126. package/lib/server/utils/happyEyeballs.js +15 -12
  127. package/lib/server/utils/hostPlatform.js +0 -15
  128. package/lib/server/utils/httpServer.js +5 -3
  129. package/lib/server/utils/network.js +2 -1
  130. package/lib/server/utils/nodePlatform.js +0 -6
  131. package/lib/server/utils/processLauncher.js +6 -5
  132. package/lib/server/utils/zipFile.js +2 -2
  133. package/lib/server/videoRecorder.js +82 -12
  134. package/lib/server/webkit/wkBrowser.js +1 -6
  135. package/lib/server/webkit/wkPage.js +27 -25
  136. package/lib/server/webkit/wkWorkers.js +2 -1
  137. package/lib/serverRegistry.js +156 -0
  138. package/lib/tools/backend/browserBackend.js +79 -0
  139. package/lib/tools/backend/common.js +63 -0
  140. package/lib/tools/backend/config.js +41 -0
  141. package/lib/tools/backend/console.js +66 -0
  142. package/lib/tools/backend/context.js +296 -0
  143. package/lib/tools/backend/cookies.js +152 -0
  144. package/lib/tools/backend/devtools.js +69 -0
  145. package/lib/tools/backend/dialogs.js +59 -0
  146. package/lib/tools/backend/evaluate.js +64 -0
  147. package/lib/tools/backend/files.js +60 -0
  148. package/lib/tools/backend/form.js +64 -0
  149. package/lib/tools/backend/keyboard.js +155 -0
  150. package/lib/tools/backend/logFile.js +95 -0
  151. package/lib/tools/backend/mouse.js +168 -0
  152. package/lib/tools/backend/navigate.js +106 -0
  153. package/lib/tools/backend/network.js +135 -0
  154. package/lib/tools/backend/pdf.js +48 -0
  155. package/lib/tools/backend/response.js +305 -0
  156. package/lib/tools/backend/route.js +140 -0
  157. package/lib/tools/backend/runCode.js +77 -0
  158. package/lib/tools/backend/screenshot.js +88 -0
  159. package/lib/tools/backend/sessionLog.js +74 -0
  160. package/lib/tools/backend/snapshot.js +208 -0
  161. package/lib/tools/backend/storage.js +68 -0
  162. package/lib/tools/backend/tab.js +445 -0
  163. package/lib/tools/backend/tabs.js +67 -0
  164. package/lib/tools/backend/tool.js +47 -0
  165. package/lib/tools/backend/tools.js +102 -0
  166. package/lib/tools/backend/tracing.js +78 -0
  167. package/lib/tools/backend/utils.js +83 -0
  168. package/lib/tools/backend/verify.js +151 -0
  169. package/lib/tools/backend/video.js +98 -0
  170. package/lib/tools/backend/wait.js +63 -0
  171. package/lib/tools/backend/webstorage.js +223 -0
  172. package/lib/tools/cli-client/cli.js +6 -0
  173. package/lib/tools/cli-client/help.json +399 -0
  174. package/lib/tools/cli-client/minimist.js +128 -0
  175. package/lib/tools/cli-client/program.js +350 -0
  176. package/lib/tools/cli-client/registry.js +176 -0
  177. package/lib/tools/cli-client/session.js +289 -0
  178. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  179. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  180. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  181. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  182. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  183. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  184. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  185. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  186. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  187. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  188. package/lib/tools/cli-daemon/command.js +73 -0
  189. package/lib/tools/cli-daemon/commands.js +956 -0
  190. package/lib/tools/cli-daemon/daemon.js +157 -0
  191. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  192. package/lib/tools/cli-daemon/program.js +129 -0
  193. package/lib/tools/dashboard/appIcon.png +0 -0
  194. package/lib/tools/dashboard/dashboardApp.js +284 -0
  195. package/lib/tools/dashboard/dashboardController.js +296 -0
  196. package/lib/tools/exports.js +60 -0
  197. package/lib/tools/mcp/browserFactory.js +233 -0
  198. package/lib/tools/mcp/cdpRelay.js +352 -0
  199. package/lib/tools/mcp/cli-stub.js +7 -0
  200. package/lib/tools/mcp/config.d.js +16 -0
  201. package/lib/tools/mcp/config.js +446 -0
  202. package/lib/tools/mcp/configIni.js +189 -0
  203. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  204. package/lib/tools/mcp/index.js +62 -0
  205. package/lib/tools/mcp/log.js +35 -0
  206. package/lib/tools/mcp/program.js +107 -0
  207. package/lib/tools/mcp/protocol.js +28 -0
  208. package/lib/tools/mcp/watchdog.js +44 -0
  209. package/lib/tools/trace/SKILL.md +171 -0
  210. package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
  211. package/lib/tools/trace/traceActions.js +142 -0
  212. package/lib/tools/trace/traceAttachments.js +69 -0
  213. package/lib/tools/trace/traceCli.js +87 -0
  214. package/lib/tools/trace/traceConsole.js +97 -0
  215. package/lib/tools/trace/traceErrors.js +55 -0
  216. package/lib/tools/trace/traceOpen.js +69 -0
  217. package/lib/tools/trace/traceParser.js +96 -0
  218. package/lib/tools/trace/traceRequests.js +182 -0
  219. package/lib/tools/trace/traceScreenshot.js +68 -0
  220. package/lib/tools/trace/traceSnapshot.js +149 -0
  221. package/lib/tools/trace/traceUtils.js +153 -0
  222. package/lib/tools/utils/connect.js +32 -0
  223. package/lib/tools/utils/mcp/http.js +152 -0
  224. package/lib/tools/utils/mcp/server.js +230 -0
  225. package/lib/tools/utils/mcp/tool.js +47 -0
  226. package/lib/tools/utils/socketConnection.js +108 -0
  227. package/lib/utils/isomorphic/formatUtils.js +64 -0
  228. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  229. package/lib/utils/isomorphic/mimeType.js +7 -2
  230. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  231. package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
  232. package/lib/utils/isomorphic/stringUtils.js +3 -3
  233. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  234. package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
  235. package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
  236. package/lib/utils/isomorphic/trace/traceModel.js +3 -2
  237. package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
  238. package/lib/utils/isomorphic/urlMatch.js +54 -1
  239. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  240. package/lib/utils.js +6 -2
  241. package/lib/utilsBundle.js +3 -21
  242. package/lib/utilsBundleImpl/index.js +132 -133
  243. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  244. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  245. package/lib/vite/dashboard/index.html +28 -0
  246. package/lib/vite/htmlReport/index.html +2 -70
  247. package/lib/vite/htmlReport/report.css +1 -0
  248. package/lib/vite/htmlReport/report.js +72 -0
  249. package/lib/vite/recorder/assets/{codeMirrorModule-CFUTFUO7.js → codeMirrorModule-C8KMvO9L.js} +20 -20
  250. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  251. package/lib/vite/recorder/index.html +1 -1
  252. package/lib/vite/traceViewer/assets/{codeMirrorModule-BVA4h_ZY.js → codeMirrorModule-DS0FLvoc.js} +20 -20
  253. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  254. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  255. package/lib/vite/traceViewer/{index.BtyWtaE-.js → index.C5466mMT.js} +1 -1
  256. package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
  257. package/lib/vite/traceViewer/index.html +4 -4
  258. package/lib/vite/traceViewer/sw.bundle.js +4 -4
  259. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  260. package/lib/vite/traceViewer/uiMode.html +3 -3
  261. package/lib/zipBundleImpl.js +2 -2
  262. package/lib/zodBundle.js +39 -0
  263. package/lib/zodBundleImpl.js +40 -0
  264. package/package.json +6 -1
  265. package/types/protocol.d.ts +947 -51
  266. package/types/types.d.ts +854 -74
  267. package/lib/client/pageAgent.js +0 -64
  268. package/lib/mcpBundleImpl/index.js +0 -147
  269. package/lib/server/agent/actionRunner.js +0 -335
  270. package/lib/server/agent/actions.js +0 -128
  271. package/lib/server/agent/codegen.js +0 -111
  272. package/lib/server/agent/context.js +0 -150
  273. package/lib/server/agent/expectTools.js +0 -156
  274. package/lib/server/agent/pageAgent.js +0 -204
  275. package/lib/server/agent/performTools.js +0 -262
  276. package/lib/server/agent/tool.js +0 -109
  277. package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
  278. package/lib/server/pageBinding.js +0 -87
  279. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  280. package/lib/vite/recorder/assets/index-CVkBxsGf.js +0 -193
  281. package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +0 -266
  282. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
  283. package/lib/vite/traceViewer/uiMode.fyrXARf2.js +0 -5
  284. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  285. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -101,7 +101,7 @@ const tBinary = (arg, path, context) => {
101
101
  return arg.toString("base64");
102
102
  }
103
103
  if (context.binary === "buffer") {
104
- if (!(arg instanceof Buffer))
104
+ if (!(arg instanceof Buffer) && !(arg instanceof Object))
105
105
  throw new ValidationError(`${path}: expected Buffer, got ${typeof arg}`);
106
106
  return arg;
107
107
  }
@@ -29,10 +29,10 @@ var import_profiler = require("../server/utils/profiler");
29
29
  var import_utils = require("../utils");
30
30
  var import_debugLogger = require("../server/utils/debugLogger");
31
31
  class PlaywrightConnection {
32
- constructor(semaphore, ws, controller, playwright, initialize, id) {
32
+ constructor(semaphore, transport, controller, playwright, initialize, id) {
33
33
  this._cleanups = [];
34
34
  this._disconnected = false;
35
- this._ws = ws;
35
+ this._transport = transport;
36
36
  this._semaphore = semaphore;
37
37
  this._id = id;
38
38
  this._profileName = (/* @__PURE__ */ new Date()).toISOString();
@@ -40,16 +40,16 @@ class PlaywrightConnection {
40
40
  this._dispatcherConnection = new import_server.DispatcherConnection();
41
41
  this._dispatcherConnection.onmessage = async (message) => {
42
42
  await lock;
43
- if (ws.readyState !== ws.CLOSING) {
43
+ if (!transport.isClosed()) {
44
44
  const messageString = JSON.stringify(message);
45
45
  if (import_debugLogger.debugLogger.isEnabled("server:channel"))
46
46
  import_debugLogger.debugLogger.log("server:channel", `[${this._id}] ${(0, import_utils.monotonicTime)() * 1e3} SEND \u25BA ${messageString}`);
47
47
  if (import_debugLogger.debugLogger.isEnabled("server:metadata"))
48
48
  this.logServerMetadata(message, messageString, "SEND");
49
- ws.send(messageString);
49
+ transport.send(messageString);
50
50
  }
51
51
  };
52
- ws.on("message", async (message) => {
52
+ transport.on("message", async (message) => {
53
53
  await lock;
54
54
  const messageString = Buffer.from(message).toString();
55
55
  const jsonMessage = JSON.parse(messageString);
@@ -59,8 +59,8 @@ class PlaywrightConnection {
59
59
  this.logServerMetadata(jsonMessage, messageString, "RECV");
60
60
  this._dispatcherConnection.dispatch(jsonMessage);
61
61
  });
62
- ws.on("close", () => this._onDisconnect());
63
- ws.on("error", (error) => this._onDisconnect(error));
62
+ transport.on("close", () => this._onDisconnect());
63
+ transport.on("error", (error) => this._onDisconnect(error));
64
64
  if (controller) {
65
65
  import_debugLogger.debugLogger.log("server", `[${this._id}] engaged reuse controller mode`);
66
66
  this._root = new import_debugControllerDispatcher.DebugControllerDispatcher(this._dispatcherConnection, playwright.debugController);
@@ -90,6 +90,8 @@ class PlaywrightConnection {
90
90
  });
91
91
  }
92
92
  async _onDisconnect(error) {
93
+ if (this._disconnected)
94
+ return;
93
95
  this._disconnected = true;
94
96
  import_debugLogger.debugLogger.log("server", `[${this._id}] disconnected. error: ${error}`);
95
97
  await this._root.stopPendingOperations(new Error("Disconnected")).catch(() => {
@@ -118,7 +120,7 @@ class PlaywrightConnection {
118
120
  return;
119
121
  import_debugLogger.debugLogger.log("server", `[${this._id}] force closing connection: ${reason?.reason || ""} (${reason?.code || 0})`);
120
122
  try {
121
- this._ws.close(reason?.code, reason?.reason);
123
+ this._transport.close(reason);
122
124
  } catch (e) {
123
125
  }
124
126
  }
@@ -0,0 +1,100 @@
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 playwrightPipeServer_exports = {};
30
+ __export(playwrightPipeServer_exports, {
31
+ PlaywrightPipeServer: () => PlaywrightPipeServer
32
+ });
33
+ module.exports = __toCommonJS(playwrightPipeServer_exports);
34
+ var import_net = __toESM(require("net"));
35
+ var import_fs = __toESM(require("fs"));
36
+ var import_playwrightConnection = require("./playwrightConnection");
37
+ var import_serverTransport = require("./serverTransport");
38
+ var import_debugLogger = require("../server/utils/debugLogger");
39
+ var import_browser = require("../server/browser");
40
+ var import_utils = require("../utils");
41
+ class PlaywrightPipeServer {
42
+ constructor(browser) {
43
+ this._connections = /* @__PURE__ */ new Set();
44
+ this._connectionId = 0;
45
+ this._browser = browser;
46
+ browser.on(import_browser.Browser.Events.Disconnected, () => this.close());
47
+ }
48
+ async listen(pipeName) {
49
+ if (!pipeName.startsWith("\\\\.\\pipe\\")) {
50
+ try {
51
+ import_fs.default.unlinkSync(pipeName);
52
+ } catch {
53
+ }
54
+ }
55
+ this._server = import_net.default.createServer((socket) => {
56
+ const id = String(++this._connectionId);
57
+ import_debugLogger.debugLogger.log("server", `[${id}] pipe client connected`);
58
+ const transport = new import_serverTransport.SocketServerTransport(socket);
59
+ const connection = new import_playwrightConnection.PlaywrightConnection(
60
+ new import_utils.Semaphore(1),
61
+ transport,
62
+ false,
63
+ this._browser.attribution.playwright,
64
+ () => this._initPreLaunchedBrowserMode(id),
65
+ id
66
+ );
67
+ this._connections.add(connection);
68
+ transport.on("close", () => this._connections.delete(connection));
69
+ });
70
+ (0, import_utils.decorateServer)(this._server);
71
+ await new Promise((resolve, reject) => {
72
+ this._server.listen(pipeName, () => resolve());
73
+ this._server.on("error", reject);
74
+ });
75
+ import_debugLogger.debugLogger.log("server", `Pipe server listening at ${pipeName}`);
76
+ }
77
+ async _initPreLaunchedBrowserMode(id) {
78
+ import_debugLogger.debugLogger.log("server", `[${id}] engaged pre-launched (browser) pipe mode`);
79
+ return {
80
+ preLaunchedBrowser: this._browser,
81
+ sharedBrowser: true,
82
+ denyLaunch: true
83
+ };
84
+ }
85
+ async close() {
86
+ if (!this._server)
87
+ return;
88
+ import_debugLogger.debugLogger.log("server", "closing pipe server");
89
+ for (const connection of this._connections)
90
+ await connection.close({ code: 1001, reason: "Server closing" });
91
+ this._connections.clear();
92
+ await new Promise((f) => this._server.close(() => f()));
93
+ this._server = void 0;
94
+ import_debugLogger.debugLogger.log("server", "closed pipe server");
95
+ }
96
+ }
97
+ // Annotate the CommonJS export names for ESM import in node:
98
+ 0 && (module.exports = {
99
+ PlaywrightPipeServer
100
+ });
@@ -22,6 +22,7 @@ __export(playwrightServer_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(playwrightServer_exports);
24
24
  var import_playwrightConnection = require("./playwrightConnection");
25
+ var import_serverTransport = require("./serverTransport");
25
26
  var import_playwright = require("../server/playwright");
26
27
  var import_semaphore = require("../utils/isomorphic/semaphore");
27
28
  var import_time = require("../utils/isomorphic/time");
@@ -86,6 +87,8 @@ ${uaError}` };
86
87
  const isExtension = this._options.mode === "extension";
87
88
  const allowFSPaths = isExtension;
88
89
  launchOptions = filterLaunchOptions(launchOptions, allowFSPaths);
90
+ if (this._options.artifactsDir)
91
+ launchOptions.artifactsDir = this._options.artifactsDir;
89
92
  if (isExtension) {
90
93
  const connectFilter = url.searchParams.get("connect");
91
94
  if (connectFilter) {
@@ -93,7 +96,7 @@ ${uaError}` };
93
96
  throw new Error(`Unknown connect filter: ${connectFilter}`);
94
97
  return new import_playwrightConnection.PlaywrightConnection(
95
98
  browserSemaphore,
96
- ws,
99
+ new import_serverTransport.WebSocketServerTransport(ws),
97
100
  false,
98
101
  this._playwright,
99
102
  () => this._initConnectMode(id, connectFilter, browserName, launchOptions),
@@ -103,7 +106,7 @@ ${uaError}` };
103
106
  if (url.searchParams.has("debug-controller")) {
104
107
  return new import_playwrightConnection.PlaywrightConnection(
105
108
  controllerSemaphore,
106
- ws,
109
+ new import_serverTransport.WebSocketServerTransport(ws),
107
110
  true,
108
111
  this._playwright,
109
112
  async () => {
@@ -114,7 +117,7 @@ ${uaError}` };
114
117
  }
115
118
  return new import_playwrightConnection.PlaywrightConnection(
116
119
  reuseBrowserSemaphore,
117
- ws,
120
+ new import_serverTransport.WebSocketServerTransport(ws),
118
121
  false,
119
122
  this._playwright,
120
123
  () => this._initReuseBrowsersMode(browserName, launchOptions, id),
@@ -125,7 +128,7 @@ ${uaError}` };
125
128
  if (this._options.preLaunchedBrowser) {
126
129
  return new import_playwrightConnection.PlaywrightConnection(
127
130
  browserSemaphore,
128
- ws,
131
+ new import_serverTransport.WebSocketServerTransport(ws),
129
132
  false,
130
133
  this._playwright,
131
134
  () => this._initPreLaunchedBrowserMode(id),
@@ -134,7 +137,7 @@ ${uaError}` };
134
137
  }
135
138
  return new import_playwrightConnection.PlaywrightConnection(
136
139
  browserSemaphore,
137
- ws,
140
+ new import_serverTransport.WebSocketServerTransport(ws),
138
141
  false,
139
142
  this._playwright,
140
143
  () => this._initPreLaunchedAndroidMode(id),
@@ -143,7 +146,7 @@ ${uaError}` };
143
146
  }
144
147
  return new import_playwrightConnection.PlaywrightConnection(
145
148
  browserSemaphore,
146
- ws,
149
+ new import_serverTransport.WebSocketServerTransport(ws),
147
150
  false,
148
151
  this._playwright,
149
152
  () => this._initLaunchBrowserMode(browserName, proxyValue, launchOptions, id),
@@ -313,7 +316,8 @@ function filterLaunchOptions(options, allowFSPaths) {
313
316
  firefoxUserPrefs: options.firefoxUserPrefs,
314
317
  slowMo: options.slowMo,
315
318
  executablePath: (0, import_utils.isUnderTest)() || allowFSPaths ? options.executablePath : void 0,
316
- downloadsPath: allowFSPaths ? options.downloadsPath : void 0
319
+ downloadsPath: allowFSPaths ? options.downloadsPath : void 0,
320
+ artifactsDir: (0, import_utils.isUnderTest)() || allowFSPaths ? options.artifactsDir : void 0
317
321
  };
318
322
  }
319
323
  const defaultLaunchOptions = {
@@ -326,7 +330,8 @@ const defaultLaunchOptions = {
326
330
  const optionsThatAllowBrowserReuse = [
327
331
  "headless",
328
332
  "timeout",
329
- "tracesDir"
333
+ "tracesDir",
334
+ "artifactsDir"
330
335
  ];
331
336
  // Annotate the CommonJS export names for ESM import in node:
332
337
  0 && (module.exports = {
@@ -0,0 +1,73 @@
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 playwrightWebSocketServer_exports = {};
20
+ __export(playwrightWebSocketServer_exports, {
21
+ PlaywrightWebSocketServer: () => PlaywrightWebSocketServer
22
+ });
23
+ module.exports = __toCommonJS(playwrightWebSocketServer_exports);
24
+ var import_playwrightConnection = require("./playwrightConnection");
25
+ var import_serverTransport = require("./serverTransport");
26
+ var import_debugLogger = require("../server/utils/debugLogger");
27
+ var import_browser = require("../server/browser");
28
+ var import_utils = require("../utils");
29
+ var import_wsServer = require("../server/utils/wsServer");
30
+ class PlaywrightWebSocketServer {
31
+ constructor(browser, path) {
32
+ this._browser = browser;
33
+ browser.on(import_browser.Browser.Events.Disconnected, () => this.close());
34
+ const semaphore = new import_utils.Semaphore(Infinity);
35
+ this._wsServer = new import_wsServer.WSServer({
36
+ onRequest: (request, response) => {
37
+ response.end("Running");
38
+ },
39
+ onUpgrade: () => void 0,
40
+ onHeaders: () => {
41
+ },
42
+ onConnection: (request, url, ws, id) => {
43
+ import_debugLogger.debugLogger.log("server", `[${id}] ws client connected`);
44
+ return new import_playwrightConnection.PlaywrightConnection(
45
+ semaphore,
46
+ new import_serverTransport.WebSocketServerTransport(ws),
47
+ false,
48
+ this._browser.attribution.playwright,
49
+ () => this._initPreLaunchedBrowserMode(id),
50
+ id
51
+ );
52
+ }
53
+ });
54
+ }
55
+ async _initPreLaunchedBrowserMode(id) {
56
+ import_debugLogger.debugLogger.log("server", `[${id}] engaged pre-launched (browser) ws mode`);
57
+ return {
58
+ preLaunchedBrowser: this._browser,
59
+ sharedBrowser: true,
60
+ denyLaunch: true
61
+ };
62
+ }
63
+ async listen(port = 0, hostname, path) {
64
+ return await this._wsServer.listen(port, hostname, path || "/");
65
+ }
66
+ async close() {
67
+ await this._wsServer.close();
68
+ }
69
+ }
70
+ // Annotate the CommonJS export names for ESM import in node:
71
+ 0 && (module.exports = {
72
+ PlaywrightWebSocketServer
73
+ });
@@ -0,0 +1,96 @@
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 serverTransport_exports = {};
20
+ __export(serverTransport_exports, {
21
+ SocketServerTransport: () => SocketServerTransport,
22
+ WebSocketServerTransport: () => WebSocketServerTransport
23
+ });
24
+ module.exports = __toCommonJS(serverTransport_exports);
25
+ var import_events = require("events");
26
+ class WebSocketServerTransport {
27
+ constructor(ws) {
28
+ this._ws = ws;
29
+ }
30
+ send(message) {
31
+ this._ws.send(message);
32
+ }
33
+ close(reason) {
34
+ this._ws.close(reason?.code, reason?.reason);
35
+ }
36
+ on(event, handler) {
37
+ this._ws.on(event, handler);
38
+ }
39
+ isClosed() {
40
+ return this._ws.readyState === this._ws.CLOSING || this._ws.readyState === this._ws.CLOSED;
41
+ }
42
+ }
43
+ class SocketServerTransport extends import_events.EventEmitter {
44
+ constructor(socket) {
45
+ super();
46
+ this._closed = false;
47
+ this._pendingBuffers = [];
48
+ this._socket = socket;
49
+ socket.on("data", (buffer) => this._dispatch(buffer));
50
+ socket.on("close", () => {
51
+ this._closed = true;
52
+ super.emit("close");
53
+ });
54
+ socket.on("error", (error) => {
55
+ super.emit("error", error);
56
+ });
57
+ }
58
+ send(message) {
59
+ if (this._closed)
60
+ return;
61
+ this._socket.write(message);
62
+ this._socket.write("\0");
63
+ }
64
+ close(reason) {
65
+ if (this._closed)
66
+ return;
67
+ this._closed = true;
68
+ this._socket.end();
69
+ }
70
+ isClosed() {
71
+ return this._closed;
72
+ }
73
+ _dispatch(buffer) {
74
+ let end = buffer.indexOf("\0");
75
+ if (end === -1) {
76
+ this._pendingBuffers.push(buffer);
77
+ return;
78
+ }
79
+ this._pendingBuffers.push(buffer.slice(0, end));
80
+ const message = Buffer.concat(this._pendingBuffers).toString();
81
+ super.emit("message", message);
82
+ let start = end + 1;
83
+ end = buffer.indexOf("\0", start);
84
+ while (end !== -1) {
85
+ super.emit("message", buffer.toString(void 0, start, end));
86
+ start = end + 1;
87
+ end = buffer.indexOf("\0", start);
88
+ }
89
+ this._pendingBuffers = [buffer.slice(start)];
90
+ }
91
+ }
92
+ // Annotate the CommonJS export names for ESM import in node:
93
+ 0 && (module.exports = {
94
+ SocketServerTransport,
95
+ WebSocketServerTransport
96
+ });
@@ -261,7 +261,7 @@ class AndroidDevice extends import_instrumentation.SdkObject {
261
261
  const proxyBypassRules = [];
262
262
  if (proxy.bypass)
263
263
  proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t));
264
- if (!process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes("<-loopback>"))
264
+ if ((0, import_crBrowser.shouldProxyLoopback)(proxy.bypass))
265
265
  proxyBypassRules.push("<-loopback>");
266
266
  if (proxyBypassRules.length > 0)
267
267
  chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`);
@@ -294,7 +294,7 @@ class AndroidDevice extends import_instrumentation.SdkObject {
294
294
  });
295
295
  const browserOptions = {
296
296
  name: "clank",
297
- isChromium: true,
297
+ browserType: "chromium",
298
298
  slowMo: 0,
299
299
  persistent: { ...options, noDefaultViewport: true },
300
300
  artifactsDir,
@@ -48,6 +48,7 @@ class BidiBrowser extends import_browser.Browser {
48
48
  super(parent, options);
49
49
  this._contexts = /* @__PURE__ */ new Map();
50
50
  this._bidiPages = /* @__PURE__ */ new Map();
51
+ this._cacheBehavior = "default";
51
52
  this._connection = new import_bidiConnection.BidiConnection(transport, this._onDisconnect.bind(this), options.protocolLogger, options.browserLogsCollector);
52
53
  this._browserSession = this._connection.browserSession;
53
54
  this._eventListeners = [
@@ -84,6 +85,7 @@ class BidiBrowser extends import_browser.Browser {
84
85
  "input"
85
86
  ]
86
87
  });
88
+ await browser._browserSession.send("network.addIntercept", { phases: [bidi.Network.InterceptPhase.AuthRequired] });
87
89
  await browser._browserSession.send("network.addDataCollector", {
88
90
  dataTypes: [bidi.Network.DataType.Response],
89
91
  maxEncodedDataSize: 2e7
@@ -124,6 +126,13 @@ class BidiBrowser extends import_browser.Browser {
124
126
  isConnected() {
125
127
  return !this._connection.isClosed();
126
128
  }
129
+ async updateCacheBehavior() {
130
+ const cacheBehavior = [...this._contexts.values()].some((context) => context.requestInterceptors.length > 0) ? "bypass" : "default";
131
+ if (this._cacheBehavior !== cacheBehavior) {
132
+ await this._browserSession.send("network.setCacheBehavior", { cacheBehavior });
133
+ this._cacheBehavior = cacheBehavior;
134
+ }
135
+ }
127
136
  _onBrowsingContextCreated(event) {
128
137
  if (event.parent) {
129
138
  const parentFrameId = event.parent;
@@ -135,6 +144,7 @@ class BidiBrowser extends import_browser.Browser {
135
144
  page2._getFrameNode(frame).then((node) => {
136
145
  const attributes = node?.value?.attributes;
137
146
  frame._name = attributes?.name ?? attributes?.id ?? "";
147
+ }, () => {
138
148
  });
139
149
  return;
140
150
  }
@@ -198,6 +208,11 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
198
208
  const promises = [
199
209
  super._initialize()
200
210
  ];
211
+ const downloadBehavior = this._options.acceptDownloads === "accept" ? { type: "allowed", destinationFolder: this._browser.options.downloadsPath } : { type: "denied" };
212
+ promises.push(this._browser._browserSession.send("browser.setDownloadBehavior", {
213
+ downloadBehavior,
214
+ userContexts: [this._userContextId()]
215
+ }));
201
216
  promises.push(this.doUpdateDefaultViewport());
202
217
  if (this._options.geolocation)
203
218
  promises.push(this.setGeolocation(this._options.geolocation));
@@ -223,6 +238,8 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
223
238
  promises.push(this.doUpdateExtraHTTPHeaders());
224
239
  if (this._options.permissions)
225
240
  promises.push(this.doGrantPermissions("*", this._options.permissions));
241
+ if (this._options.offline)
242
+ promises.push(this.doUpdateOffline());
226
243
  await Promise.all(promises);
227
244
  }
228
245
  possiblyUninitializedPages() {
@@ -269,7 +286,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
269
286
  };
270
287
  return this._browser._browserSession.send(
271
288
  "storage.setCookie",
272
- { cookie, partition: { type: "storageKey", userContext: this._browserContextId } }
289
+ { cookie, partition: { type: "storageKey", userContext: this._browserContextId, sourceOrigin: c.partitionKey } }
273
290
  );
274
291
  });
275
292
  await Promise.all(promises);
@@ -347,6 +364,10 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
347
364
  });
348
365
  }
349
366
  async doUpdateOffline() {
367
+ await this._browser._browserSession.send("emulation.setNetworkConditions", {
368
+ networkConditions: this._options.offline ? { type: "offline" } : null,
369
+ userContexts: [this._userContextId()]
370
+ });
350
371
  }
351
372
  async doSetHTTPCredentials(httpCredentials) {
352
373
  this._options.httpCredentials = httpCredentials;
@@ -372,18 +393,18 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
372
393
  await Promise.all(ids.map((script) => this._browser._browserSession.send("script.removePreloadScript", { script })));
373
394
  }
374
395
  async doUpdateRequestInterception() {
396
+ let interceptPromise = Promise.resolve(void 0);
375
397
  if (this.requestInterceptors.length > 0 && !this._interceptId) {
376
- const { intercept } = await this._browser._browserSession.send("network.addIntercept", {
377
- phases: [bidi.Network.InterceptPhase.BeforeRequestSent],
378
- urlPatterns: [{ type: "pattern" }]
379
- });
380
- this._interceptId = intercept;
398
+ interceptPromise = this._browser._browserSession.send("network.addIntercept", {
399
+ phases: [bidi.Network.InterceptPhase.BeforeRequestSent]
400
+ }).then(({ intercept }) => this._interceptId = intercept);
381
401
  }
382
402
  if (this.requestInterceptors.length === 0 && this._interceptId) {
383
403
  const intercept = this._interceptId;
384
404
  this._interceptId = void 0;
385
- await this._browser._browserSession.send("network.removeIntercept", { intercept });
405
+ interceptPromise = this._browser._browserSession.send("network.removeIntercept", { intercept });
386
406
  }
407
+ await Promise.all([this._browser.updateCacheBehavior(), interceptPromise]);
387
408
  }
388
409
  async doUpdateDefaultViewport() {
389
410
  if (!this._options.viewport && !this._options.screen)
@@ -430,7 +451,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
430
451
  userContexts: [this._userContextId()]
431
452
  }));
432
453
  promises.push(...this._bidiPages().map((page) => {
433
- const realms = [...page._realmToContext].filter(([realm, context]) => context.world === "main").map(([realm, context]) => realm);
454
+ const realms = [...page._contextIdToContext].filter(([realm, context]) => context.world === "main").map(([realm, context]) => realm);
434
455
  return Promise.all(realms.map((realm) => {
435
456
  return page._session.send("script.callFunction", {
436
457
  functionDeclaration,
@@ -455,6 +476,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
455
476
  await this._browser._browserSession.send("browser.removeUserContext", {
456
477
  userContext: this._browserContextId
457
478
  });
479
+ await Promise.all(this._bidiPages().map((bidiPage) => bidiPage._page.closedPromise));
458
480
  this._browser._contexts.delete(this._browserContextId);
459
481
  }
460
482
  async cancelDownload(uuid) {
@@ -38,7 +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_hostPlatform = require("../utils/hostPlatform");
41
+ var import_crBrowser = require("../chromium/crBrowser");
42
42
  class BidiChromium extends import_browserType.BrowserType {
43
43
  constructor(parent) {
44
44
  super(parent, "chromium");
@@ -107,7 +107,7 @@ class BidiChromium extends import_browserType.BrowserType {
107
107
  if (args.find((arg) => !arg.startsWith("-")))
108
108
  throw new Error("Arguments can not specify page to be opened");
109
109
  const chromeArguments = [...(0, import_chromiumSwitches.chromiumSwitches)(options.assistantMode)];
110
- if (import_os.default.platform() !== "darwin" || !(0, import_hostPlatform.hasGpuMac)()) {
110
+ if (import_os.default.platform() === "darwin") {
111
111
  chromeArguments.push("--enable-unsafe-swiftshader");
112
112
  }
113
113
  if (options.headless) {
@@ -129,11 +129,9 @@ class BidiChromium extends import_browserType.BrowserType {
129
129
  }
130
130
  chromeArguments.push(`--proxy-server=${proxy.server}`);
131
131
  const proxyBypassRules = [];
132
- if (options.socksProxyPort)
133
- proxyBypassRules.push("<-loopback>");
134
132
  if (proxy.bypass)
135
133
  proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t));
136
- if (!process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes("<-loopback>"))
134
+ if (options.socksProxyPort || (0, import_crBrowser.shouldProxyLoopback)(proxy.bypass))
137
135
  proxyBypassRules.push("<-loopback>");
138
136
  if (proxyBypassRules.length > 0)
139
137
  chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`);
@@ -141,6 +139,21 @@ class BidiChromium extends import_browserType.BrowserType {
141
139
  chromeArguments.push(...args);
142
140
  return chromeArguments;
143
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
+ }
144
157
  }
145
158
  const kBidiOverCdpWrapper = Symbol("kBidiConnectionWrapper");
146
159
  // Annotate the CommonJS export names for ESM import in node: