patchright-core 1.58.2 → 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 (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 +8 -6
  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.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
  256. package/lib/vite/traceViewer/{index.BtyWtaE-.js → index.Dtstcb7U.js} +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
@@ -31,7 +31,6 @@ __export(crNetworkManager_exports, {
31
31
  CRNetworkManager: () => CRNetworkManager
32
32
  });
33
33
  module.exports = __toCommonJS(crNetworkManager_exports);
34
- var import_crypto = __toESM(require("crypto"));
35
34
  var import_utils = require("../../utils");
36
35
  var import_eventsHelper = require("../utils/eventsHelper");
37
36
  var import_helper = require("../helper");
@@ -50,7 +49,6 @@ class CRNetworkManager {
50
49
  this._requestIdToRequestPausedEvent = /* @__PURE__ */ new Map();
51
50
  this._responseExtraInfoTracker = new ResponseExtraInfoTracker();
52
51
  this._sessions = /* @__PURE__ */ new Map();
53
- this._alreadyTrackedNetworkIds = /* @__PURE__ */ new Set();
54
52
  this._page = page;
55
53
  this._serviceWorker = serviceWorker;
56
54
  }
@@ -141,8 +139,6 @@ class CRNetworkManager {
141
139
  async setRequestInterception(value) {
142
140
  this._userRequestInterceptionEnabled = value;
143
141
  await this._updateProtocolRequestInterception();
144
- if (this._page)
145
- await this._forEachSession((info) => info.session.send("Network.setCacheDisabled", { cacheDisabled: this._page.needsRequestInterception() }));
146
142
  }
147
143
  async _updateProtocolRequestInterception() {
148
144
  const enabled = this._userRequestInterceptionEnabled || !!this._credentials;
@@ -155,9 +151,7 @@ class CRNetworkManager {
155
151
  const enabled = this._protocolRequestInterceptionEnabled;
156
152
  if (initial && !enabled)
157
153
  return;
158
- const hasHarRecorders = !!this._page?.browserContext?._harRecorders?.size;
159
- const userInterception = this._page ? this._page.needsRequestInterception() : false;
160
- const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: userInterception || hasHarRecorders });
154
+ const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: enabled });
161
155
  let fetchPromise = Promise.resolve(void 0);
162
156
  if (!info.workerFrame) {
163
157
  if (enabled)
@@ -232,7 +226,6 @@ class CRNetworkManager {
232
226
  return !this._credentials.origin || new URL(url).origin.toLowerCase() === this._credentials.origin.toLowerCase();
233
227
  }
234
228
  _onRequestPaused(sessionInfo, event) {
235
- if (this._alreadyTrackedNetworkIds.has(event.networkId)) return;
236
229
  if (!event.networkId) {
237
230
  sessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
238
231
  return;
@@ -246,7 +239,7 @@ class CRNetworkManager {
246
239
  this._requestIdToRequestWillBeSentEvent.delete(requestId);
247
240
  } else {
248
241
  const existingRequest = this._requestIdToRequest.get(requestId);
249
- const alreadyContinuedParams = existingRequest?._route?._alreadyContinuedParams;
242
+ const alreadyContinuedParams = existingRequest?._originalRequestRoute?._alreadyContinuedParams;
250
243
  if (alreadyContinuedParams && !event.redirectedRequestId) {
251
244
  sessionInfo.session._sendMayFail("Fetch.continueRequest", {
252
245
  ...alreadyContinuedParams,
@@ -258,7 +251,6 @@ class CRNetworkManager {
258
251
  }
259
252
  }
260
253
  _onRequest(requestWillBeSentSessionInfo, requestWillBeSentEvent, requestPausedSessionInfo, requestPausedEvent) {
261
- if (this._alreadyTrackedNetworkIds.has(requestWillBeSentEvent.initiator.requestId)) return;
262
254
  if (requestWillBeSentEvent.request.url.startsWith("data:"))
263
255
  return;
264
256
  let redirectedFrom = null;
@@ -269,17 +261,13 @@ class CRNetworkManager {
269
261
  redirectedFrom = request2;
270
262
  }
271
263
  }
272
- const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === "OPTIONS" && requestWillBeSentEvent.initiator.type === "preflight";
273
- if (isInterceptedOptionsPreflight && !(this._page || this._serviceWorker).needsRequestInterception()) {
274
- requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId });
275
- return;
276
- }
277
264
  let frame = requestWillBeSentEvent.frameId ? this._page?.frameManager.frame(requestWillBeSentEvent.frameId) : requestWillBeSentSessionInfo.workerFrame;
278
265
  if (!frame && this._page && requestPausedEvent && requestPausedEvent.frameId)
279
266
  frame = this._page.frameManager.frame(requestPausedEvent.frameId);
280
267
  if (!frame && this._page && requestWillBeSentEvent.frameId === (this._page?.delegate)._targetId) {
281
268
  frame = this._page.frameManager.frameAttached(requestWillBeSentEvent.frameId, null);
282
269
  }
270
+ const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === "OPTIONS" && requestWillBeSentEvent.initiator.type === "preflight";
283
271
  if (isInterceptedOptionsPreflight && (this._page || this._serviceWorker).needsRequestInterception()) {
284
272
  const requestHeaders = requestPausedEvent.request.headers;
285
273
  const responseHeaders = [
@@ -314,7 +302,7 @@ class CRNetworkManager {
314
302
  }
315
303
  requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId, headers: headersOverride });
316
304
  } else {
317
- route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId, this._page, requestPausedEvent.networkId, this);
305
+ route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId);
318
306
  }
319
307
  }
