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
@@ -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 = {
@@ -321,13 +325,13 @@ const defaultLaunchOptions = {
321
325
  handleSIGINT: false,
322
326
  handleSIGTERM: false,
323
327
  handleSIGHUP: false,
324
- headless: true,
325
- devtools: false
328
+ headless: true
326
329
  };
327
330
  const optionsThatAllowBrowserReuse = [
328
331
  "headless",
329
332
  "timeout",
330
- "tracesDir"
333
+ "tracesDir",
334
+ "artifactsDir"
331
335
  ];
332
336
  // Annotate the CommonJS export names for ESM import in node:
333
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,
@@ -103,7 +103,7 @@ class Artifact extends import_instrumentation.SdkObject {
103
103
  if (!this._unaccessibleErrorMessage)
104
104
  await import_fs.default.promises.unlink(this._localPath).catch((e) => {
105
105
  });
106
- await this.reportFinished(new import_errors.TargetClosedError());
106
+ await this.reportFinished(new import_errors.TargetClosedError(this.closeReason()));
107
107
  }
108
108
  async reportFinished(error) {
109
109
  if (this._finished)
@@ -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,16 +126,27 @@ 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;
130
139
  const page2 = this._findPageForFrame(parentFrameId);
131
140
  if (page2) {
132
141
  page2._session.addFrameBrowsingContext(event.context);
133
- page2._page.frameManager.frameAttached(event.context, parentFrameId);
134
- const frame = page2._page.frameManager.frame(event.context);
135
- if (frame)
136
- frame._url = event.url;
142
+ const frame = page2._page.frameManager.frameAttached(event.context, parentFrameId);
143
+ frame._url = event.url;
144
+ page2._getFrameNode(frame).then((node) => {
145
+ const attributes = node?.value?.attributes;
146
+ frame._name = attributes?.name ?? attributes?.id ?? "";
147
+ }, () => {
148
+ });
149
+ return;
137
150
  }
138
151
  return;
139
152
  }
@@ -142,6 +155,7 @@ class BidiBrowser extends import_browser.Browser {
142
155
  context = this._defaultContext;
143
156
  if (!context)
144
157
  return;
158
+ context.doGrantGlobalPermissionsForURL(event.url);
145
159
  const session = this._connection.createMainFrameBrowsingContextSession(event.context);
146
160
  const opener = event.originalOpener && this._findPageForFrame(event.originalOpener);
147
161
  const page = new import_bidiPage.BidiPage(context, session, opener || null);
@@ -194,6 +208,11 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
194
208
  const promises = [
195
209
  super._initialize()
196
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
+ }));
197
216
  promises.push(this.doUpdateDefaultViewport());
198
217
  if (this._options.geolocation)
199
218
  promises.push(this.setGeolocation(this._options.geolocation));
@@ -217,6 +236,10 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
217
236
  }
218
237
  if (this._options.extraHTTPHeaders)
219
238
  promises.push(this.doUpdateExtraHTTPHeaders());
239
+ if (this._options.permissions)
240
+ promises.push(this.doGrantPermissions("*", this._options.permissions));
241
+ if (this._options.offline)
242
+ promises.push(this.doUpdateOffline());
220
243
  await Promise.all(promises);
221
244
  }
222
245
  possiblyUninitializedPages() {
@@ -263,7 +286,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
263
286
  };
264
287
  return this._browser._browserSession.send(
265
288
  "storage.setCookie",
266
- { cookie, partition: { type: "storageKey", userContext: this._browserContextId } }
289
+ { cookie, partition: { type: "storageKey", userContext: this._browserContextId, sourceOrigin: c.partitionKey } }
267
290
  );
268
291
  });
269
292
  await Promise.all(promises);
@@ -275,17 +298,34 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
275
298
  );
276
299
  }
277
300
  async doGrantPermissions(origin, permissions) {
301
+ if (origin === "null")
302
+ return;
278
303
  const currentPermissions = this._originToPermissions.get(origin) || [];
279
304
  const toGrant = permissions.filter((permission) => !currentPermissions.includes(permission));
280
305
  this._originToPermissions.set(origin, [...currentPermissions, ...toGrant]);
281
- await Promise.all(toGrant.map((permission) => this._setPermission(origin, permission, bidi.Permissions.PermissionState.Granted)));
306
+ if (origin === "*") {
307
+ await Promise.all(this._bidiPages().flatMap(
308
+ (page) => page._page.frames().map(
309
+ (frame) => this.doGrantPermissions(new URL(frame._url).origin, permissions)
310
+ )
311
+ ));
312
+ } else {
313
+ await Promise.all(toGrant.map((permission) => this._setPermission(origin, permission, bidi.Permissions.PermissionState.Granted)));
314
+ }
315
+ }
316
+ async doGrantGlobalPermissionsForURL(url) {
317
+ const permissions = this._originToPermissions.get("*");
318
+ if (!permissions)
319
+ return;
320
+ await this.doGrantPermissions(new URL(url).origin, permissions);
282
321
  }
