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
@@ -32,6 +32,7 @@ __export(bidiPage_exports, {
32
32
  kPlaywrightBindingChannel: () => kPlaywrightBindingChannel
33
33
  });
34
34
  module.exports = __toCommonJS(bidiPage_exports);
35
+ var import_debugLogger = require("../utils/debugLogger");
35
36
  var import_eventsHelper = require("../utils/eventsHelper");
36
37
  var dialog = __toESM(require("../dialog"));
37
38
  var dom = __toESM(require("../dom"));
@@ -50,12 +51,13 @@ class BidiPage {
50
51
  this._realmToWorkerContext = /* @__PURE__ */ new Map();
51
52
  this._sessionListeners = [];
52
53
  this._initScriptIds = /* @__PURE__ */ new Map();
54
+ this._fragmentNavigations = /* @__PURE__ */ new Set();
53
55
  this._session = bidiSession;
54
56
  this._opener = opener;
55
57
  this.rawKeyboard = new import_bidiInput.RawKeyboardImpl(bidiSession);
56
58
  this.rawMouse = new import_bidiInput.RawMouseImpl(bidiSession);
57
59
  this.rawTouchscreen = new import_bidiInput.RawTouchscreenImpl(bidiSession);
58
- this._realmToContext = /* @__PURE__ */ new Map();
60
+ this._contextIdToContext = /* @__PURE__ */ new Map();
59
61
  this._page = new import_page.Page(this, browserContext);
60
62
  this._browserContext = browserContext;
61
63
  this._networkManager = new import_bidiNetworkManager.BidiNetworkManager(this._session, this._page);
@@ -87,8 +89,7 @@ class BidiPage {
87
89
  async _initialize() {
88
90
  this._onFrameAttached(this._session.sessionId, null);
89
91
  await Promise.all([
90
- this.updateHttpCredentials(),
91
- this.updateRequestInterception()
92
+ this.updateHttpCredentials()
92
93
  // If the page is created by the Playwright client's call, some initialization
93
94
  // may be pending. Wait for it to complete before reporting the page as new.
94
95
  ]);
@@ -102,9 +103,9 @@ class BidiPage {
102
103
  return this._page.frameManager.frameAttached(frameId, parentFrameId);
103
104
  }
104
105
  _removeContextsForFrame(frame, notifyFrame) {
105
- for (const [contextId, context] of this._realmToContext) {
106
+ for (const [contextId, context] of this._contextIdToContext) {
106
107
  if (context.frame === frame) {
107
- this._realmToContext.delete(contextId);
108
+ this._contextIdToContext.delete(contextId);
108
109
  if (notifyFrame)
109
110
  frame._contextDestroyed(context);
110
111
  }
@@ -119,7 +120,7 @@ class BidiPage {
119
120
  this._page.addWorker(realmInfo.realm, worker);
120
121
  return;
121
122
  }
122
- if (this._realmToContext.has(realmInfo.realm))
123
+ if (this._contextIdToContext.has(realmInfo.realm))
123
124
  return;
124
125
  if (realmInfo.type !== "window")
125
126
  return;
@@ -138,7 +139,7 @@ class BidiPage {
138
139
  const delegate = new import_bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
139
140
  const context = new dom.FrameExecutionContext(delegate, frame, worldName);
140
141
  frame._contextCreated(worldName, context);
141
- this._realmToContext.set(realmInfo.realm, context);
142
+ this._contextIdToContext.set(realmInfo.realm, context);
142
143
  }
143
144
  async _touchUtilityWorld(context) {
144
145
  await this._session.sendMayFail("script.evaluate", {
@@ -156,9 +157,9 @@ class BidiPage {
156
157
  });
157
158
  }
158
159
  _onRealmDestroyed(params) {
159
- const context = this._realmToContext.get(params.realm);
160
+ const context = this._contextIdToContext.get(params.realm);
160
161
  if (context) {
161
- this._realmToContext.delete(params.realm);
162
+ this._contextIdToContext.delete(params.realm);
162
163
  context.frame._contextDestroyed(context);
163
164
  return true;
164
165
  }
@@ -179,10 +180,12 @@ class BidiPage {
179
180
  }
180
181
  _onNavigationCommitted(params) {
181
182
  const frameId = params.context;
183
+ const frame = this._page.frameManager.frame(frameId);
184
+ this._browserContext.doGrantGlobalPermissionsForURL(params.url).catch((error) => import_debugLogger.debugLogger.log("error", error));
182
185
  this._page.frameManager.frameCommittedNewDocumentNavigation(
183
186
  frameId,
184
187
  params.url,
185
- "",
188
+ frame._name,
186
189
  params.navigation,
187
190
  /* initial */
188
191
  false
@@ -202,6 +205,8 @@ class BidiPage {
202
205
  this._page.frameManager.frameAbortedNavigation(params.context, "Navigation failed", params.navigation || void 0);
203
206
  }
204
207
  _onFragmentNavigated(params) {
208
+ if (params.navigation)
209
+ this._fragmentNavigations.add(params.navigation);
205
210
  this._page.frameManager.frameCommittedSameDocumentNavigation(params.context, params.url);
206
211
  }
207
212
  _onHistoryUpdated(params) {
@@ -227,7 +232,7 @@ class BidiPage {
227
232
  originPage = this._opener._page.initializedOrUndefined();
228
233
  if (!originPage)
229
234
  return;
230
- this._browserContext._browser._downloadCreated(originPage, event.navigation, event.url, event.suggestedFilename);
235
+ this._browserContext._browser._downloadCreated(originPage, event.navigation, event.url, event.suggestedFilename, event.suggestedFilename);
231
236
  }
232
237
  _onDownloadEnded(event) {
233
238
  if (!event.navigation)
@@ -258,12 +263,13 @@ ${params.stackTrace?.callFrames.map((f) => {
258
263
  if (params.type !== "console")
259
264
  return;
260
265
  const entry = params;
261
- const context = this._realmToContext.get(params.source.realm) ?? this._realmToWorkerContext.get(params.source.realm);
266
+ const context = this._contextIdToContext.get(params.source.realm) ?? this._realmToWorkerContext.get(params.source.realm);
262
267
  if (!context)
263
268
  return;
264
269
  const callFrame = params.stackTrace?.callFrames[0];
265
270
  const location = callFrame ?? { url: "", lineNumber: 1, columnNumber: 1 };
266
- this._page.addConsoleMessage(null, entry.method, entry.args.map((arg) => (0, import_bidiExecutionContext.createHandle)(context, arg)), location, params.text || void 0);
271
+ const type = entry.method === "warn" ? "warning" : entry.method;
272
+ this._page.addConsoleMessage(null, type, entry.args.map((arg) => (0, import_bidiExecutionContext.createHandle)(context, arg)), location, void 0, params.timestamp);
267
273
  }
268
274
  async _onFileDialogOpened(params) {
269
275
  if (!params.element)
@@ -272,14 +278,21 @@ ${params.stackTrace?.callFrames.map((f) => {
272
278
  if (!frame)
273
279
  return;
274
280
  const executionContext = await frame._mainContext();
275
- const handle = await toBidiExecutionContext(executionContext).remoteObjectForNodeId(executionContext, { sharedId: params.element.sharedId });
276
- await this._page._onFileChooserOpened(handle);
281
+ try {
282
+ const handle = await toBidiExecutionContext(executionContext).remoteObjectForNodeId(executionContext, { sharedId: params.element.sharedId });
283
+ await this._page._onFileChooserOpened(handle);
284
+ } catch {
285
+ }
277
286
  }
278
287
  async navigateFrame(frame, url, referrer) {
279
288
  const { navigation } = await this._session.send("browsingContext.navigate", {
280
289
  context: frame._id,
281
290
  url
282
291
  });
292
+ if (navigation && this._fragmentNavigations.has(navigation)) {
293
+ this._fragmentNavigations.delete(navigation);
294
+ return {};
295
+ }
283
296
  return { newDocumentId: navigation || void 0 };
284
297
  }
285
298
  async updateExtraHTTPHeaders() {
@@ -306,6 +319,7 @@ ${params.stackTrace?.callFrames.map((f) => {
306
319
  const emulatedSize = this._page.emulatedSize();
307
320
  if (!emulatedSize)
308
321
  return;
322
+ const screenSize = emulatedSize.screen;
309
323
  const viewportSize = emulatedSize.viewport;
310
324
  await Promise.all([
311
325
  this._session.send("browsingContext.setViewport", {
@@ -318,12 +332,19 @@ ${params.stackTrace?.callFrames.map((f) => {
318
332
  }),
319
333
  this._session.send("emulation.setScreenOrientationOverride", {
320
334
  contexts: [this._session.sessionId],
321
- screenOrientation: (0, import_bidiBrowser.getScreenOrientation)(!!options.isMobile, viewportSize)
335
+ screenOrientation: (0, import_bidiBrowser.getScreenOrientation)(!!options.isMobile, screenSize)
336
+ }),
337
+ this._session.send("emulation.setScreenSettingsOverride", {
338
+ contexts: [this._session.sessionId],
339
+ screenArea: {
340
+ width: screenSize.width,
341
+ height: screenSize.height
342
+ }
322
343
  })
323
344
  ]);
324
345
  }
325
346
  async updateRequestInterception() {
326
- await this._networkManager.setRequestInterception(this._page.needsRequestInterception());
347
+ await this._networkManager.setRequestInterception(this._page.requestInterceptors.length > 0);
327
348
  }
328
349
  async updateOffline() {
329
350
  }
@@ -352,7 +373,13 @@ ${params.stackTrace?.callFrames.map((f) => {
352
373
  }).then(() => true).catch(() => false);
353
374
  }
354
375
  async requestGC() {
355
- throw new Error("Method not implemented.");
376
+ const result = await this._session.send("script.evaluate", {
377
+ expression: "TestUtils.gc()",
378
+ target: { context: this._session.sessionId },
379
+ awaitPromise: true
380
+ });
381
+ if (result.type === "exception")
382
+ throw new Error("Method not implemented.");
356
383
  }
357
384
  async _onScriptMessage(event) {
358
385
  if (event.channel !== kPlaywrightBindingChannel)
@@ -360,7 +387,7 @@ ${params.stackTrace?.callFrames.map((f) => {
360
387
  const pageOrError = await this._page.waitForInitializedOrError();
361
388
  if (pageOrError instanceof Error)
362
389
  return;
363
- const context = this._realmToContext.get(event.source.realm);
390
+ const context = this._contextIdToContext.get(event.source.realm);
364
391
  if (!context)
365
392
  return;
366
393
  if (event.data.type !== "string")
@@ -409,7 +436,7 @@ ${params.stackTrace?.callFrames.map((f) => {
409
436
  context: this._session.sessionId,
410
437
  format: {
411
438
  type: `image/${format === "png" ? "png" : "jpeg"}`,
412
- quality: quality ? quality / 100 : 0.8
439
+ quality: quality !== void 0 ? quality / 100 : void 0
413
440
  },
414
441
  origin: documentRect ? "document" : "viewport",
415
442
  clip: {
@@ -482,7 +509,9 @@ ${params.stackTrace?.callFrames.map((f) => {
482
509
  throw e;
483
510
  });
484
511
  }
485
- async setScreencastOptions(options) {
512
+ startScreencast(options) {
513
+ }
514
+ stopScreencast() {
486
515
  }
487
516
  rafCountForStablePosition() {
488
517
  return 1;
@@ -537,30 +566,28 @@ ${params.stackTrace?.callFrames.map((f) => {
537
566
  const parent = frame.parentFrame();
538
567
  if (!parent)
539
568
  throw new Error("Frame has been detached.");
540
- const parentContext = await parent._mainContext();
541
- const list = await parentContext.evaluateHandle(() => {
542
- return [...document.querySelectorAll("iframe,frame")];
543
- });
544
- const length = await list.evaluate((list2) => list2.length);
545
- let foundElement = null;
546
- for (let i = 0; i < length; i++) {
547
- const element = await list.evaluateHandle((list2, i2) => list2[i2], i);
548
- const candidate = await element.contentFrame();
549
- if (frame === candidate) {
550
- foundElement = element;
551
- break;
552
- } else {
553
- element.dispose();
554
- }
555
- }
556
- list.dispose();
557
- if (!foundElement)
569
+ const node = await this._getFrameNode(frame);
570
+ if (!node?.sharedId)
558
571
  throw new Error("Frame has been detached.");
559
- return foundElement;
572
+ const parentFrameExecutionContext = await parent._mainContext();
573
+ return await toBidiExecutionContext(parentFrameExecutionContext).remoteObjectForNodeId(parentFrameExecutionContext, { sharedId: node.sharedId });
574
+ }
575
+ async _getFrameNode(frame) {
576
+ const parent = frame.parentFrame();
577
+ if (!parent)
578
+ return void 0;
579
+ const result = await this._session.send("browsingContext.locateNodes", {
580
+ context: parent._id,
581
+ locator: { type: "context", value: { context: frame._id } }
582
+ });
583
+ const node = result.nodes[0];
584
+ return node;
560
585
  }
561
586
  shouldToggleStyleSheetToSyncAnimations() {
562
587
  return true;
563
588
  }
589
+ async setDockTile(image) {
590
+ }
564
591
  }
565
592
  function toBidiExecutionContext(executionContext) {
566
593
  return executionContext.delegate;
@@ -128,6 +128,7 @@ var Network;
128
128
  ((Network2) => {
129
129
  let DataType;
130
130
  ((DataType2) => {
131
+ DataType2["Request"] = "request";
131
132
  DataType2["Response"] = "response";
132
133
  })(DataType = Network2.DataType || (Network2.DataType = {}));
133
134
  })(Network || (Network = {}));
@@ -223,7 +223,9 @@ function defaultProfilePreferences(extraPrefs) {
223
223
  // Disable browser animations (tabs, fullscreen, sliding alerts)
224
224
  "toolkit.cosmeticAnimations.enabled": false,
225
225
  // Prevent starting into safe mode after application crashes
226
- "toolkit.startup.max_resumed_crashes": -1
226
+ "toolkit.startup.max_resumed_crashes": -1,
227
+ // Enable TestUtils
228
+ "dom.testing.testutils.enabled": true
227
229
  };
228
230
  return Object.assign(defaultPrefs, extraPrefs);
229
231
  }
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,29 +17,42 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
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
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
  var browser_exports = {};
20
30
  __export(browser_exports, {
21
- Browser: () => Browser
31
+ Browser: () => Browser,
32
+ BrowserServer: () => BrowserServer
22
33
  });
23
34
  module.exports = __toCommonJS(browser_exports);
24
- var import_artifact = require("./artifact");
35
+ var import_fs = __toESM(require("fs"));
25
36
  var import_browserContext = require("./browserContext");
26
37
  var import_download = require("./download");
27
38
  var import_instrumentation = require("./instrumentation");
28
- var import_page = require("./page");
29
39
  var import_socksClientCertificatesInterceptor = require("./socksClientCertificatesInterceptor");
40
+ var import_playwrightPipeServer = require("../remote/playwrightPipeServer");
41
+ var import_playwrightWebSocketServer = require("../remote/playwrightWebSocketServer");
42
+ var import_serverRegistry = require("../serverRegistry");
43
+ var import_fileUtils = require("./utils/fileUtils");
44
+ var import_utils = require("../utils");
30
45
  class Browser extends import_instrumentation.SdkObject {
31
46
  constructor(parent, options) {
32
47
  super(parent, "browser");
33
48
  this._downloads = /* @__PURE__ */ new Map();
34
49
  this._defaultContext = null;
35
50
  this._startedClosing = false;
36
- this._idToVideo = /* @__PURE__ */ new Map();
37
51
  this._isCollocatedWithServer = true;
38
52
  this.attribution.browser = this;
39
53
  this.options = options;
40
54
  this.instrumentation.onBrowserOpen(this);
55
+ this._server = new BrowserServer(this);
41
56
  }
42
57
  static {
43
58
  this.Events = {
@@ -88,8 +103,8 @@ class Browser extends import_instrumentation.SdkObject {
88
103
  contextForReuse() {
89
104
  return this._contextForReuse?.context;
90
105
  }
91
- _downloadCreated(page, uuid, url, suggestedFilename) {
92
- const download = new import_download.Download(page, this.options.downloadsPath || "", uuid, url, suggestedFilename);
106
+ _downloadCreated(page, uuid, url, suggestedFilename, downloadFilename) {
107
+ const download = new import_download.Download(page, this.options.downloadsPath || "", uuid, url, suggestedFilename, downloadFilename);
93
108
  this._downloads.set(uuid, download);
94
109
  }
95
110
  _downloadFilenameSuggested(uuid, suggestedFilename) {
@@ -105,27 +120,19 @@ class Browser extends import_instrumentation.SdkObject {
105
120
  download.artifact.reportFinished(error ? new Error(error) : void 0);
106
121
  this._downloads.delete(uuid);
107
122
  }
108
- _videoStarted(context, videoId, path, pageOrError) {
109
- const artifact = new import_artifact.Artifact(context, path);
110
- this._idToVideo.set(videoId, { context, artifact });
111
- pageOrError.then((page) => {
112
- if (page instanceof import_page.Page) {
113
- page.video = artifact;
114
- page.emitOnContext(import_browserContext.BrowserContext.Events.VideoStarted, artifact);
115
- page.emit(import_page.Page.Events.Video, artifact);
116
- }
117
- });
123
+ async startServer(title, options) {
124
+ return await this._server.start(title, options);
118
125
  }
119
- _takeVideo(videoId) {
120
- const video = this._idToVideo.get(videoId);
121
- this._idToVideo.delete(videoId);
122
- return video?.artifact;
126
+ async stopServer() {
127
+ await this._server.stop();
123
128
  }
124
129
  _didClose() {
125
130
  for (const context of this.contexts())
126
131
  context._browserClosed();
127
132
  if (this._defaultContext)
128
133
  this._defaultContext._browserClosed();
134
+ this.stopServer().catch(() => {
135
+ });
129
136
  this.emit(Browser.Events.Disconnected);
130
137
  this.instrumentation.onBrowserClose(this);
131
138
  }
@@ -143,7 +150,63 @@ class Browser extends import_instrumentation.SdkObject {
143
150
  await this.options.browserProcess.kill();
144
151
  }
145
152
  }
153
+ class BrowserServer {
154
+ constructor(browser) {
155
+ this._isStarted = false;
156
+ this._browser = browser;
157
+ }
158
+ async start(title, options) {
159
+ if (this._isStarted)
160
+ throw new Error(`Server is already started.`);
161
+ this._isStarted = true;
162
+ let endpoint;
163
+ if (options.host !== void 0 || options.port !== void 0) {
164
+ this._wsServer = new import_playwrightWebSocketServer.PlaywrightWebSocketServer(this._browser, "/");
165
+ endpoint = await this._wsServer.listen(options.port ?? 0, options.host, (0, import_utils.createGuid)());
166
+ } else {
167
+ this._pipeServer = new import_playwrightPipeServer.PlaywrightPipeServer(this._browser);
168
+ this._pipeSocketPath = await this._socketPath();
169
+ await this._pipeServer.listen(this._pipeSocketPath);
170
+ endpoint = this._pipeSocketPath;
171
+ }
172
+ const browserInfo = {
173
+ guid: this._browser.guid,
174
+ browserName: this._browser.options.browserType,
175
+ launchOptions: asClientLaunchOptions(this._browser.options.originalLaunchOptions),
176
+ userDataDir: this._browser.options.userDataDir
177
+ };
178
+ await import_serverRegistry.serverRegistry.create(browserInfo, {
179
+ title,
180
+ endpoint,
181
+ workspaceDir: options.workspaceDir,
182
+ metadata: options.metadata
183
+ });
184
+ return { endpoint };
185
+ }
186
+ async stop() {
187
+ if (!this._browser.options.userDataDir)
188
+ await import_serverRegistry.serverRegistry.delete(this._browser.guid);
189
+ if (this._pipeSocketPath && process.platform !== "win32")
190
+ await import_fs.default.promises.unlink(this._pipeSocketPath).catch(() => {
191
+ });
192
+ await this._pipeServer?.close();
193
+ await this._wsServer?.close();
194
+ this._pipeServer = void 0;
195
+ this._wsServer = void 0;
196
+ this._isStarted = false;
197
+ }
198
+ async _socketPath() {
199
+ return (0, import_fileUtils.makeSocketPath)("browser", this._browser.guid.slice(0, 14));
200
+ }
201
+ }
202
+ function asClientLaunchOptions(serverOptions) {
203
+ return {
204
+ ...serverOptions,
205
+ env: serverOptions.env ? Object.fromEntries(serverOptions.env.map(({ name, value }) => [name, value])) : void 0
206
+ };
207
+ }
146
208
  // Annotate the CommonJS export names for ESM import in node:
147
209
  0 && (module.exports = {
148
- Browser
210
+ Browser,
211
+ BrowserServer
149
212
  });