patchright-core 1.52.4 → 1.55.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 (218) hide show
  1. package/ThirdPartyNotices.txt +65 -123
  2. package/bin/reinstall_chrome_beta_mac.sh +1 -1
  3. package/bin/reinstall_chrome_stable_mac.sh +1 -1
  4. package/bin/reinstall_msedge_beta_mac.sh +1 -1
  5. package/bin/reinstall_msedge_dev_mac.sh +1 -1
  6. package/bin/reinstall_msedge_stable_mac.sh +1 -1
  7. package/browsers.json +14 -14
  8. package/index.js +1 -1
  9. package/lib/androidServerImpl.js +4 -2
  10. package/lib/browserServerImpl.js +47 -12
  11. package/lib/cli/program.js +116 -50
  12. package/lib/cli/programWithTestStub.js +1 -1
  13. package/lib/client/android.js +30 -34
  14. package/lib/client/browser.js +54 -17
  15. package/lib/client/browserContext.js +67 -71
  16. package/lib/client/browserType.js +25 -34
  17. package/lib/client/channelOwner.js +20 -24
  18. package/lib/client/connection.js +6 -10
  19. package/lib/client/electron.js +8 -3
  20. package/lib/client/elementHandle.js +18 -21
  21. package/lib/client/fetch.js +5 -3
  22. package/lib/client/frame.js +57 -35
  23. package/lib/client/input.js +3 -1
  24. package/lib/client/jsHandle.js +4 -0
  25. package/lib/client/localUtils.js +0 -1
  26. package/lib/client/locator.js +32 -28
  27. package/lib/client/network.js +5 -12
  28. package/lib/client/page.js +32 -32
  29. package/lib/client/playwright.js +6 -16
  30. package/lib/client/selectors.js +18 -38
  31. package/lib/client/timeoutSettings.js +12 -8
  32. package/lib/client/tracing.js +24 -20
  33. package/lib/client/waiter.js +2 -2
  34. package/lib/client/webSocket.js +4 -22
  35. package/lib/generated/bindingsControllerSource.js +28 -0
  36. package/lib/generated/clockSource.js +1 -1
  37. package/lib/generated/injectedScriptSource.js +1 -1
  38. package/lib/generated/pollingRecorderSource.js +1 -1
  39. package/lib/generated/storageScriptSource.js +28 -0
  40. package/lib/generated/utilityScriptSource.js +1 -1
  41. package/lib/generated/webSocketMockSource.js +12 -50
  42. package/lib/inProcessFactory.js +9 -6
  43. package/lib/outofprocess.js +0 -2
  44. package/lib/protocol/validator.js +423 -346
  45. package/lib/protocol/validatorPrimitives.js +18 -4
  46. package/lib/remote/playwrightConnection.js +29 -166
  47. package/lib/remote/playwrightServer.js +233 -35
  48. package/lib/server/android/android.js +97 -83
  49. package/lib/server/android/backendAdb.js +0 -2
  50. package/lib/server/bidi/bidiBrowser.js +139 -73
  51. package/lib/server/bidi/bidiChromium.js +23 -22
  52. package/lib/server/bidi/bidiExecutionContext.js +2 -1
  53. package/lib/server/bidi/bidiFirefox.js +17 -14
  54. package/lib/server/bidi/bidiInput.js +22 -22
  55. package/lib/server/bidi/bidiNetworkManager.js +8 -11
  56. package/lib/server/bidi/bidiPage.js +42 -86
  57. package/lib/server/bidi/third_party/bidiProtocol.js +5 -133
  58. package/lib/server/bidi/third_party/bidiProtocolCore.js +179 -0
  59. package/lib/server/{dispatchers/selectorsDispatcher.js → bidi/third_party/bidiProtocolPermissions.js} +20 -18
  60. package/lib/server/browser.js +30 -21
  61. package/lib/server/browserContext.js +203 -165
  62. package/lib/server/browserType.js +109 -107
  63. package/lib/server/chromium/chromium.js +84 -69
  64. package/lib/server/chromium/chromiumSwitches.js +13 -20
  65. package/lib/server/chromium/crBrowser.js +74 -40
  66. package/lib/server/chromium/crConnection.js +8 -9
  67. package/lib/server/chromium/crCoverage.js +11 -8
  68. package/lib/server/chromium/crDragDrop.js +25 -20
  69. package/lib/server/chromium/crExecutionContext.js +2 -1
  70. package/lib/server/chromium/crInput.js +32 -29
  71. package/lib/server/chromium/crNetworkManager.js +45 -33
  72. package/lib/server/chromium/crPage.js +98 -73
  73. package/lib/server/chromium/crServiceWorker.js +13 -18
  74. package/lib/server/chromium/videoRecorder.js +10 -18
  75. package/lib/server/clock.js +51 -39
  76. package/lib/server/codegen/csharp.js +10 -5
  77. package/lib/server/codegen/java.js +1 -1
  78. package/lib/server/codegen/javascript.js +1 -1
  79. package/lib/server/codegen/jsonl.js +2 -1
  80. package/lib/server/codegen/language.js +22 -1
  81. package/lib/server/codegen/languages.js +4 -4
  82. package/lib/server/codegen/python.js +1 -1
  83. package/lib/server/cookieStore.js +3 -1
  84. package/lib/server/debugController.js +105 -71
  85. package/lib/server/debugger.js +6 -23
  86. package/lib/server/deviceDescriptorsSource.json +237 -127
  87. package/lib/server/dialog.js +50 -6
  88. package/lib/server/dispatchers/androidDispatcher.js +77 -62
  89. package/lib/server/dispatchers/artifactDispatcher.js +18 -18
  90. package/lib/server/dispatchers/browserContextDispatcher.js +141 -91
  91. package/lib/server/dispatchers/browserDispatcher.js +55 -88
  92. package/lib/server/dispatchers/browserTypeDispatcher.js +18 -9
  93. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -4
  94. package/lib/server/dispatchers/debugControllerDispatcher.js +12 -21
  95. package/lib/server/dispatchers/dialogDispatcher.js +4 -4
  96. package/lib/server/dispatchers/dispatcher.js +78 -53
  97. package/lib/server/dispatchers/electronDispatcher.js +19 -20
  98. package/lib/server/dispatchers/elementHandlerDispatcher.js +83 -93
  99. package/lib/server/dispatchers/frameDispatcher.js +99 -102
  100. package/lib/server/dispatchers/jsHandleDispatcher.js +21 -16
  101. package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -4
  102. package/lib/server/dispatchers/localUtilsDispatcher.js +53 -59
  103. package/lib/server/dispatchers/networkDispatchers.js +41 -35
  104. package/lib/server/dispatchers/pageDispatcher.js +156 -107
  105. package/lib/server/dispatchers/playwrightDispatcher.js +37 -25
  106. package/lib/server/dispatchers/streamDispatcher.js +15 -8
  107. package/lib/server/dispatchers/tracingDispatcher.js +22 -13
  108. package/lib/server/dispatchers/webSocketRouteDispatcher.js +46 -35
  109. package/lib/server/dispatchers/writableStreamDispatcher.js +16 -10
  110. package/lib/server/dom.js +198 -266
  111. package/lib/server/download.js +3 -3
  112. package/lib/server/electron/electron.js +96 -103
  113. package/lib/server/electron/loader.js +1 -1
  114. package/lib/server/fetch.js +22 -41
  115. package/lib/server/fileUploadUtils.js +1 -1
  116. package/lib/server/firefox/ffBrowser.js +79 -55
  117. package/lib/server/firefox/ffExecutionContext.js +2 -1
  118. package/lib/server/firefox/ffInput.js +23 -23
  119. package/lib/server/firefox/ffNetworkManager.js +8 -6
  120. package/lib/server/firefox/ffPage.js +39 -36
  121. package/lib/server/firefox/firefox.js +9 -10
  122. package/lib/server/frameSelectors.js +65 -22
  123. package/lib/server/frames.js +516 -544
  124. package/lib/server/har/harRecorder.js +1 -1
  125. package/lib/server/har/harTracer.js +4 -2
  126. package/lib/server/helper.js +3 -7
  127. package/lib/server/index.js +0 -3
  128. package/lib/server/input.js +47 -54
  129. package/lib/server/instrumentation.js +8 -14
  130. package/lib/server/javascript.js +9 -17
  131. package/lib/server/launchApp.js +48 -30
  132. package/lib/server/localUtils.js +45 -38
  133. package/lib/server/network.js +44 -10
  134. package/lib/server/page.js +233 -178
  135. package/lib/server/pageBinding.js +6 -7
  136. package/lib/server/playwright.js +4 -14
  137. package/lib/server/progress.js +57 -49
  138. package/lib/server/recorder/recorderApp.js +298 -95
  139. package/lib/server/recorder/recorderRunner.js +23 -24
  140. package/lib/server/recorder/recorderSignalProcessor.js +83 -0
  141. package/lib/server/recorder/recorderUtils.js +67 -10
  142. package/lib/server/recorder.js +284 -146
  143. package/lib/server/registry/index.js +83 -48
  144. package/lib/server/registry/nativeDeps.js +175 -0
  145. package/lib/server/registry/oopDownloadBrowserMain.js +1 -1
  146. package/lib/server/screenshotter.js +84 -83
  147. package/lib/server/selectors.js +12 -12
  148. package/lib/server/socksClientCertificatesInterceptor.js +198 -136
  149. package/lib/server/trace/recorder/snapshotter.js +12 -19
  150. package/lib/server/trace/recorder/tracing.js +36 -27
  151. package/lib/server/trace/viewer/traceViewer.js +11 -20
  152. package/lib/server/transport.js +20 -22
  153. package/lib/server/utils/comparators.js +2 -2
  154. package/lib/server/utils/debug.js +3 -8
  155. package/lib/server/utils/debugLogger.js +8 -0
  156. package/lib/server/utils/hostPlatform.js +3 -1
  157. package/lib/server/utils/network.js +35 -25
  158. package/lib/server/utils/nodePlatform.js +1 -1
  159. package/lib/server/utils/processLauncher.js +4 -1
  160. package/lib/server/utils/wsServer.js +11 -17
  161. package/lib/server/webkit/webkit.js +5 -2
  162. package/lib/server/webkit/wkBrowser.js +51 -28
  163. package/lib/server/webkit/wkExecutionContext.js +2 -1
  164. package/lib/server/webkit/wkInput.js +25 -25
  165. package/lib/server/webkit/wkInterceptableRequest.js +1 -1
  166. package/lib/server/webkit/wkPage.js +80 -59
  167. package/lib/server/webkit/wkProvisionalPage.js +1 -1
  168. package/lib/server/webkit/wkWorkers.js +7 -7
  169. package/lib/utils/isomorphic/ariaSnapshot.js +13 -7
  170. package/lib/utils/isomorphic/cssParser.js +1 -2
  171. package/lib/utils/isomorphic/locatorGenerators.js +18 -0
  172. package/lib/utils/isomorphic/manualPromise.js +1 -2
  173. package/lib/utils/isomorphic/mimeType.js +1 -2
  174. package/lib/utils/isomorphic/multimap.js +1 -2
  175. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +248 -0
  176. package/lib/utils/isomorphic/protocolFormatter.js +78 -0
  177. package/lib/utils/isomorphic/protocolMetainfo.js +318 -0
  178. package/lib/utils/isomorphic/selectorParser.js +3 -4
  179. package/lib/utils/isomorphic/stringUtils.js +3 -24
  180. package/lib/utils/isomorphic/time.js +9 -4
  181. package/lib/utils/isomorphic/timeoutRunner.js +3 -4
  182. package/lib/utils/isomorphic/traceUtils.js +2 -3
  183. package/lib/utils/isomorphic/urlMatch.js +21 -7
  184. package/lib/utils/isomorphic/utilityScriptSerializers.js +208 -205
  185. package/lib/utils.js +8 -2
  186. package/lib/utilsBundleImpl/index.js +160 -150
  187. package/lib/vite/htmlReport/index.html +17 -17
  188. package/lib/vite/recorder/assets/{codeMirrorModule-CXVeovup.js → codeMirrorModule-DzQ0k89p.js} +1 -1
  189. package/lib/vite/recorder/assets/{index-eHBmevrY.css → index-CI4HQ-Zb.css} +1 -1
  190. package/lib/vite/recorder/assets/index-D7C7daHH.js +184 -0
  191. package/lib/vite/recorder/index.html +3 -3
  192. package/lib/vite/traceViewer/assets/{codeMirrorModule-_GLjJL-7.js → codeMirrorModule-Di48jgWx.js} +1 -1
  193. package/lib/vite/traceViewer/assets/defaultSettingsView-szBn8781.js +256 -0
  194. package/lib/vite/traceViewer/defaultSettingsView.DVJHpiGt.css +1 -0
  195. package/lib/vite/traceViewer/index.BFsek2M6.css +1 -0
  196. package/lib/vite/traceViewer/index.DQvXoPLL.js +2 -0
  197. package/lib/vite/traceViewer/index.html +6 -6
  198. package/lib/vite/traceViewer/sw.bundle.js +3 -3
  199. package/lib/vite/traceViewer/uiMode.dBV3oN9h.js +5 -0
  200. package/lib/vite/traceViewer/uiMode.html +4 -4
  201. package/lib/zipBundleImpl.js +4 -4
  202. package/package.json +1 -1
  203. package/types/protocol.d.ts +712 -107
  204. package/types/types.d.ts +148 -37
  205. package/lib/generated/consoleApiSource.js +0 -28
  206. package/lib/protocol/debug.js +0 -211
  207. package/lib/server/recorder/contextRecorder.js +0 -286
  208. package/lib/server/recorder/recorderCollection.js +0 -116
  209. package/lib/server/recorder/recorderFrontend.js +0 -16
  210. package/lib/server/storageScript.js +0 -154
  211. package/lib/server/timeoutSettings.js +0 -89
  212. package/lib/utils/isomorphic/builtins.js +0 -86
  213. package/lib/vite/recorder/assets/index-BsWQsSGl.js +0 -184
  214. package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +0 -265
  215. package/lib/vite/traceViewer/defaultSettingsView.QdHITyLI.css +0 -1
  216. package/lib/vite/traceViewer/index.CFOW-Ezb.css +0 -1
  217. package/lib/vite/traceViewer/index.cFZzK9RN.js +0 -2
  218. package/lib/vite/traceViewer/uiMode.XVPIqBeS.js +0 -5