320
308
  const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type === "Document";
@@ -345,7 +333,7 @@ class CRNetworkManager {
345
333
  const response2 = await session.send("Network.getResponseBody", { requestId: request._requestId });
346
334
  if (response2.body || !expectedLength)
347
335
  return Buffer.from(response2.body, response2.base64Encoded ? "base64" : "utf8");
348
- if (request._route?._fulfilled)
336
+ if (request._originalRequestRoute?._fulfilled)
349
337
  return Buffer.from("");
350
338
  const resource = await session.send("Network.loadNetworkResource", { url: request.request.url(), frameId: this._serviceWorker ? void 0 : request.request.frame()._id, options: { disableCache: false, includeCredentials: true } });
351
339
  const chunks = [];
@@ -384,7 +372,8 @@ class CRNetworkManager {
384
372
  responseStart: -1
385
373
  };
386
374
  }
387
- const response = new network.Response(request.request, responsePayload.status, responsePayload.statusText, (0, import_utils.headersObjectToArray)(responsePayload.headers), timing, getResponseBody, !!responsePayload.fromServiceWorker, responsePayload.protocol);
375
+ const response = new network.Response(request.request, responsePayload.status, responsePayload.statusText, (0, import_utils.headersObjectToArray)(responsePayload.headers), timing, getResponseBody, !!responsePayload.fromServiceWorker);
376
+ response._setHttpVersion(responsePayload?.protocol ?? null);
388
377
  if (responsePayload?.remoteIPAddress && typeof responsePayload?.remotePort === "number") {
389
378
  response._serverAddrFinished({
390
379
  ipAddress: responsePayload.remoteIPAddress,
@@ -490,7 +479,6 @@ class InterceptableRequest {
490
479
  this._requestId = requestWillBeSentEvent.requestId;
491
480
  this._interceptionId = requestPausedEvent && requestPausedEvent.requestId;
492
481
  this._documentId = documentId;
493
- this._route = route;
494
482
  this._originalRequestRoute = route ?? redirectedFrom?._originalRequestRoute;
495
483
  const {
496
484
  headers,
@@ -506,17 +494,10 @@ class InterceptableRequest {
506
494
  }
507
495
  }
508
496
  class RouteImpl {
509
- constructor(session, interceptionId, page, networkId, sessionManager) {
497
+ constructor(session, interceptionId) {
510
498
  this._fulfilled = false;
511
- this._sessionManager = void 0;
512
- this._networkId = void 0;
513
- this._page = void 0;
514
499
  this._session = session;
515
500
  this._interceptionId = interceptionId;
516
- this._page = page;
517
- this._networkId = networkId;
518
- this._sessionManager = sessionManager;
519
- import_eventsHelper.eventsHelper.addEventListener(this._session, "Fetch.requestPaused", async (e) => await this._networkRequestIntercepted(e));
520
501
  }
521
502
  async continue(overrides) {
522
503
  this._alreadyContinuedParams = {
@@ -526,138 +507,17 @@ class RouteImpl {
526
507
  method: overrides.method,
527
508
  postData: overrides.postData ? overrides.postData.toString("base64") : void 0
528
509
  };
529
- if (overrides.url && (overrides.url === "http://patchright-init-script-inject.internal/" || overrides.url === "https://patchright-init-script-inject.internal/")) {
530
- await catchDisallowedErrors(async () => {
531
- this._sessionManager._alreadyTrackedNetworkIds.add(this._networkId);
532
- this._session._sendMayFail("Fetch.continueRequest", { requestId: this._interceptionId, interceptResponse: true });
533
- });
534
- } else {
535
- await catchDisallowedErrors(async () => {
536
- await this._session._sendMayFail("Fetch.continueRequest", this._alreadyContinuedParams);
537
- });
538
- }
510
+ await catchDisallowedErrors(async () => {
511
+ await this._session.send("Fetch.continueRequest", this._alreadyContinuedParams);
512
+ });
539
513
  }
540
514
  async fulfill(response) {
541
- const isTextHtml = response.headers.some((header) => header.name.toLowerCase() === "content-type" && header.value.includes("text/html"));
542
- const pageDelegate = this._page?.delegate || null;
543
- const initScriptTag = pageDelegate?.initScriptTag || "";
544
- let allInjections = [];
545
- if (pageDelegate)
546
- allInjections = [...pageDelegate._mainFrameSession._evaluateOnNewDocumentScripts];
547
- if (isTextHtml && allInjections.length && initScriptTag) {
548
- let useNonce = false;
549
- let scriptNonce = null;
550
- if (response.isBase64) {
551
- response.isBase64 = false;
552
- response.body = Buffer.from(response.body, "base64").toString("utf-8");
553
- }
554
- const cspHeaderNames = ["content-security-policy", "content-security-policy-report-only"];
555
- for (let i = 0; i < response.headers.length; i++) {
556
- const headerName = response.headers[i].name.toLowerCase();
557
- if (cspHeaderNames.includes(headerName)) {
558
- const originalCsp = response.headers[i].value || "";
559
- if (!useNonce) {
560
- const nonceMatch = originalCsp.match(/script-src[^;]*'nonce-([^'"\s;]+)'/i);
561
- if (nonceMatch && nonceMatch[1]) {
562
- scriptNonce = nonceMatch[1];
563
- useNonce = true;
564
- }
565
- }
566
- const fixedCsp = this._fixCSP(originalCsp, scriptNonce);
567
- response.headers[i].value = fixedCsp;
568
- }
569
- }
570
- if (typeof response.body === "string" && response.body.length) {
571
- response.body = response.body.replace(
572
- /<meta[^>]*http-equiv=(?:"|')?Content-Security-Policy(?:"|')?[^>]*>/gi,
573
- (match) => {
574
- const contentMatch = match.match(/content=(?:"|')([^"']*)(?:"|')/i);
575
- if (contentMatch && contentMatch[1]) {
576
- let originalCsp = contentMatch[1];
577
- originalCsp = originalCsp.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&#x22;/g, '"').replace(/&nbsp;/g, " ").replace(/&#(d+);/g, (match2, dec) => String.fromCharCode(dec)).replace(/&#x([0-9a-fA-F]+);/g, (match2, hex) => String.fromCharCode(parseInt(hex, 16)));
578
- if (!useNonce) {
579
- const nonceMatch = originalCsp.match(/script-src[^;]*'nonce-([^'"\s;]+)'/i);
580
- if (nonceMatch && nonceMatch[1]) {
581
- scriptNonce = nonceMatch[1];
582
- useNonce = true;
583
- }
584
- }
585
- const fixedCsp = this._fixCSP(originalCsp, scriptNonce);
586
- const encodedCsp = fixedCsp.replace(/'/g, "&#x27;").replace(/"/g, "&#x22;");
587
- return match.replace(contentMatch[1], encodedCsp);
588
- }
589
- return match;
590
- }
591
- );
592
- }
593
- let injectionHTML = "";
594
- allInjections.forEach((script) => {
595
- let scriptId = import_crypto.default.randomBytes(22).toString("hex");
596
- let scriptSource = script.source || script;
597
- const nonceAttr = useNonce ? `nonce="${scriptNonce}"` : "";
598
- injectionHTML += `<script class="${initScriptTag}" ${nonceAttr} id="${scriptId}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${scriptSource}</script>`;
599
- });
600
- const lower = response.body.toLowerCase();
601
- const headStartIndex = lower.indexOf("<head");
602
- if (headStartIndex !== -1) {
603
- const headEndTagIndex = lower.indexOf("</head>", headStartIndex);
604
- if (headEndTagIndex !== -1) {
605
- const headOpenEnd = response.body.indexOf(">", headStartIndex) + 1;
606
- const headContent = response.body.slice(headOpenEnd, headEndTagIndex);
607
- const headContentLower = headContent.toLowerCase();
608
- let firstScriptIndex = -1;
609
- let searchPos = 0;
610
- const endSearchPos = headContentLower.length;
611
- while (searchPos < endSearchPos) {
612
- const commentStart = headContentLower.indexOf("<!--", searchPos);
613
- const scriptStart = headContentLower.indexOf("<script", searchPos);
614
- if (scriptStart === -1 || scriptStart >= endSearchPos) {
615
- break;
616
- }
617
- if (commentStart !== -1 && commentStart < scriptStart) {
618
- const commentEnd = headContentLower.indexOf("-->", commentStart);
619
- if (commentEnd !== -1) {
620
- searchPos = commentEnd + 3;
621
- continue;
622
- } else {
623
- break;
624
- }
625
- }
626
- firstScriptIndex = scriptStart;
627
- break;
628
- }
629
- if (firstScriptIndex !== -1) {
630
- const insertPosition = headOpenEnd + firstScriptIndex;
631
- response.body = response.body.slice(0, insertPosition) + injectionHTML + response.body.slice(insertPosition);
632
- } else {
633
- response.body = response.body.slice(0, headEndTagIndex) + injectionHTML + response.body.slice(headEndTagIndex);
634
- }
635
- } else {
636
- const headStartTagEnd = response.body.indexOf(">", headStartIndex) + 1;
637
- response.body = response.body.slice(0, headStartTagEnd) + injectionHTML + response.body.slice(headStartTagEnd);
638
- }
639
- } else {
640
- const doctypeIndex = lower.indexOf("<!doctype");
641
- if (doctypeIndex === 0) {
642
- const doctypeEnd = response.body.indexOf(">", doctypeIndex) + 1;
643
- response.body = response.body.slice(0, doctypeEnd) + injectionHTML + response.body.slice(doctypeEnd);
644
- } else {
645
- const htmlIndex = lower.indexOf("<html");
646
- if (htmlIndex !== -1) {
647
- const htmlTagEnd = response.body.indexOf(">", htmlIndex) + 1;
648
- response.body = response.body.slice(0, htmlTagEnd) + `<head>${injectionHTML}</head>` + response.body.slice(htmlTagEnd);
649
- } else {
650
- response.body = injectionHTML + response.body;
651
- }
652
- }
653
- }
654
- }
655
515
  this._fulfilled = true;
656
516
  const body = response.isBase64 ? response.body : Buffer.from(response.body).toString("base64");
657
517
  const responseHeaders = splitSetCookieHeader(response.headers);
658
518
  await catchDisallowedErrors(async () => {
659
519
  await this._session.send("Fetch.fulfillRequest", {
660
- requestId: response.interceptionId ? response.interceptionId : this._interceptionId,
520
+ requestId: this._interceptionId,
661
521
  responseCode: response.status,
662
522
  responsePhrase: network.statusText(response.status),
663
523
  responseHeaders,
@@ -675,121 +535,6 @@ class RouteImpl {
675
535
  });
676
536
  });
677
537
  }
678
- _fixCSP(csp, scriptNonce) {
679
- if (!csp || typeof csp !== "string") return csp;
680
- const directives = csp.split(";").map((d) => d.trim()).filter((d) => d && d.length > 0);
681
- const fixedDirectives = [];
682
- let hasScriptSrc = false;
683
- for (let directive of directives) {
684
- if (!directive.trim()) continue;
685
- const directiveMatch = directive.match(/^([a-zA-Z-]+)\s+(.*)$/);
686
- if (!directiveMatch) {
687
- fixedDirectives.push(directive);
688
- continue;
689
- }
690
- const directiveName = directiveMatch[1].toLowerCase();
691
- const directiveValues = directiveMatch[2].split(/\s+/).filter((v) => v.length > 0);
692
- switch (directiveName) {
693
- case "script-src":
694
- hasScriptSrc = true;
695
- let values = [...directiveValues];
696
- if (scriptNonce && !values.some((v) => v.includes(`nonce-${scriptNonce}`))) {
697
- values.push(`'nonce-${scriptNonce}'`);
698
- }
699
- if (!values.includes("'unsafe-eval'")) {
700
- values.push("'unsafe-eval'");
701
- }
702
- if (!values.includes("'unsafe-inline'") && !scriptNonce) {
703
- values.push("'unsafe-inline'");
704
- }
705
- if (!values.includes("*") && !values.includes("'self'") && !values.some((v) => v.includes("https:"))) {
706
- values.push("*");
707
- }
708
- fixedDirectives.push(`script-src ${values.join(" ")}`);
709
- break;
710
- case "style-src":
711
- let styleValues = [...directiveValues];
712
- if (!styleValues.includes("'unsafe-inline'")) {
713
- styleValues.push("'unsafe-inline'");
714
- }
715
- fixedDirectives.push(`style-src ${styleValues.join(" ")}`);
716
- break;
717
- case "img-src":
718
- let imgValues = [...directiveValues];
719
- if (!imgValues.includes("data:") && !imgValues.includes("*")) {
720
- imgValues.push("data:");
721
- }
722
- fixedDirectives.push(`img-src ${imgValues.join(" ")}`);
723
- break;
724
- case "font-src":
725
- let fontValues = [...directiveValues];
726
- if (!fontValues.includes("data:") && !fontValues.includes("*")) {
727
- fontValues.push("data:");
728
- }
729
- fixedDirectives.push(`font-src ${fontValues.join(" ")}`);
730
- break;
731
- case "connect-src":
732
- let connectValues = [...directiveValues];
733
- const hasWs = connectValues.some((v) => v.includes("ws:") || v.includes("wss:") || v === "*");
734
- if (!hasWs) {
735
- connectValues.push("ws:", "wss:");
736
- }
737
- fixedDirectives.push(`connect-src ${connectValues.join(" ")}`);
738
- break;
739
- case "frame-ancestors":
740
- let frameAncestorValues = [...directiveValues];
741
- if (frameAncestorValues.includes("'none'")) {
742
- frameAncestorValues = ["'self'"];
743
- }
744
- fixedDirectives.push(`frame-ancestors ${frameAncestorValues.join(" ")}`);
745
- break;
746
- default:
747
- fixedDirectives.push(directive);
748
- break;
749
- }
750
- }
751
- if (!hasScriptSrc) {
752
- if (scriptNonce) {
753
- fixedDirectives.push(`script-src 'self' 'unsafe-eval' 'nonce-${scriptNonce}' *`);
754
- } else {
755
- fixedDirectives.push(`script-src 'self' 'unsafe-eval' 'unsafe-inline' *`);
756
- }
757
- }
758
- return fixedDirectives.join("; ");
759
- }
760
- async _networkRequestIntercepted(event) {
761
- if (event.resourceType !== "Document") {
762
- return;
763
- }
764
- if (this._networkId != event.networkId || !this._sessionManager._alreadyTrackedNetworkIds.has(event.networkId)) return;
765
- try {
766
- const url = event.request?.url || "";
767
- const isPrivilegePage = url.startsWith("https://ntp.msn");
768
- if (isPrivilegePage) {
769
- await this._session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
770
- return;
771
- }
772
- if (event.responseStatusCode >= 301 && event.responseStatusCode <= 308 || event.redirectedRequestId && !event.responseStatusCode) {
773
- await this._session.send("Fetch.continueRequest", { requestId: event.requestId, interceptResponse: true });
774
- } else {
775
- const responseBody = await this._session.send("Fetch.getResponseBody", { requestId: event.requestId });
776
- await this.fulfill({
777
- headers: event.responseHeaders,
778
- isBase64: true,
779
- body: responseBody.body,
780
- status: event.responseStatusCode,
781
- interceptionId: event.requestId,
782
- resourceType: event.resourceType
783
- });
784
- }
785
- } catch (error) {
786
- if (error.message.includes("Can only get response body on HeadersReceived pattern matched requests.")) {
787
- await this._session.send("Fetch.continueRequest", { requestId: event.requestId, interceptResponse: true });
788
- } else {
789
- await this._session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
790
- }
791
- }
792
- }
793
538
  }
794
539
  async function catchDisallowedErrors(callback) {
795
540
  try {