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
@@ -29,7 +29,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  var crBrowser_exports = {};
30
30
  __export(crBrowser_exports, {
31
31
  CRBrowser: () => CRBrowser,
32
- CRBrowserContext: () => CRBrowserContext
32
+ CRBrowserContext: () => CRBrowserContext,
33
+ shouldProxyLoopback: () => shouldProxyLoopback
33
34
  });
34
35
  module.exports = __toCommonJS(crBrowser_exports);
35
36
  var import_path = __toESM(require("path"));
@@ -54,6 +55,7 @@ class CRBrowser extends import_browser.Browser {
54
55
  this._serviceWorkers = /* @__PURE__ */ new Map();
55
56
  this._version = "";
56
57
  this._majorVersion = 0;
58
+ this._revision = "";
57
59
  this._tracingRecording = false;
58
60
  this._userAgent = "";
59
61
  this._connection = connection;
@@ -75,6 +77,7 @@ class CRBrowser extends import_browser.Browser {
75
77
  if (options.__testHookOnConnectToBrowser)
76
78
  await options.__testHookOnConnectToBrowser();
77
79
  const version = await session.send("Browser.getVersion");
80
+ browser._revision = version.revision;
78
81
  browser._version = version.product.substring(version.product.indexOf("/") + 1);
79
82
  try {
80
83
  browser._majorVersion = +browser._version.split(".")[0];
@@ -100,10 +103,10 @@ class CRBrowser extends import_browser.Browser {
100
103
  const proxy = options.proxyOverride || options.proxy;
101
104
  let proxyBypassList = void 0;
102
105
  if (proxy) {
103
- if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK)
104
- proxyBypassList = proxy.bypass;
105
- else
106
+ if (shouldProxyLoopback(proxy.bypass))
106
107
  proxyBypassList = "<-loopback>" + (proxy.bypass ? `,${proxy.bypass}` : "");
108
+ else
109
+ proxyBypassList = proxy.bypass;
107
110
  }
108
111
  const { browserContextId } = await this._session.send("Target.createBrowserContext", {
109
112
  disposeOnDetach: true,
@@ -284,11 +287,12 @@ class CRBrowser extends import_browser.Browser {
284
287
  return this._clientRootSessionPromise;
285
288
  }
286
289
  }
290
+ const CREvents = {
291
+ ServiceWorker: "serviceworker"
292
+ };
287
293
  class CRBrowserContext extends import_browserContext.BrowserContext {
288
294
  static {
289
- this.CREvents = {
290
- ServiceWorker: "serviceworker"
291
- };
295
+ this.CREvents = CREvents;
292
296
  }
293
297
  constructor(browser, browserContextId, options) {
294
298
  super(browser, options, browserContextId);
@@ -388,15 +392,25 @@ class CRBrowserContext extends import_browserContext.BrowserContext {
388
392
  ["midi-sysex", "midiSysex"],
389
393
  ["storage-access", "storageAccess"],
390
394
  ["local-fonts", "localFonts"],
391
- ["local-network-access", "localNetworkAccess"]
395
+ ["local-network-access", ["localNetworkAccess", "localNetwork", "loopbackNetwork"]],
396
+ ["screen-wake-lock", "wakeLockScreen"]
392
397
  ]);
393
- const filtered = permissions.map((permission) => {
394
- const protocolPermission = webPermissionToProtocol.get(permission);
395
- if (!protocolPermission)
396
- throw new Error("Unknown permission: " + permission);
397
- return protocolPermission;
398
- });
399
- await this._browser._session.send("Browser.grantPermissions", { origin: origin === "*" ? void 0 : origin, browserContextId: this._browserContextId, permissions: filtered });
398
+ const grantPermissions = async (mapping) => {
399
+ const filtered = permissions.flatMap((permission) => {
400
+ const protocolPermission = mapping.get(permission);
401
+ if (!protocolPermission)
402
+ throw new Error("Unknown permission: " + permission);
403
+ return typeof protocolPermission === "string" ? [protocolPermission] : protocolPermission;
404
+ });
405
+ await this._browser._session.send("Browser.grantPermissions", { origin: origin === "*" ? void 0 : origin, browserContextId: this._browserContextId, permissions: filtered });
406
+ };
407
+ try {
408
+ await grantPermissions(webPermissionToProtocol);
409
+ } catch (e) {
410
+ const fallbackMapping = new Map(webPermissionToProtocol);
411
+ fallbackMapping.set("local-network-access", ["localNetworkAccess"]);
412
+ await grantPermissions(fallbackMapping);
413
+ }
400
414
  }
401
415
  async doClearPermissions() {
402
416
  await this._browser._session.send("Browser.resetPermissions", { browserContextId: this._browserContextId });
@@ -436,7 +450,8 @@ class CRBrowserContext extends import_browserContext.BrowserContext {
436
450
  await page.delegate.addInitScript(initScript);
437
451
  }
438
452
  async doRemoveInitScripts(initScripts) {
439
- for (const page of this.pages()) await page.delegate.removeInitScripts();
453
+ for (const page of this.pages())
454
+ await page.delegate.removeInitScripts(initScripts);
440
455
  }
441
456
  async doUpdateRequestInterception() {
442
457
  for (const page of this.pages())
@@ -455,7 +470,6 @@ class CRBrowserContext extends import_browserContext.BrowserContext {
455
470
  async doClose(reason) {
456
471
  await this.dialogManager.closeBeforeUnloadDialogs();
457
472
  if (!this._browserContextId) {
458
- await this.stopVideoRecording();
459
473
  await this._browser.close({ reason });
460
474
  return;
461
475
  }
@@ -468,9 +482,6 @@ class CRBrowserContext extends import_browserContext.BrowserContext {
468
482
  this._browser._serviceWorkers.delete(targetId);
469
483
  }
470
484
  }
471
- async stopVideoRecording() {
472
- await Promise.all(this._crPages().map((crPage) => crPage._mainFrameSession._stopVideoRecording()));
473
- }
474
485
  onClosePersistent() {
475
486
  }
476
487
  async clearCache() {
@@ -501,15 +512,17 @@ class CRBrowserContext extends import_browserContext.BrowserContext {
501
512
  const rootSession = await this._browser._clientRootSession();
502
513
  return rootSession.attachToTarget(targetId);
503
514
  }
504
- async doExposeBinding(binding) {
505
- for (const page of this.pages()) await page.delegate.exposeBinding(binding);
506
- }
507
- async doRemoveExposedBindings() {
508
- for (const page of this.pages()) await page.delegate.removeExposedBindings();
509
- }
515
+ }
516
+ function shouldProxyLoopback(bypass) {
517
+ if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK)
518
+ return false;
519
+ const hosts = (bypass || "").split(",").map((s) => s.trim());
520
+ const shouldBypassSomeLoopback = ["localhost", "127.0.0.1", "::1", "[::]", "[::1]", "<loopback>", "<-loopback>"].some((host) => hosts.includes(host));
521
+ return !shouldBypassSomeLoopback;
510
522
  }
511
523
  // Annotate the CommonJS export names for ESM import in node:
512
524
  0 && (module.exports = {
513
525
  CRBrowser,
514
- CRBrowserContext
526
+ CRBrowserContext,
527
+ shouldProxyLoopback
515
528
  });
@@ -94,11 +94,6 @@ class CRSession extends import_instrumentation.SdkObject {
94
94
  this._parentSession = parentSession;
95
95
  this._sessionId = sessionId;
96
96
  this._eventListener = eventListener;
97
- this.on = super.on;
98
- this.addListener = super.addListener;
99
- this.off = super.removeListener;
100
- this.removeListener = super.removeListener;
101
- this.once = super.once;
102
97
  }
103
98
  _markAsCrashed() {
104
99
  this._crashed = true;
@@ -44,8 +44,6 @@ class CRDevTools {
44
44
  return;
45
45
  const parsed = JSON.parse(event.payload);
46
46
  let result = void 0;
47
- if (this.__testHookOnBinding)
48
- this.__testHookOnBinding(parsed);
49
47
  if (parsed.method === "getPreferences") {
50
48
  if (this._prefs === void 0) {
51
49
  try {
@@ -72,6 +70,7 @@ class CRDevTools {
72
70
  }).catch((e) => null);
73
71
  });
74
72
  Promise.all([
73
+ session.send("Runtime.enable"),
75
74
  session.send("Runtime.addBinding", { name: kBindingName }),
76
75
  session.send("Page.enable"),
77
76
  session.send("Page.addScriptToEvaluateOnNewDocument", { source: `
@@ -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
  }
@@ -153,7 +151,7 @@ class CRNetworkManager {
153
151
  const enabled = this._protocolRequestInterceptionEnabled;
154
152
  if (initial && !enabled)
155
153
  return;
156
- const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: false });
154
+ const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: enabled });
157
155
  let fetchPromise = Promise.resolve(void 0);
158
156
  if (!info.workerFrame) {
159
157
  if (enabled)
@@ -228,7 +226,6 @@ class CRNetworkManager {
228
226
  return !this._credentials.origin || new URL(url).origin.toLowerCase() === this._credentials.origin.toLowerCase();
229
227
  }
230
228
  _onRequestPaused(sessionInfo, event) {
231
- if (this._alreadyTrackedNetworkIds.has(event.networkId)) return;
232
229
  if (!event.networkId) {
233
230
  sessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
234
231
  return;
@@ -242,7 +239,7 @@ class CRNetworkManager {
242
239
  this._requestIdToRequestWillBeSentEvent.delete(requestId);
243
240
  } else {
244
241
  const existingRequest = this._requestIdToRequest.get(requestId);
245
- const alreadyContinuedParams = existingRequest?._route?._alreadyContinuedParams;
242
+ const alreadyContinuedParams = existingRequest?._originalRequestRoute?._alreadyContinuedParams;
246
243
  if (alreadyContinuedParams && !event.redirectedRequestId) {
247
244
  sessionInfo.session._sendMayFail("Fetch.continueRequest", {
248
245
  ...alreadyContinuedParams,
@@ -254,7 +251,6 @@ class CRNetworkManager {
254
251
  }
255
252
  }
256
253
  _onRequest(requestWillBeSentSessionInfo, requestWillBeSentEvent, requestPausedSessionInfo, requestPausedEvent) {
257
- if (this._alreadyTrackedNetworkIds.has(requestWillBeSentEvent.initiator.requestId)) return;
258
254
  if (requestWillBeSentEvent.request.url.startsWith("data:"))
259
255
  return;
260
256
  let redirectedFrom = null;
@@ -300,9 +296,13 @@ class CRNetworkManager {
300
296
  if (requestPausedEvent) {
301
297
  if (redirectedFrom || !this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled) {
302
298
  headersOverride = redirectedFrom?._originalRequestRoute?._alreadyContinuedParams?.headers;
299
+ if (headersOverride) {
300
+ const originalHeaders = Object.entries(requestPausedEvent.request.headers).map(([name, value]) => ({ name, value }));
301
+ headersOverride = network.applyHeadersOverrides(originalHeaders, headersOverride);
302
+ }
303
303
  requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId, headers: headersOverride });
304
304
  } else {
305
- route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId, this._page, requestPausedEvent.networkId, this);
305
+ route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId);
306
306
  }
307
307
  }
308
308
  const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type === "Document";
@@ -333,7 +333,7 @@ class CRNetworkManager {
333
333
  const response2 = await session.send("Network.getResponseBody", { requestId: request._requestId });
334
334
  if (response2.body || !expectedLength)
335
335
  return Buffer.from(response2.body, response2.base64Encoded ? "base64" : "utf8");
336
- if (request._route?._fulfilled)
336
+ if (request._originalRequestRoute?._fulfilled)
337
337
  return Buffer.from("");
338
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 } });
339
339
  const chunks = [];
@@ -372,7 +372,8 @@ class CRNetworkManager {
372
372
  responseStart: -1
373
373
  };
374
374
  }
375
- 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);
376
377
  if (responsePayload?.remoteIPAddress && typeof responsePayload?.remotePort === "number") {
377
378
  response._serverAddrFinished({
378
379
  ipAddress: responsePayload.remoteIPAddress,
@@ -478,7 +479,6 @@ class InterceptableRequest {
478
479
  this._requestId = requestWillBeSentEvent.requestId;
479
480
  this._interceptionId = requestPausedEvent && requestPausedEvent.requestId;
480
481
  this._documentId = documentId;
481
- this._route = route;
482
482
  this._originalRequestRoute = route ?? redirectedFrom?._originalRequestRoute;
483
483
  const {
484
484
  headers,
@@ -486,26 +486,18 @@ class InterceptableRequest {
486
486
  url,
487
487
  postDataEntries = null
488
488
  } = requestPausedEvent ? requestPausedEvent.request : requestWillBeSentEvent.request;
489
- const type = (requestWillBeSentEvent.type || "").toLowerCase();
490
489
  let postDataBuffer = null;
491
490
  const entries = postDataEntries?.filter((entry) => entry.bytes);
492
491
  if (entries && entries.length)
493
492
  postDataBuffer = Buffer.concat(entries.map((entry) => Buffer.from(entry.bytes, "base64")));
494
- this.request = new network.Request(context, frame, serviceWorker, redirectedFrom?.request || null, documentId, url, type, method, postDataBuffer, headersOverride || (0, import_utils.headersObjectToArray)(headers));
493
+ this.request = new network.Request(context, frame, serviceWorker, redirectedFrom?.request || null, documentId, url, toResourceType(requestWillBeSentEvent.type || "Other"), method, postDataBuffer, headersOverride || (0, import_utils.headersObjectToArray)(headers));
495
494
  }
496
495
  }
497
496
  class RouteImpl {
498
- constructor(session, interceptionId, page, networkId, sessionManager) {
497
+ constructor(session, interceptionId) {
499
498
  this._fulfilled = false;
500
- this._sessionManager = void 0;
501
- this._networkId = void 0;
502
- this._page = void 0;
503
499
  this._session = session;
504
500
  this._interceptionId = interceptionId;
505
- this._page = page;
506
- this._networkId = networkId;
507
- this._sessionManager = sessionManager;
508
- import_eventsHelper.eventsHelper.addEventListener(this._session, "Fetch.requestPaused", async (e) => await this._networkRequestIntercepted(e));
509
501
  }
510
502
  async continue(overrides) {
511
503
  this._alreadyContinuedParams = {
@@ -515,117 +507,17 @@ class RouteImpl {
515
507
  method: overrides.method,
516
508
  postData: overrides.postData ? overrides.postData.toString("base64") : void 0
517
509
  };
518
- if (overrides.url && (overrides.url === "http://patchright-init-script-inject.internal/" || overrides.url === "https://patchright-init-script-inject.internal/")) {
519
- await catchDisallowedErrors(async () => {
520
- this._sessionManager._alreadyTrackedNetworkIds.add(this._networkId);
521
- this._session._sendMayFail("Fetch.continueRequest", { requestId: this._interceptionId, interceptResponse: true });
522
- });
523
- } else {
524
- await catchDisallowedErrors(async () => {
525
- await this._session._sendMayFail("Fetch.continueRequest", this._alreadyContinuedParams);
526
- });
527
- }
510
+ await catchDisallowedErrors(async () => {
511
+ await this._session.send("Fetch.continueRequest", this._alreadyContinuedParams);
512
+ });
528
513
  }
529
514
  async fulfill(response) {
530
- const isTextHtml = response.headers.some((header) => header.name.toLowerCase() === "content-type" && header.value.includes("text/html"));
531
- var allInjections = [...this._page.delegate._mainFrameSession._evaluateOnNewDocumentScripts];
532
- for (const binding of this._page.delegate._browserContext._pageBindings.values()) {
533
- if (!allInjections.includes(binding)) allInjections.push(binding);
534
- }
535
- if (isTextHtml && allInjections.length) {
536
- let useNonce = false;
537
- let scriptNonce = null;
538
- if (response.isBase64) {
539
- response.isBase64 = false;
540
- response.body = Buffer.from(response.body, "base64").toString("utf-8");
541
- }
542
- const cspHeaderNames = ["content-security-policy", "content-security-policy-report-only"];
543
- for (let i = 0; i < response.headers.length; i++) {
544
- const headerName = response.headers[i].name.toLowerCase();
545
- if (cspHeaderNames.includes(headerName)) {
546
- const originalCsp = response.headers[i].value || "";
547
- if (!useNonce) {
548
- const nonceMatch = originalCsp.match(/script-src[^;]*'nonce-([^'"\s;]+)'/i);
549
- if (nonceMatch && nonceMatch[1]) {
550
- scriptNonce = nonceMatch[1];
551
- useNonce = true;
552
- }
553
- }
554
- const fixedCsp = this._fixCSP(originalCsp, scriptNonce);
555
- response.headers[i].value = fixedCsp;
556
- }
557
- }
558
- if (typeof response.body === "string" && response.body.length) {
559
- response.body = response.body.replace(
560
- /<meta[^>]*http-equiv=(?:"|')?Content-Security-Policy(?:"|')?[^>]*>/gi,
561
- (match) => {
562
- const contentMatch = match.match(/content=(?:"|')([^"']*)(?:"|')/i);
563
- if (contentMatch && contentMatch[1]) {
564
- let originalCsp = contentMatch[1];
565
- 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)));
566
- if (!useNonce) {
567
- const nonceMatch = originalCsp.match(/script-src[^;]*'nonce-([^'"\s;]+)'/i);
568
- if (nonceMatch && nonceMatch[1]) {
569
- scriptNonce = nonceMatch[1];
570
- useNonce = true;
571
- }
572
- }
573
- const fixedCsp = this._fixCSP(originalCsp, scriptNonce);
574
- const encodedCsp = fixedCsp.replace(/'/g, "&#x27;").replace(/"/g, "&#x22;");
575
- return match.replace(contentMatch[1], encodedCsp);
576
- }
577
- return match;
578
- }
579
- );
580
- }
581
- let injectionHTML = "";
582
- allInjections.forEach((script) => {
583
- let scriptId = import_crypto.default.randomBytes(22).toString("hex");
584
- let scriptSource = script.source || script;
585
- const nonceAttr = useNonce ? `nonce="${scriptNonce}"` : "";
586
- injectionHTML += `<script class="${this._page.delegate.initScriptTag}" ${nonceAttr} id="${scriptId}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${scriptSource}</script>`;
587
- });
588
- const lower = response.body.toLowerCase();
589
- const headStartIndex = lower.indexOf("<head");
590
- if (headStartIndex !== -1) {
591
- const headEndTagIndex = lower.indexOf("</head>", headStartIndex);
592
- if (headEndTagIndex !== -1) {
593
- const headOpenEnd = response.body.indexOf(">", headStartIndex) + 1;
594
- const headContent = response.body.slice(headOpenEnd, headEndTagIndex);
595
- const headContentLower = headContent.toLowerCase();
596
- const firstScriptIndex = headContentLower.indexOf("<script");
597
- if (firstScriptIndex !== -1) {
598
- const insertPosition = headOpenEnd + firstScriptIndex;
599
- response.body = response.body.slice(0, insertPosition) + injectionHTML + response.body.slice(insertPosition);
600
- } else {
601
- response.body = response.body.slice(0, headEndTagIndex) + injectionHTML + response.body.slice(headEndTagIndex);
602
- }
603
- } else {
604
- const headStartTagEnd = response.body.indexOf(">", headStartIndex) + 1;
605
- response.body = response.body.slice(0, headStartTagEnd) + injectionHTML + response.body.slice(headStartTagEnd);
606
- }
607
- } else {
608
- const doctypeIndex = lower.indexOf("<!doctype");
609
- if (doctypeIndex === 0) {
610
- const doctypeEnd = response.body.indexOf(">", doctypeIndex) + 1;
611
- response.body = response.body.slice(0, doctypeEnd) + injectionHTML + response.body.slice(doctypeEnd);
612
- } else {
613
- const htmlIndex = lower.indexOf("<html");
614
- if (htmlIndex !== -1) {
615
- const htmlTagEnd = response.body.indexOf(">", htmlIndex) + 1;
616
- response.body = response.body.slice(0, htmlTagEnd) + `<head>${injectionHTML}</head>` + response.body.slice(htmlTagEnd);
617
- } else {
618
- response.body = injectionHTML + response.body;
619
- }
620
- }
621
- }
622
- }
623
515
  this._fulfilled = true;
624
516
  const body = response.isBase64 ? response.body : Buffer.from(response.body).toString("base64");
625
517
  const responseHeaders = splitSetCookieHeader(response.headers);
626
518
  await catchDisallowedErrors(async () => {
627
519
  await this._session.send("Fetch.fulfillRequest", {
628
- requestId: response.interceptionId ? response.interceptionId : this._interceptionId,
520
+ requestId: this._interceptionId,
629
521
  responseCode: response.status,
630
522
  responsePhrase: network.statusText(response.status),
631
523
  responseHeaders,
@@ -643,111 +535,6 @@ class RouteImpl {
643
535
  });
644
536
  });
645
537
  }
646
- _fixCSP(csp, scriptNonce) {
647
- if (!csp || typeof csp !== "string") return csp;
648
- const directives = csp.split(";").map((d) => d.trim()).filter((d) => d && d.length > 0);
649
- const fixedDirectives = [];
650
- let hasScriptSrc = false;
651
- for (let directive of directives) {
652
- if (!directive.trim()) continue;
653
- const directiveMatch = directive.match(/^([a-zA-Z-]+)\s+(.*)$/);
654
- if (!directiveMatch) {
655
- fixedDirectives.push(directive);
656
- continue;
657
- }
658
- const directiveName = directiveMatch[1].toLowerCase();
659
- const directiveValues = directiveMatch[2].split(/\s+/).filter((v) => v.length > 0);
660
- switch (directiveName) {
661
- case "script-src":
662
- hasScriptSrc = true;
663
- let values = [...directiveValues];
664
- if (scriptNonce && !values.some((v) => v.includes(`nonce-${scriptNonce}`))) {
665
- values.push(`'nonce-${scriptNonce}'`);
666
- }
667
- if (!values.includes("'unsafe-eval'")) {
668
- values.push("'unsafe-eval'");
669
- }
670
- if (!values.includes("'unsafe-inline'") && !scriptNonce) {
671
- values.push("'unsafe-inline'");
672
- }
673
- if (!values.includes("*") && !values.includes("'self'") && !values.some((v) => v.includes("https:"))) {
674
- values.push("*");
675
- }
676
- fixedDirectives.push(`script-src ${values.join(" ")}`);
677
- break;
678
- case "style-src":
679
- let styleValues = [...directiveValues];
680
- if (!styleValues.includes("'unsafe-inline'")) {
681
- styleValues.push("'unsafe-inline'");
682
- }
683
- fixedDirectives.push(`style-src ${styleValues.join(" ")}`);
684
- break;
685
- case "img-src":
686
- let imgValues = [...directiveValues];
687
- if (!imgValues.includes("data:") && !imgValues.includes("*")) {
688
- imgValues.push("data:");
689
- }
690
- fixedDirectives.push(`img-src ${imgValues.join(" ")}`);
691
- break;
692
- case "font-src":
693
- let fontValues = [...directiveValues];
694
- if (!fontValues.includes("data:") && !fontValues.includes("*")) {
695
- fontValues.push("data:");
696
- }
697
- fixedDirectives.push(`font-src ${fontValues.join(" ")}`);
698
- break;
699
- case "connect-src":
700
- let connectValues = [...directiveValues];
701
- const hasWs = connectValues.some((v) => v.includes("ws:") || v.includes("wss:") || v === "*");
702
- if (!hasWs) {
703
- connectValues.push("ws:", "wss:");
704
- }
705
- fixedDirectives.push(`connect-src ${connectValues.join(" ")}`);
706
- break;
707
- case "frame-ancestors":
708
- let frameAncestorValues = [...directiveValues];
709
- if (frameAncestorValues.includes("'none'")) {
710
- frameAncestorValues = ["'self'"];
711
- }
712
- fixedDirectives.push(`frame-ancestors ${frameAncestorValues.join(" ")}`);
713
- break;
714
- default:
715
- fixedDirectives.push(directive);
716
- break;
717
- }
718
- }
719
- if (!hasScriptSrc) {
720
- if (scriptNonce) {
721
- fixedDirectives.push(`script-src 'self' 'unsafe-eval' 'nonce-${scriptNonce}' *`);
722
- } else {
723
- fixedDirectives.push(`script-src 'self' 'unsafe-eval' 'unsafe-inline' *`);
724
- }
725
- }
726
- return fixedDirectives.join("; ");
727
- }
728
- async _networkRequestIntercepted(event) {
729
- if (event.resourceType !== "Document") {
730
- return;
731
- }
732
- if (this._networkId != event.networkId || !this._sessionManager._alreadyTrackedNetworkIds.has(event.networkId)) return;
733
- try {
734
- if (event.responseStatusCode >= 301 && event.responseStatusCode <= 308 || event.redirectedRequestId && !event.responseStatusCode) {
735
- await this._session.send("Fetch.continueRequest", { requestId: event.requestId, interceptResponse: true });
736
- } else {
737
- const responseBody = await this._session.send("Fetch.getResponseBody", { requestId: event.requestId });
738
- await this.fulfill({
739
- headers: event.responseHeaders,
740
- isBase64: true,
741
- body: responseBody.body,
742
- status: event.responseStatusCode,
743
- interceptionId: event.requestId,
744
- resourceType: event.resourceType
745
- });
746
- }
747
- } catch (error) {
748
- await this._session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
749
- }
750
- }
751
538
  }
752
539
  async function catchDisallowedErrors(callback) {
753
540
  try {
@@ -876,6 +663,44 @@ class ResponseExtraInfoTracker {
876
663
  this._requests.delete(requestId);
877
664
  }
878
665
  }
666
+ function toResourceType(type) {
667
+ switch (type) {
668
+ case "Document":
669
+ return "document";
670
+ case "Stylesheet":
671
+ return "stylesheet";
672
+ case "Image":
673
+ return "image";
674
+ case "Media":
675
+ return "media";
676
+ case "Font":
677
+ return "font";
678
+ case "Script":
679
+ return "script";
680
+ case "TextTrack":
681
+ return "texttrack";
682
+ case "XHR":
683
+ return "xhr";
684
+ case "Fetch":
685
+ return "fetch";
686
+ case "EventSource":
687
+ return "eventsource";
688
+ case "WebSocket":
689
+ return "websocket";
690
+ case "Manifest":
691
+ return "manifest";
692
+ case "Ping":
693
+ return "ping";
694
+ case "CSPViolationReport":
695
+ return "cspreport";
696
+ case "Prefetch":
697
+ case "SignedExchange":
698
+ case "Preflight":
699
+ case "FedCM":
700
+ default:
701
+ return "other";
702
+ }
703
+ }
879
704
  // Annotate the CommonJS export names for ESM import in node:
880
705
  0 && (module.exports = {
881
706
  CRNetworkManager