@@ -69,13 +69,13 @@ class CRNetworkManager {
69
69
  ];
70
70
  if (this._page) {
71
71
  sessionInfo.eventListeners.push(...[
72
- import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketCreated", (e) => this._page._frameManager.onWebSocketCreated(e.requestId, e.url)),
73
- import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketWillSendHandshakeRequest", (e) => this._page._frameManager.onWebSocketRequest(e.requestId)),
74
- import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketHandshakeResponseReceived", (e) => this._page._frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)),
75
- import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameSent", (e) => e.response.payloadData && this._page._frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)),
76
- import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameReceived", (e) => e.response.payloadData && this._page._frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)),
77
- import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketClosed", (e) => this._page._frameManager.webSocketClosed(e.requestId)),
78
- import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameError", (e) => this._page._frameManager.webSocketError(e.requestId, e.errorMessage))
72
+ import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketCreated", (e) => this._page.frameManager.onWebSocketCreated(e.requestId, e.url)),
73
+ import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketWillSendHandshakeRequest", (e) => this._page.frameManager.onWebSocketRequest(e.requestId)),
74
+ import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketHandshakeResponseReceived", (e) => this._page.frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)),
75
+ import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameSent", (e) => e.response.payloadData && this._page.frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)),
76
+ import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameReceived", (e) => e.response.payloadData && this._page.frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)),
77
+ import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketClosed", (e) => this._page.frameManager.webSocketClosed(e.requestId)),
78
+ import_eventsHelper.eventsHelper.addEventListener(session, "Network.webSocketFrameError", (e) => this._page.frameManager.webSocketError(e.requestId, e.errorMessage))
79
79
  ]);
80
80
  }
