patchright-core 1.58.2 → 1.59.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.
- package/ThirdPartyNotices.txt +126 -650
- package/browsers.json +16 -14
- package/lib/bootstrap.js +77 -0
- package/lib/cli/browserActions.js +308 -0
- package/lib/cli/driver.js +3 -2
- package/lib/cli/installActions.js +171 -0
- package/lib/cli/program.js +47 -411
- package/lib/client/android.js +4 -4
- package/lib/client/api.js +3 -3
- package/lib/client/browser.js +8 -0
- package/lib/client/browserContext.js +22 -61
- package/lib/client/browserType.js +19 -51
- package/lib/client/cdpSession.js +6 -2
- package/lib/client/channelOwner.js +1 -1
- package/lib/client/clientHelper.js +2 -1
- package/lib/client/clock.js +0 -1
- package/lib/client/{webSocket.js → connect.js} +57 -7
- package/lib/client/connection.js +8 -4
- package/lib/client/consoleMessage.js +3 -0
- package/lib/client/debugger.js +57 -0
- package/lib/client/dialog.js +8 -1
- package/lib/client/disposable.js +76 -0
- package/lib/client/electron.js +1 -0
- package/lib/client/elementHandle.js +1 -4
- package/lib/client/events.js +3 -3
- package/lib/client/fetch.js +0 -1
- package/lib/client/frame.js +10 -23
- package/lib/client/harRouter.js +13 -1
- package/lib/client/jsHandle.js +4 -8
- package/lib/client/locator.js +13 -44
- package/lib/client/network.js +15 -16
- package/lib/client/page.js +41 -75
- package/lib/client/platform.js +0 -3
- package/lib/client/screencast.js +88 -0
- package/lib/client/selectors.js +3 -1
- package/lib/client/tracing.js +11 -5
- package/lib/client/video.js +13 -20
- package/lib/client/worker.js +6 -6
- package/lib/generated/bindingsControllerSource.js +1 -1
- package/lib/generated/clockSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/generated/storageScriptSource.js +1 -1
- package/lib/generated/utilityScriptSource.js +1 -1
- package/lib/mcpBundle.js +0 -6
- package/lib/mcpBundleImpl.js +91 -0
- package/lib/protocol/validator.js +224 -138
- package/lib/protocol/validatorPrimitives.js +1 -1
- package/lib/remote/playwrightConnection.js +10 -8
- package/lib/remote/playwrightPipeServer.js +100 -0
- package/lib/remote/playwrightServer.js +13 -8
- package/lib/remote/playwrightWebSocketServer.js +73 -0
- package/lib/remote/serverTransport.js +96 -0
- package/lib/server/android/android.js +2 -2
- package/lib/server/bidi/bidiBrowser.js +30 -8
- package/lib/server/bidi/bidiChromium.js +18 -5
- package/lib/server/bidi/bidiNetworkManager.js +39 -11
- package/lib/server/bidi/bidiPage.js +31 -15
- package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
- package/lib/server/browser.js +84 -21
- package/lib/server/browserContext.js +110 -58
- package/lib/server/browserType.js +14 -12
- package/lib/server/chromium/chromium.js +15 -12
- package/lib/server/chromium/chromiumSwitches.js +14 -2
- package/lib/server/chromium/crBrowser.js +20 -17
- package/lib/server/chromium/crCoverage.js +1 -13
- package/lib/server/chromium/crDevTools.js +1 -0
- package/lib/server/chromium/crNetworkManager.js +12 -267
- package/lib/server/chromium/crPage.js +67 -199
- package/lib/server/chromium/crServiceWorker.js +7 -14
- package/lib/server/clock.js +33 -41
- package/lib/server/console.js +5 -1
- package/lib/server/debugController.js +12 -6
- package/lib/server/debugger.js +40 -47
- package/lib/server/deviceDescriptorsSource.json +137 -137
- package/lib/server/dispatchers/browserContextDispatcher.js +29 -30
- package/lib/server/dispatchers/browserDispatcher.js +11 -5
- package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
- package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
- package/lib/server/dispatchers/dispatcher.js +1 -1
- package/lib/server/dispatchers/disposableDispatcher.js +39 -0
- package/lib/server/dispatchers/electronDispatcher.js +2 -1
- package/lib/server/dispatchers/frameDispatcher.js +6 -6
- package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
- package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
- package/lib/server/dispatchers/networkDispatchers.js +6 -5
- package/lib/server/dispatchers/pageDispatcher.js +101 -38
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
- package/lib/server/disposable.js +41 -0
- package/lib/server/dom.js +44 -26
- package/lib/server/download.js +3 -2
- package/lib/server/electron/electron.js +12 -7
- package/lib/server/firefox/ffBrowser.js +9 -19
- package/lib/server/firefox/ffInput.js +21 -5
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +24 -27
- package/lib/server/frameSelectors.js +5 -172
- package/lib/server/frames.js +234 -687
- package/lib/server/har/harRecorder.js +2 -2
- package/lib/server/har/harTracer.js +5 -4
- package/lib/server/input.js +49 -4
- package/lib/server/instrumentation.js +5 -0
- package/lib/server/javascript.js +6 -26
- package/lib/server/launchApp.js +1 -3
- package/lib/server/localUtils.js +6 -6
- package/lib/server/network.js +9 -8
- package/lib/server/overlay.js +138 -0
- package/lib/server/page.js +157 -105
- package/lib/server/progress.js +6 -0
- package/lib/server/recorder/recorderApp.js +9 -8
- package/lib/server/recorder.js +76 -40
- package/lib/server/registry/index.js +55 -82
- package/lib/server/registry/nativeDeps.js +1 -0
- package/lib/server/screencast.js +90 -143
- package/lib/server/screenshotter.js +0 -6
- package/lib/server/trace/recorder/snapshotter.js +8 -17
- package/lib/server/trace/recorder/snapshotterInjected.js +82 -20
- package/lib/server/trace/recorder/tracing.js +87 -44
- package/lib/server/trace/viewer/traceViewer.js +3 -4
- package/lib/server/usKeyboardLayout.js +7 -0
- package/lib/server/utils/comparators.js +1 -1
- package/lib/server/utils/disposable.js +32 -0
- package/lib/server/utils/eventsHelper.js +3 -1
- package/lib/server/utils/fileUtils.js +16 -2
- package/lib/server/utils/happyEyeballs.js +15 -12
- package/lib/server/utils/hostPlatform.js +0 -15
- package/lib/server/utils/httpServer.js +5 -3
- package/lib/server/utils/network.js +2 -1
- package/lib/server/utils/nodePlatform.js +0 -6
- package/lib/server/utils/processLauncher.js +6 -5
- package/lib/server/utils/zipFile.js +2 -2
- package/lib/server/videoRecorder.js +82 -12
- package/lib/server/webkit/wkBrowser.js +1 -6
- package/lib/server/webkit/wkPage.js +27 -25
- package/lib/server/webkit/wkWorkers.js +2 -1
- package/lib/serverRegistry.js +156 -0
- package/lib/tools/backend/browserBackend.js +79 -0
- package/lib/tools/backend/common.js +63 -0
- package/lib/tools/backend/config.js +41 -0
- package/lib/tools/backend/console.js +66 -0
- package/lib/tools/backend/context.js +296 -0
- package/lib/tools/backend/cookies.js +152 -0
- package/lib/tools/backend/devtools.js +69 -0
- package/lib/tools/backend/dialogs.js +59 -0
- package/lib/tools/backend/evaluate.js +64 -0
- package/lib/tools/backend/files.js +60 -0
- package/lib/tools/backend/form.js +64 -0
- package/lib/tools/backend/keyboard.js +155 -0
- package/lib/tools/backend/logFile.js +95 -0
- package/lib/tools/backend/mouse.js +168 -0
- package/lib/tools/backend/navigate.js +106 -0
- package/lib/tools/backend/network.js +135 -0
- package/lib/tools/backend/pdf.js +48 -0
- package/lib/tools/backend/response.js +305 -0
- package/lib/tools/backend/route.js +140 -0
- package/lib/tools/backend/runCode.js +77 -0
- package/lib/tools/backend/screenshot.js +88 -0
- package/lib/tools/backend/sessionLog.js +74 -0
- package/lib/tools/backend/snapshot.js +208 -0
- package/lib/tools/backend/storage.js +68 -0
- package/lib/tools/backend/tab.js +445 -0
- package/lib/tools/backend/tabs.js +67 -0
- package/lib/tools/backend/tool.js +47 -0
- package/lib/tools/backend/tools.js +102 -0
- package/lib/tools/backend/tracing.js +78 -0
- package/lib/tools/backend/utils.js +83 -0
- package/lib/tools/backend/verify.js +151 -0
- package/lib/tools/backend/video.js +98 -0
- package/lib/tools/backend/wait.js +63 -0
- package/lib/tools/backend/webstorage.js +223 -0
- package/lib/tools/cli-client/cli.js +6 -0
- package/lib/tools/cli-client/help.json +399 -0
- package/lib/tools/cli-client/minimist.js +128 -0
- package/lib/tools/cli-client/program.js +350 -0
- package/lib/tools/cli-client/registry.js +176 -0
- package/lib/tools/cli-client/session.js +289 -0
- package/lib/tools/cli-client/skill/SKILL.md +328 -0
- package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
- package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
- package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
- package/lib/tools/cli-client/skill/references/running-code.md +231 -0
- package/lib/tools/cli-client/skill/references/session-management.md +169 -0
- package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
- package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
- package/lib/tools/cli-client/skill/references/tracing.md +139 -0
- package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
- package/lib/tools/cli-daemon/command.js +73 -0
- package/lib/tools/cli-daemon/commands.js +956 -0
- package/lib/tools/cli-daemon/daemon.js +157 -0
- package/lib/tools/cli-daemon/helpGenerator.js +177 -0
- package/lib/tools/cli-daemon/program.js +129 -0
- package/lib/tools/dashboard/appIcon.png +0 -0
- package/lib/tools/dashboard/dashboardApp.js +284 -0
- package/lib/tools/dashboard/dashboardController.js +296 -0
- package/lib/tools/exports.js +60 -0
- package/lib/tools/mcp/browserFactory.js +233 -0
- package/lib/tools/mcp/cdpRelay.js +352 -0
- package/lib/tools/mcp/cli-stub.js +7 -0
- package/lib/tools/mcp/config.d.js +16 -0
- package/lib/tools/mcp/config.js +446 -0
- package/lib/tools/mcp/configIni.js +189 -0
- package/lib/tools/mcp/extensionContextFactory.js +55 -0
- package/lib/tools/mcp/index.js +62 -0
- package/lib/tools/mcp/log.js +35 -0
- package/lib/tools/mcp/program.js +107 -0
- package/lib/tools/mcp/protocol.js +28 -0
- package/lib/tools/mcp/watchdog.js +44 -0
- package/lib/tools/trace/SKILL.md +171 -0
- package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
- package/lib/tools/trace/traceActions.js +142 -0
- package/lib/tools/trace/traceAttachments.js +69 -0
- package/lib/tools/trace/traceCli.js +87 -0
- package/lib/tools/trace/traceConsole.js +97 -0
- package/lib/tools/trace/traceErrors.js +55 -0
- package/lib/tools/trace/traceOpen.js +69 -0
- package/lib/tools/trace/traceParser.js +96 -0
- package/lib/tools/trace/traceRequests.js +182 -0
- package/lib/tools/trace/traceScreenshot.js +68 -0
- package/lib/tools/trace/traceSnapshot.js +149 -0
- package/lib/tools/trace/traceUtils.js +153 -0
- package/lib/tools/utils/connect.js +32 -0
- package/lib/tools/utils/mcp/http.js +152 -0
- package/lib/tools/utils/mcp/server.js +230 -0
- package/lib/tools/utils/mcp/tool.js +47 -0
- package/lib/tools/utils/socketConnection.js +108 -0
- package/lib/utils/isomorphic/formatUtils.js +64 -0
- package/lib/utils/isomorphic/jsonSchema.js +89 -0
- package/lib/utils/isomorphic/mimeType.js +7 -2
- package/lib/utils/isomorphic/protocolFormatter.js +2 -2
- package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
- package/lib/utils/isomorphic/stringUtils.js +3 -3
- package/lib/utils/isomorphic/timeoutRunner.js +3 -3
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
- package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
- package/lib/utils/isomorphic/trace/traceModel.js +3 -2
- package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
- package/lib/utils/isomorphic/urlMatch.js +54 -1
- package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
- package/lib/utils.js +6 -2
- package/lib/utilsBundle.js +3 -21
- package/lib/utilsBundleImpl/index.js +132 -133
- package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
- package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
- package/lib/vite/dashboard/index.html +28 -0
- package/lib/vite/htmlReport/index.html +2 -70
- package/lib/vite/htmlReport/report.css +1 -0
- package/lib/vite/htmlReport/report.js +72 -0
- package/lib/vite/recorder/assets/{codeMirrorModule-CFUTFUO7.js → codeMirrorModule-C8KMvO9L.js} +20 -20
- package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-BVA4h_ZY.js → codeMirrorModule-DS0FLvoc.js} +20 -20
- package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
- package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
- package/lib/vite/traceViewer/{index.BtyWtaE-.js → index.C5466mMT.js} +1 -1
- package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
- package/lib/vite/traceViewer/index.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +4 -4
- package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/zipBundleImpl.js +2 -2
- package/lib/zodBundle.js +39 -0
- package/lib/zodBundleImpl.js +40 -0
- package/package.json +6 -1
- package/types/protocol.d.ts +947 -51
- package/types/types.d.ts +854 -74
- package/lib/client/pageAgent.js +0 -64
- package/lib/mcpBundleImpl/index.js +0 -147
- package/lib/server/agent/actionRunner.js +0 -335
- package/lib/server/agent/actions.js +0 -128
- package/lib/server/agent/codegen.js +0 -111
- package/lib/server/agent/context.js +0 -150
- package/lib/server/agent/expectTools.js +0 -156
- package/lib/server/agent/pageAgent.js +0 -204
- package/lib/server/agent/performTools.js +0 -262
- package/lib/server/agent/tool.js +0 -109
- package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
- package/lib/server/pageBinding.js +0 -87
- package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
- package/lib/vite/recorder/assets/index-CVkBxsGf.js +0 -193
- package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +0 -266
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
- package/lib/vite/traceViewer/uiMode.fyrXARf2.js +0 -5
- /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
- /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
|
@@ -31,7 +31,6 @@ __export(crNetworkManager_exports, {
|
|
|
31
31
|
CRNetworkManager: () => CRNetworkManager
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(crNetworkManager_exports);
|
|
34
|
-
var import_crypto = __toESM(require("crypto"));
|
|
35
34
|
var import_utils = require("../../utils");
|
|
36
35
|
var import_eventsHelper = require("../utils/eventsHelper");
|
|
37
36
|
var import_helper = require("../helper");
|
|
@@ -50,7 +49,6 @@ class CRNetworkManager {
|
|
|
50
49
|
this._requestIdToRequestPausedEvent = /* @__PURE__ */ new Map();
|
|
51
50
|
this._responseExtraInfoTracker = new ResponseExtraInfoTracker();
|
|
52
51
|
this._sessions = /* @__PURE__ */ new Map();
|
|
53
|
-
this._alreadyTrackedNetworkIds = /* @__PURE__ */ new Set();
|
|
54
52
|
this._page = page;
|
|
55
53
|
this._serviceWorker = serviceWorker;
|
|
56
54
|
}
|
|
@@ -141,8 +139,6 @@ class CRNetworkManager {
|
|
|
141
139
|
async setRequestInterception(value) {
|
|
142
140
|
this._userRequestInterceptionEnabled = value;
|
|
143
141
|
await this._updateProtocolRequestInterception();
|
|
144
|
-
if (this._page)
|
|
145
|
-
await this._forEachSession((info) => info.session.send("Network.setCacheDisabled", { cacheDisabled: this._page.needsRequestInterception() }));
|
|
146
142
|
}
|
|
147
143
|
async _updateProtocolRequestInterception() {
|
|
148
144
|
const enabled = this._userRequestInterceptionEnabled || !!this._credentials;
|
|
@@ -155,9 +151,7 @@ class CRNetworkManager {
|
|
|
155
151
|
const enabled = this._protocolRequestInterceptionEnabled;
|
|
156
152
|
if (initial && !enabled)
|
|
157
153
|
return;
|
|
158
|
-
const
|
|
159
|
-
const userInterception = this._page ? this._page.needsRequestInterception() : false;
|
|
160
|
-
const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: userInterception || hasHarRecorders });
|
|
154
|
+
const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: enabled });
|
|
161
155
|
let fetchPromise = Promise.resolve(void 0);
|
|
162
156
|
if (!info.workerFrame) {
|
|
163
157
|
if (enabled)
|
|
@@ -232,7 +226,6 @@ class CRNetworkManager {
|
|
|
232
226
|
return !this._credentials.origin || new URL(url).origin.toLowerCase() === this._credentials.origin.toLowerCase();
|
|
233
227
|
}
|
|
234
228
|
_onRequestPaused(sessionInfo, event) {
|
|
235
|
-
if (this._alreadyTrackedNetworkIds.has(event.networkId)) return;
|
|
236
229
|
if (!event.networkId) {
|
|
237
230
|
sessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
|
|
238
231
|
return;
|
|
@@ -246,7 +239,7 @@ class CRNetworkManager {
|
|
|
246
239
|
this._requestIdToRequestWillBeSentEvent.delete(requestId);
|
|
247
240
|
} else {
|
|
248
241
|
const existingRequest = this._requestIdToRequest.get(requestId);
|
|
249
|
-
const alreadyContinuedParams = existingRequest?.
|
|
242
|
+
const alreadyContinuedParams = existingRequest?._originalRequestRoute?._alreadyContinuedParams;
|
|
250
243
|
if (alreadyContinuedParams && !event.redirectedRequestId) {
|
|
251
244
|
sessionInfo.session._sendMayFail("Fetch.continueRequest", {
|
|
252
245
|
...alreadyContinuedParams,
|
|
@@ -258,7 +251,6 @@ class CRNetworkManager {
|
|
|
258
251
|
}
|
|
259
252
|
}
|
|
260
253
|
_onRequest(requestWillBeSentSessionInfo, requestWillBeSentEvent, requestPausedSessionInfo, requestPausedEvent) {
|
|
261
|
-
if (this._alreadyTrackedNetworkIds.has(requestWillBeSentEvent.initiator.requestId)) return;
|
|
262
254
|
if (requestWillBeSentEvent.request.url.startsWith("data:"))
|
|
263
255
|
return;
|
|
264
256
|
let redirectedFrom = null;
|
|
@@ -269,17 +261,13 @@ class CRNetworkManager {
|
|
|
269
261
|
redirectedFrom = request2;
|
|
270
262
|
}
|
|
271
263
|
}
|
|
272
|
-
const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === "OPTIONS" && requestWillBeSentEvent.initiator.type === "preflight";
|
|
273
|
-
if (isInterceptedOptionsPreflight && !(this._page || this._serviceWorker).needsRequestInterception()) {
|
|
274
|
-
requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId });
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
264
|
let frame = requestWillBeSentEvent.frameId ? this._page?.frameManager.frame(requestWillBeSentEvent.frameId) : requestWillBeSentSessionInfo.workerFrame;
|
|
278
265
|
if (!frame && this._page && requestPausedEvent && requestPausedEvent.frameId)
|
|
279
266
|
frame = this._page.frameManager.frame(requestPausedEvent.frameId);
|
|
280
267
|
if (!frame && this._page && requestWillBeSentEvent.frameId === (this._page?.delegate)._targetId) {
|
|
281
268
|
frame = this._page.frameManager.frameAttached(requestWillBeSentEvent.frameId, null);
|
|
282
269
|
}
|
|
270
|
+
const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === "OPTIONS" && requestWillBeSentEvent.initiator.type === "preflight";
|
|
283
271
|
if (isInterceptedOptionsPreflight && (this._page || this._serviceWorker).needsRequestInterception()) {
|
|
284
272
|
const requestHeaders = requestPausedEvent.request.headers;
|
|
285
273
|
const responseHeaders = [
|
|
@@ -314,7 +302,7 @@ class CRNetworkManager {
|
|
|
314
302
|
}
|
|
315
303
|
requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId, headers: headersOverride });
|
|
316
304
|
} else {
|
|
317
|
-
route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId
|
|
305
|
+
route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId);
|
|
318
306
|
}
|
|
319
307
|
}
|
|
320
308
|
const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type === "Document";
|
|
@@ -345,7 +333,7 @@ class CRNetworkManager {
|
|
|
345
333
|
const response2 = await session.send("Network.getResponseBody", { requestId: request._requestId });
|
|
346
334
|
if (response2.body || !expectedLength)
|
|
347
335
|
return Buffer.from(response2.body, response2.base64Encoded ? "base64" : "utf8");
|
|
348
|
-
if (request.
|
|
336
|
+
if (request._originalRequestRoute?._fulfilled)
|
|
349
337
|
return Buffer.from("");
|
|
350
338
|
const resource = await session.send("Network.loadNetworkResource", { url: request.request.url(), frameId: this._serviceWorker ? void 0 : request.request.frame()._id, options: { disableCache: false, includeCredentials: true } });
|
|
351
339
|
const chunks = [];
|
|
@@ -384,7 +372,8 @@ class CRNetworkManager {
|
|
|
384
372
|
responseStart: -1
|
|
385
373
|
};
|
|
386
374
|
}
|
|
387
|
-
const response = new network.Response(request.request, responsePayload.status, responsePayload.statusText, (0, import_utils.headersObjectToArray)(responsePayload.headers), timing, getResponseBody, !!responsePayload.fromServiceWorker
|
|
375
|
+
const response = new network.Response(request.request, responsePayload.status, responsePayload.statusText, (0, import_utils.headersObjectToArray)(responsePayload.headers), timing, getResponseBody, !!responsePayload.fromServiceWorker);
|
|
376
|
+
response._setHttpVersion(responsePayload?.protocol ?? null);
|
|
388
377
|
if (responsePayload?.remoteIPAddress && typeof responsePayload?.remotePort === "number") {
|
|
389
378
|
response._serverAddrFinished({
|
|
390
379
|
ipAddress: responsePayload.remoteIPAddress,
|
|
@@ -490,7 +479,6 @@ class InterceptableRequest {
|
|
|
490
479
|
this._requestId = requestWillBeSentEvent.requestId;
|
|
491
480
|
this._interceptionId = requestPausedEvent && requestPausedEvent.requestId;
|
|
492
481
|
this._documentId = documentId;
|
|
493
|
-
this._route = route;
|
|
494
482
|
this._originalRequestRoute = route ?? redirectedFrom?._originalRequestRoute;
|
|
495
483
|
const {
|
|
496
484
|
headers,
|
|
@@ -506,17 +494,10 @@ class InterceptableRequest {
|
|
|
506
494
|
}
|
|
507
495
|
}
|
|
508
496
|
class RouteImpl {
|
|
509
|
-
constructor(session, interceptionId
|
|
497
|
+
constructor(session, interceptionId) {
|
|
510
498
|
this._fulfilled = false;
|
|
511
|
-
this._sessionManager = void 0;
|
|
512
|
-
this._networkId = void 0;
|
|
513
|
-
this._page = void 0;
|
|
514
499
|
this._session = session;
|
|
515
500
|
this._interceptionId = interceptionId;
|
|
516
|
-
this._page = page;
|
|
517
|
-
this._networkId = networkId;
|
|
518
|
-
this._sessionManager = sessionManager;
|
|
519
|
-
import_eventsHelper.eventsHelper.addEventListener(this._session, "Fetch.requestPaused", async (e) => await this._networkRequestIntercepted(e));
|
|
520
501
|
}
|
|
521
502
|
async continue(overrides) {
|
|
522
503
|
this._alreadyContinuedParams = {
|
|
@@ -526,138 +507,17 @@ class RouteImpl {
|
|
|
526
507
|
method: overrides.method,
|
|
527
508
|
postData: overrides.postData ? overrides.postData.toString("base64") : void 0
|
|
528
509
|
};
|
|
529
|
-
|
|
530
|
-
await
|
|
531
|
-
|
|
532
|
-
this._session._sendMayFail("Fetch.continueRequest", { requestId: this._interceptionId, interceptResponse: true });
|
|
533
|
-
});
|
|
534
|
-
} else {
|
|
535
|
-
await catchDisallowedErrors(async () => {
|
|
536
|
-
await this._session._sendMayFail("Fetch.continueRequest", this._alreadyContinuedParams);
|
|
537
|
-
});
|
|
538
|
-
}
|
|
510
|
+
await catchDisallowedErrors(async () => {
|
|
511
|
+
await this._session.send("Fetch.continueRequest", this._alreadyContinuedParams);
|
|
512
|
+
});
|
|
539
513
|
}
|
|
540
514
|
async fulfill(response) {
|
|
541
|
-
const isTextHtml = response.headers.some((header) => header.name.toLowerCase() === "content-type" && header.value.includes("text/html"));
|
|
542
|
-
const pageDelegate = this._page?.delegate || null;
|
|
543
|
-
const initScriptTag = pageDelegate?.initScriptTag || "";
|
|
544
|
-
let allInjections = [];
|
|
545
|
-
if (pageDelegate)
|
|
546
|
-
allInjections = [...pageDelegate._mainFrameSession._evaluateOnNewDocumentScripts];
|
|
547
|
-
if (isTextHtml && allInjections.length && initScriptTag) {
|
|
548
|
-
let useNonce = false;
|
|
549
|
-
let scriptNonce = null;
|
|
550
|
-
if (response.isBase64) {
|
|
551
|
-
response.isBase64 = false;
|
|
552
|
-
response.body = Buffer.from(response.body, "base64").toString("utf-8");
|
|
553
|
-
}
|
|
554
|
-
const cspHeaderNames = ["content-security-policy", "content-security-policy-report-only"];
|
|
555
|
-
for (let i = 0; i < response.headers.length; i++) {
|
|
556
|
-
const headerName = response.headers[i].name.toLowerCase();
|
|
557
|
-
if (cspHeaderNames.includes(headerName)) {
|
|
558
|
-
const originalCsp = response.headers[i].value || "";
|
|
559
|
-
if (!useNonce) {
|
|
560
|
-
const nonceMatch = originalCsp.match(/script-src[^;]*'nonce-([^'"\s;]+)'/i);
|
|
561
|
-
if (nonceMatch && nonceMatch[1]) {
|
|
562
|
-
scriptNonce = nonceMatch[1];
|
|
563
|
-
useNonce = true;
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
const fixedCsp = this._fixCSP(originalCsp, scriptNonce);
|
|
567
|
-
response.headers[i].value = fixedCsp;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
if (typeof response.body === "string" && response.body.length) {
|
|
571
|
-
response.body = response.body.replace(
|
|
572
|
-
/<meta[^>]*http-equiv=(?:"|')?Content-Security-Policy(?:"|')?[^>]*>/gi,
|
|
573
|
-
(match) => {
|
|
574
|
-
const contentMatch = match.match(/content=(?:"|')([^"']*)(?:"|')/i);
|
|
575
|
-
if (contentMatch && contentMatch[1]) {
|
|
576
|
-
let originalCsp = contentMatch[1];
|
|
577
|
-
originalCsp = originalCsp.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'").replace(/"/g, '"').replace(/ /g, " ").replace(/&#(d+);/g, (match2, dec) => String.fromCharCode(dec)).replace(/&#x([0-9a-fA-F]+);/g, (match2, hex) => String.fromCharCode(parseInt(hex, 16)));
|
|
578
|
-
if (!useNonce) {
|
|
579
|
-
const nonceMatch = originalCsp.match(/script-src[^;]*'nonce-([^'"\s;]+)'/i);
|
|
580
|
-
if (nonceMatch && nonceMatch[1]) {
|
|
581
|
-
scriptNonce = nonceMatch[1];
|
|
582
|
-
useNonce = true;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
const fixedCsp = this._fixCSP(originalCsp, scriptNonce);
|
|
586
|
-
const encodedCsp = fixedCsp.replace(/'/g, "'").replace(/"/g, """);
|
|
587
|
-
return match.replace(contentMatch[1], encodedCsp);
|
|
588
|
-
}
|
|
589
|
-
return match;
|
|
590
|
-
}
|
|
591
|
-
);
|
|
592
|
-
}
|
|
593
|
-
let injectionHTML = "";
|
|
594
|
-
allInjections.forEach((script) => {
|
|
595
|
-
let scriptId = import_crypto.default.randomBytes(22).toString("hex");
|
|
596
|
-
let scriptSource = script.source || script;
|
|
597
|
-
const nonceAttr = useNonce ? `nonce="${scriptNonce}"` : "";
|
|
598
|
-
injectionHTML += `<script class="${initScriptTag}" ${nonceAttr} id="${scriptId}" type="text/javascript">document.getElementById("${scriptId}")?.remove();${scriptSource}</script>`;
|
|
599
|
-
});
|
|
600
|
-
const lower = response.body.toLowerCase();
|
|
601
|
-
const headStartIndex = lower.indexOf("<head");
|
|
602
|
-
if (headStartIndex !== -1) {
|
|
603
|
-
const headEndTagIndex = lower.indexOf("</head>", headStartIndex);
|
|
604
|
-
if (headEndTagIndex !== -1) {
|
|
605
|
-
const headOpenEnd = response.body.indexOf(">", headStartIndex) + 1;
|
|
606
|
-
const headContent = response.body.slice(headOpenEnd, headEndTagIndex);
|
|
607
|
-
const headContentLower = headContent.toLowerCase();
|
|
608
|
-
let firstScriptIndex = -1;
|
|
609
|
-
let searchPos = 0;
|
|
610
|
-
const endSearchPos = headContentLower.length;
|
|
611
|
-
while (searchPos < endSearchPos) {
|
|
612
|
-
const commentStart = headContentLower.indexOf("<!--", searchPos);
|
|
613
|
-
const scriptStart = headContentLower.indexOf("<script", searchPos);
|
|
614
|
-
if (scriptStart === -1 || scriptStart >= endSearchPos) {
|
|
615
|
-
break;
|
|
616
|
-
}
|
|
617
|
-
if (commentStart !== -1 && commentStart < scriptStart) {
|
|
618
|
-
const commentEnd = headContentLower.indexOf("-->", commentStart);
|
|
619
|
-
if (commentEnd !== -1) {
|
|
620
|
-
searchPos = commentEnd + 3;
|
|
621
|
-
continue;
|
|
622
|
-
} else {
|
|
623
|
-
break;
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
firstScriptIndex = scriptStart;
|
|
627
|
-
break;
|
|
628
|
-
}
|
|
629
|
-
if (firstScriptIndex !== -1) {
|
|
630
|
-
const insertPosition = headOpenEnd + firstScriptIndex;
|
|
631
|
-
response.body = response.body.slice(0, insertPosition) + injectionHTML + response.body.slice(insertPosition);
|
|
632
|
-
} else {
|
|
633
|
-
response.body = response.body.slice(0, headEndTagIndex) + injectionHTML + response.body.slice(headEndTagIndex);
|
|
634
|
-
}
|
|
635
|
-
} else {
|
|
636
|
-
const headStartTagEnd = response.body.indexOf(">", headStartIndex) + 1;
|
|
637
|
-
response.body = response.body.slice(0, headStartTagEnd) + injectionHTML + response.body.slice(headStartTagEnd);
|
|
638
|
-
}
|
|
639
|
-
} else {
|
|
640
|
-
const doctypeIndex = lower.indexOf("<!doctype");
|
|
641
|
-
if (doctypeIndex === 0) {
|
|
642
|
-
const doctypeEnd = response.body.indexOf(">", doctypeIndex) + 1;
|
|
643
|
-
response.body = response.body.slice(0, doctypeEnd) + injectionHTML + response.body.slice(doctypeEnd);
|
|
644
|
-
} else {
|
|
645
|
-
const htmlIndex = lower.indexOf("<html");
|
|
646
|
-
if (htmlIndex !== -1) {
|
|
647
|
-
const htmlTagEnd = response.body.indexOf(">", htmlIndex) + 1;
|
|
648
|
-
response.body = response.body.slice(0, htmlTagEnd) + `<head>${injectionHTML}</head>` + response.body.slice(htmlTagEnd);
|
|
649
|
-
} else {
|
|
650
|
-
response.body = injectionHTML + response.body;
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
515
|
this._fulfilled = true;
|
|
656
516
|
const body = response.isBase64 ? response.body : Buffer.from(response.body).toString("base64");
|
|
657
517
|
const responseHeaders = splitSetCookieHeader(response.headers);
|
|
658
518
|
await catchDisallowedErrors(async () => {
|
|
659
519
|
await this._session.send("Fetch.fulfillRequest", {
|
|
660
|
-
requestId:
|
|
520
|
+
requestId: this._interceptionId,
|
|
661
521
|
responseCode: response.status,
|
|
662
522
|
responsePhrase: network.statusText(response.status),
|
|
663
523
|
responseHeaders,
|
|
@@ -675,121 +535,6 @@ class RouteImpl {
|
|
|
675
535
|
});
|
|
676
536
|
});
|
|
677
537
|
}
|
|
678
|
-
_fixCSP(csp, scriptNonce) {
|
|
679
|
-
if (!csp || typeof csp !== "string") return csp;
|
|
680
|
-
const directives = csp.split(";").map((d) => d.trim()).filter((d) => d && d.length > 0);
|
|
681
|
-
const fixedDirectives = [];
|
|
682
|
-
let hasScriptSrc = false;
|
|
683
|
-
for (let directive of directives) {
|
|
684
|
-
if (!directive.trim()) continue;
|
|
685
|
-
const directiveMatch = directive.match(/^([a-zA-Z-]+)\s+(.*)$/);
|
|
686
|
-
if (!directiveMatch) {
|
|
687
|
-
fixedDirectives.push(directive);
|
|
688
|
-
continue;
|
|
689
|
-
}
|
|
690
|
-
const directiveName = directiveMatch[1].toLowerCase();
|
|
691
|
-
const directiveValues = directiveMatch[2].split(/\s+/).filter((v) => v.length > 0);
|
|
692
|
-
switch (directiveName) {
|
|
693
|
-
case "script-src":
|
|
694
|
-
hasScriptSrc = true;
|
|
695
|
-
let values = [...directiveValues];
|
|
696
|
-
if (scriptNonce && !values.some((v) => v.includes(`nonce-${scriptNonce}`))) {
|
|
697
|
-
values.push(`'nonce-${scriptNonce}'`);
|
|
698
|
-
}
|
|
699
|
-
if (!values.includes("'unsafe-eval'")) {
|
|
700
|
-
values.push("'unsafe-eval'");
|
|
701
|
-
}
|
|
702
|
-
if (!values.includes("'unsafe-inline'") && !scriptNonce) {
|
|
703
|
-
values.push("'unsafe-inline'");
|
|
704
|
-
}
|
|
705
|
-
if (!values.includes("*") && !values.includes("'self'") && !values.some((v) => v.includes("https:"))) {
|
|
706
|
-
values.push("*");
|
|
707
|
-
}
|
|
708
|
-
fixedDirectives.push(`script-src ${values.join(" ")}`);
|
|
709
|
-
break;
|
|
710
|
-
case "style-src":
|
|
711
|
-
let styleValues = [...directiveValues];
|
|
712
|
-
if (!styleValues.includes("'unsafe-inline'")) {
|
|
713
|
-
styleValues.push("'unsafe-inline'");
|
|
714
|
-
}
|
|
715
|
-
fixedDirectives.push(`style-src ${styleValues.join(" ")}`);
|
|
716
|
-
break;
|
|
717
|
-
case "img-src":
|
|
718
|
-
let imgValues = [...directiveValues];
|
|
719
|
-
if (!imgValues.includes("data:") && !imgValues.includes("*")) {
|
|
720
|
-
imgValues.push("data:");
|
|
721
|
-
}
|
|
722
|
-
fixedDirectives.push(`img-src ${imgValues.join(" ")}`);
|
|
723
|
-
break;
|
|
724
|
-
case "font-src":
|
|
725
|
-
let fontValues = [...directiveValues];
|
|
726
|
-
if (!fontValues.includes("data:") && !fontValues.includes("*")) {
|
|
727
|
-
fontValues.push("data:");
|
|
728
|
-
}
|
|
729
|
-
fixedDirectives.push(`font-src ${fontValues.join(" ")}`);
|
|
730
|
-
break;
|
|
731
|
-
case "connect-src":
|
|
732
|
-
let connectValues = [...directiveValues];
|
|
733
|
-
const hasWs = connectValues.some((v) => v.includes("ws:") || v.includes("wss:") || v === "*");
|
|
734
|
-
if (!hasWs) {
|
|
735
|
-
connectValues.push("ws:", "wss:");
|
|
736
|
-
}
|
|
737
|
-
fixedDirectives.push(`connect-src ${connectValues.join(" ")}`);
|
|
738
|
-
break;
|
|
739
|
-
case "frame-ancestors":
|
|
740
|
-
let frameAncestorValues = [...directiveValues];
|
|
741
|
-
if (frameAncestorValues.includes("'none'")) {
|
|
742
|
-
frameAncestorValues = ["'self'"];
|
|
743
|
-
}
|
|
744
|
-
fixedDirectives.push(`frame-ancestors ${frameAncestorValues.join(" ")}`);
|
|
745
|
-
break;
|
|
746
|
-
default:
|
|
747
|
-
fixedDirectives.push(directive);
|
|
748
|
-
break;
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
if (!hasScriptSrc) {
|
|
752
|
-
if (scriptNonce) {
|
|
753
|
-
fixedDirectives.push(`script-src 'self' 'unsafe-eval' 'nonce-${scriptNonce}' *`);
|
|
754
|
-
} else {
|
|
755
|
-
fixedDirectives.push(`script-src 'self' 'unsafe-eval' 'unsafe-inline' *`);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
return fixedDirectives.join("; ");
|
|
759
|
-
}
|
|
760
|
-
async _networkRequestIntercepted(event) {
|
|
761
|
-
if (event.resourceType !== "Document") {
|
|
762
|
-
return;
|
|
763
|
-
}
|
|
764
|
-
if (this._networkId != event.networkId || !this._sessionManager._alreadyTrackedNetworkIds.has(event.networkId)) return;
|
|
765
|
-
try {
|
|
766
|
-
const url = event.request?.url || "";
|
|
767
|
-
const isPrivilegePage = url.startsWith("https://ntp.msn");
|
|
768
|
-
if (isPrivilegePage) {
|
|
769
|
-
await this._session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
|
|
770
|
-
return;
|
|
771
|
-
}
|
|
772
|
-
if (event.responseStatusCode >= 301 && event.responseStatusCode <= 308 || event.redirectedRequestId && !event.responseStatusCode) {
|
|
773
|
-
await this._session.send("Fetch.continueRequest", { requestId: event.requestId, interceptResponse: true });
|
|
774
|
-
} else {
|
|
775
|
-
const responseBody = await this._session.send("Fetch.getResponseBody", { requestId: event.requestId });
|
|
776
|
-
await this.fulfill({
|
|
777
|
-
headers: event.responseHeaders,
|
|
778
|
-
isBase64: true,
|
|
779
|
-
body: responseBody.body,
|
|
780
|
-
status: event.responseStatusCode,
|
|
781
|
-
interceptionId: event.requestId,
|
|
782
|
-
resourceType: event.resourceType
|
|
783
|
-
});
|
|
784
|
-
}
|
|
785
|
-
} catch (error) {
|
|
786
|
-
if (error.message.includes("Can only get response body on HeadersReceived pattern matched requests.")) {
|
|
787
|
-
await this._session.send("Fetch.continueRequest", { requestId: event.requestId, interceptResponse: true });
|
|
788
|
-
} else {
|
|
789
|
-
await this._session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId });
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
538
|
}
|
|
794
539
|
async function catchDisallowedErrors(callback) {
|
|
795
540
|
try {
|