patchright-core 1.52.5 → 1.55.1

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 +54 -32
  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 +30 -26
  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 +421 -345
  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 +43 -31
  72. package/lib/server/chromium/crPage.js +98 -72
  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 +98 -101
  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 +63 -20
  123. package/lib/server/frames.js +495 -555
  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 +8 -16
  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 +232 -177
  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 +128 -17
  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
  }
@@ -527,24 +527,29 @@ class RouteImpl {
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
  }