81
81
  this._sessions.set(session, sessionInfo);
@@ -265,11 +265,11 @@ class CRNetworkManager {
265
265
  redirectedFrom = request2;
266
266
  }
267
267
  }
268
- let frame = requestWillBeSentEvent.frameId ? this._page?._frameManager.frame(requestWillBeSentEvent.frameId) : requestWillBeSentSessionInfo.workerFrame;
268
+ let frame = requestWillBeSentEvent.frameId ? this._page?.frameManager.frame(requestWillBeSentEvent.frameId) : requestWillBeSentSessionInfo.workerFrame;
269
269
  if (!frame && this._page && requestPausedEvent && requestPausedEvent.frameId)
270
- frame = this._page._frameManager.frame(requestPausedEvent.frameId);
271
- if (!frame && this._page && requestWillBeSentEvent.frameId === (this._page?._delegate)._targetId) {
272
- frame = this._page._frameManager.frameAttached(requestWillBeSentEvent.frameId, null);
270
+ frame = this._page.frameManager.frame(requestPausedEvent.frameId);
271
+ if (!frame && this._page && requestWillBeSentEvent.frameId === (this._page?.delegate)._targetId) {
272
+ frame = this._page.frameManager.frameAttached(requestWillBeSentEvent.frameId, null);
273
273
  }
274
274
  const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === "OPTIONS" && requestWillBeSentEvent.initiator.type === "preflight";
275
275
  if (isInterceptedOptionsPreflight && (this._page || this._serviceWorker).needsRequestInterception()) {
@@ -309,7 +309,7 @@ class CRNetworkManager {
309
309
  const documentId = isNavigationRequest ? requestWillBeSentEvent.loaderId : void 0;
310
310
  const request = new InterceptableRequest({
311
311
  session: requestWillBeSentSessionInfo.session,
312
- context: (this._page || this._serviceWorker)._browserContext,
312
+ context: (this._page || this._serviceWorker).browserContext,
313
313
  frame: frame || null,
314
314
  serviceWorker: this._serviceWorker || null,
315
315
  documentId,
@@ -323,7 +323,7 @@ class CRNetworkManager {
323
323
  if (route) {
324
324
  request.request.setRawRequestHeaders((0, import_utils.headersObjectToArray)(requestPausedEvent.request.headers, "\n"));
325
325
  }
326
- (this._page?._frameManager || this._serviceWorker).requestStarted(request.request, route || void 0);
326
+ (this._page?.frameManager || this._serviceWorker).requestStarted(request.request, route || void 0);
327
327
  }
328
328
  _createResponse(request, responsePayload, hasExtraInfo) {
329
329
  const getResponseBody = async () => {
@@ -402,8 +402,8 @@ class CRNetworkManager {
402
402
  response.setEncodedBodySize(null);
403
403
  response._requestFinished((timestamp - request._timestamp) * 1e3);
404
404
  this._deleteRequest(request);
405
- (this._page?._frameManager || this._serviceWorker).requestReceivedResponse(response);
406
- (this._page?._frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
405
+ (this._page?.frameManager || this._serviceWorker).requestReceivedResponse(response);
406
+ (this._page?.frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
407
407
  }
408
408
  _onResponseReceivedExtraInfo(event) {
409
409
  this._responseExtraInfoTracker.responseReceivedExtraInfo(event);
@@ -421,14 +421,14 @@ class CRNetworkManager {
421
421
  if (!request)
422
422
  return;
423
423
  const response = this._createResponse(request, event.response, event.hasExtraInfo);
424
- (this._page?._frameManager || this._serviceWorker).requestReceivedResponse(response);
424
+ (this._page?.frameManager || this._serviceWorker).requestReceivedResponse(response);
425
425
  }
426
426
  _onLoadingFinished(sessionInfo, event) {
427
427
  this._responseExtraInfoTracker.loadingFinished(event);
428
428
  const request = this._requestIdToRequest.get(event.requestId);
429
429
  if (!request)
430
430
  return;
431
- this._maybeUpdateOOPIFMainRequest(sessionInfo, request);
431
+ this._maybeUpdateRequestSession(sessionInfo, request);
432
432
  const response = request.request._existingResponse();
433
433
  if (response) {
434
434
  response.setTransferSize(event.encodedDataLength);
@@ -436,7 +436,7 @@ class CRNetworkManager {
436
436
  response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
437
437
  }
438
438
  this._deleteRequest(request);
439
- (this._page?._frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
439
+ (this._page?.frameManager || this._serviceWorker).reportRequestFinished(request.request, response);
440
440
  }
441
441
  _onLoadingFailed(sessionInfo, event) {
442
442
  this._responseExtraInfoTracker.loadingFailed(event);
@@ -451,7 +451,7 @@ class CRNetworkManager {
451
451
  }
452
452
  if (!request)
453
453
  return;
454
- this._maybeUpdateOOPIFMainRequest(sessionInfo, request);
454
+ this._maybeUpdateRequestSession(sessionInfo, request);
455
455
  const response = request.request._existingResponse();
456
456
  if (response) {
457
457
  response.setTransferSize(null);
@@ -462,10 +462,10 @@ class CRNetworkManager {
462
462
  }
463
463
  this._deleteRequest(request);
464
464
  request.request._setFailureText(event.errorText || event.blockedReason || "");
465
- (this._page?._frameManager || this._serviceWorker).requestFailed(request.request, !!event.canceled);
465
+ (this._page?.frameManager || this._serviceWorker).requestFailed(request.request, !!event.canceled);
466
466
  }
467
- _maybeUpdateOOPIFMainRequest(sessionInfo, request) {
468
- if (request.session !== sessionInfo.session && !sessionInfo.isMain && request._documentId === request._requestId)
467
+ _maybeUpdateRequestSession(sessionInfo, request) {
468
+ if (request.session !== sessionInfo.session && !sessionInfo.isMain && (request._documentId === request._requestId || sessionInfo.workerFrame))
469
469
  request.session = sessionInfo.session;
470
470
  }
471
471
  }
@@ -518,33 +518,38 @@ class RouteImpl {
518
518
  if (overrides.url && (overrides.url === "http://patchright-init-script-inject.internal/" || overrides.url === "https://patchright-init-script-inject.internal/")) {
519
519
  await catchDisallowedErrors(async () => {
520
520
  this._sessionManager._alreadyTrackedNetworkIds.add(this._networkId);
521
- this._session.send("Fetch.continueRequest", { requestId: this._interceptionId, interceptResponse: true });
521
+ this._session._sendMayFail("Fetch.continueRequest", { requestId: this._interceptionId, interceptResponse: true });
522
522
  });
523
523
  } else {
524
524
  await catchDisallowedErrors(async () => {
525
- await this._session.send("Fetch.continueRequest", this._alreadyContinuedParams);
525
+ await this._session._sendMayFail("Fetch.continueRequest", this._alreadyContinuedParams);
526
526
  });
527
527
  }
528
528
  }
529
529
  async fulfill(response) {
530
- const isTextHtml = response.resourceType === "Document" || response.headers.some((header) => header.name === "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()) {
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
533
  if (!allInjections.includes(binding)) allInjections.push(binding);
534
534
  }
535
535
  if (isTextHtml && allInjections.length) {
536
536
  let scriptNonce = import_crypto.default.randomBytes(22).toString("hex");
537
+ let useNonce = true;
537
538
  for (let i = 0; i < response.headers.length; i++) {
538
- if (response.headers[i].name === "content-security-policy" || response.headers[i].name === "content-security-policy-report-only") {
539
+ if (response.headers[i].name.toLowerCase() === "content-security-policy" || response.headers[i].name.toLowerCase() === "content-security-policy-report-only") {
539
540
  let cspValue = response.headers[i].value;
540
541
  const nonceRegex = /script-src[^;]*'nonce-([\w-]+)'/;
541
542
  const nonceMatch = cspValue.match(nonceRegex);
542
543
  if (nonceMatch) {
543
544
  scriptNonce = nonceMatch[1];
544
545
  } else {
545
- const scriptSrcRegex = /(script-src[^;]*)(;|$)/;
546
- const newCspValue = cspValue.replace(scriptSrcRegex, `$1 'nonce-${scriptNonce}'$2`);
547
- response.headers[i].value = newCspValue;
546
+ if (/script-src[^;]*'unsafe-inline'/.test(cspValue)) {
547
+ useNonce = false;
548
+ } else {
549
+ const scriptSrcRegex = /(script-src[^;]*)(;|$)/;
550
+ const newCspValue = cspValue.replace(scriptSrcRegex, `$1 'nonce-${scriptNonce}'$2`);
551
+ response.headers[i].value = newCspValue;
552
+ }
548
553
  }
549
554
  break;
550
555
  }
@@ -553,11 +558,18 @@ class RouteImpl {
553
558
  allInjections.forEach((script) => {
554
559
  let scriptId = import_crypto.default.randomBytes(22).toString("hex");
555
560
  let scriptSource = script.source || script;
556
- injectionHTML += `<script class="${this._page._delegate.initScriptTag}" nonce="${scriptNonce}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${scriptSource}</script>`;
561
+ if (useNonce) {
562
+ injectionHTML += `<script class="${this._page.delegate.initScriptTag}" nonce="${scriptNonce}" id="${scriptId}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${scriptSource}</script>`;
563
+ } else {
564
+ injectionHTML += `<script class="${this._page.delegate.initScriptTag}" id="${scriptId}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${scriptSource}</script>`;
565
+ }
557
566
  });
558
567
  if (response.isBase64) {
559
568
  response.isBase64 = false;
560
- response.body = injectionHTML + Buffer.from(response.body, "base64").toString("utf-8");
569
+ response.body = Buffer.from(response.body, "base64").toString("utf-8");
570
+ }
571
+ if (/^<!DOCTYPE[sS]*?>/i.test(response.body)) {
572
+ response.body = response.body.replace(/^<!DOCTYPE[sS]*?>/i, (match) => `${match}${injectionHTML}`);
561
573
  } else {
562
574
  response.body = injectionHTML + response.body;
563
575
  }