283
322
  async doClearPermissions() {
284
323
  const currentPermissions = [...this._originToPermissions.entries()];
285
324
  this._originToPermissions = /* @__PURE__ */ new Map();
286
- await Promise.all(currentPermissions.map(([origin, permissions]) => permissions.map(
287
- (p) => this._setPermission(origin, p, bidi.Permissions.PermissionState.Prompt)
288
- )));
325
+ await Promise.all(currentPermissions.flatMap(([origin, permissions]) => {
326
+ if (origin !== "*")
327
+ return permissions.map((p) => this._setPermission(origin, p, bidi.Permissions.PermissionState.Prompt));
328
+ }));
289
329
  }
290
330
  async _setPermission(origin, permission, state) {
291
331
  await this._browser._browserSession.send("permissions.setPermission", {
@@ -324,6 +364,10 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
324
364
  });
325
365
  }
326
366
  async doUpdateOffline() {
367
+ await this._browser._browserSession.send("emulation.setNetworkConditions", {
368
+ networkConditions: this._options.offline ? { type: "offline" } : null,
369
+ userContexts: [this._userContextId()]
370
+ });
327
371
  }
328
372
  async doSetHTTPCredentials(httpCredentials) {
329
373
  this._options.httpCredentials = httpCredentials;
@@ -349,21 +393,42 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
349
393
  await Promise.all(ids.map((script) => this._browser._browserSession.send("script.removePreloadScript", { script })));
350
394
  }
351
395
  async doUpdateRequestInterception() {
396
+ let interceptPromise = Promise.resolve(void 0);
397
+ if (this.requestInterceptors.length > 0 && !this._interceptId) {
398
+ interceptPromise = this._browser._browserSession.send("network.addIntercept", {
399
+ phases: [bidi.Network.InterceptPhase.BeforeRequestSent]
400
+ }).then(({ intercept }) => this._interceptId = intercept);
401
+ }
402
+ if (this.requestInterceptors.length === 0 && this._interceptId) {
403
+ const intercept = this._interceptId;
404
+ this._interceptId = void 0;
405
+ interceptPromise = this._browser._browserSession.send("network.removeIntercept", { intercept });
406
+ }
407
+ await Promise.all([this._browser.updateCacheBehavior(), interceptPromise]);
352
408
  }
353
409
  async doUpdateDefaultViewport() {
354
- if (!this._options.viewport)
410
+ if (!this._options.viewport && !this._options.screen)
355
411
  return;
412
+ const screenSize = this._options.screen || this._options.viewport;
413
+ const viewportSize = this._options.viewport || this._options.screen;
356
414
  await Promise.all([
357
415
  this._browser._browserSession.send("browsingContext.setViewport", {
358
416
  viewport: {
359
- width: this._options.viewport.width,
360
- height: this._options.viewport.height
417
+ width: viewportSize.width,
418
+ height: viewportSize.height
361
419
  },
362
420
  devicePixelRatio: this._options.deviceScaleFactor || 1,
363
421
  userContexts: [this._userContextId()]
364
422
  }),
365
423
  this._browser._browserSession.send("emulation.setScreenOrientationOverride", {
366
- screenOrientation: getScreenOrientation(!!this._options.isMobile, this._options.viewport),
424
+ screenOrientation: getScreenOrientation(!!this._options.isMobile, screenSize),
425
+ userContexts: [this._userContextId()]
426
+ }),
427
+ this._browser._browserSession.send("emulation.setScreenSettingsOverride", {
428
+ screenArea: {
429
+ width: screenSize.width,
430
+ height: screenSize.height
431
+ },
367
432
  userContexts: [this._userContextId()]
368
433
  })
369
434
  ]);
@@ -386,7 +451,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
386
451
  userContexts: [this._userContextId()]
387
452
  }));
388
453
  promises.push(...this._bidiPages().map((page) => {
389
- 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);
390
455
  return Promise.all(realms.map((realm) => {
391
456
  return page._session.send("script.callFunction", {
392
457
  functionDeclaration,
@@ -411,6 +476,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
411
476
  await this._browser._browserSession.send("browser.removeUserContext", {
412
477
  userContext: this._browserContextId
413
478
  });
479
+ await Promise.all(this._bidiPages().map((bidiPage) => bidiPage._page.closedPromise));
414
480
  this._browser._contexts.delete(this._browserContextId);
415
481
  }
416
482
  async cancelDownload(uuid) {