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.
- package/ThirdPartyNotices.txt +2688 -297
- package/browsers.json +23 -22
- 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 +48 -413
- package/lib/client/android.js +4 -4
- package/lib/client/api.js +3 -0
- package/lib/client/browser.js +11 -5
- package/lib/client/browserContext.js +20 -23
- package/lib/client/browserType.js +23 -54
- 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 -0
- 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 -1
- package/lib/client/events.js +3 -0
- package/lib/client/fetch.js +2 -4
- package/lib/client/frame.js +9 -13
- package/lib/client/harRouter.js +13 -1
- package/lib/client/jsHandle.js +4 -8
- package/lib/client/locator.js +13 -36
- package/lib/client/network.js +14 -11
- package/lib/client/page.js +44 -50
- 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 +78 -0
- package/lib/mcpBundleImpl.js +91 -0
- package/lib/protocol/serializers.js +5 -0
- package/lib/protocol/validator.js +228 -58
- 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 +14 -10
- 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/artifact.js +1 -1
- package/lib/server/bidi/bidiBrowser.js +80 -14
- package/lib/server/bidi/bidiChromium.js +23 -14
- package/lib/server/bidi/bidiConnection.js +1 -0
- package/lib/server/bidi/bidiDeserializer.js +116 -0
- package/lib/server/bidi/bidiExecutionContext.js +75 -29
- package/lib/server/bidi/bidiFirefox.js +6 -8
- package/lib/server/bidi/bidiNetworkManager.js +40 -12
- package/lib/server/bidi/bidiPage.js +67 -40
- package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
- package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
- package/lib/server/browser.js +84 -21
- package/lib/server/browserContext.js +137 -77
- package/lib/server/browserType.js +26 -16
- package/lib/server/chromium/chromium.js +28 -31
- package/lib/server/chromium/chromiumSwitches.js +16 -4
- package/lib/server/chromium/crBrowser.js +40 -27
- package/lib/server/chromium/crConnection.js +0 -5
- package/lib/server/chromium/crDevTools.js +1 -2
- package/lib/server/chromium/crNetworkManager.js +54 -229
- package/lib/server/chromium/crPage.js +74 -260
- package/lib/server/chromium/crServiceWorker.js +7 -14
- package/lib/server/clock.js +33 -41
- package/lib/server/codegen/javascript.js +6 -29
- 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 +30 -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 +7 -14
- package/lib/server/dispatchers/disposableDispatcher.js +39 -0
- package/lib/server/dispatchers/electronDispatcher.js +2 -1
- package/lib/server/dispatchers/frameDispatcher.js +7 -7
- package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
- package/lib/server/dispatchers/networkDispatchers.js +6 -5
- package/lib/server/dispatchers/pageDispatcher.js +101 -34
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
- package/lib/server/disposable.js +41 -0
- package/lib/server/dom.js +56 -29
- package/lib/server/download.js +3 -2
- package/lib/server/electron/electron.js +17 -9
- package/lib/server/firefox/ffBrowser.js +9 -29
- package/lib/server/firefox/ffConnection.js +0 -5
- package/lib/server/firefox/ffInput.js +21 -5
- package/lib/server/firefox/ffNetworkManager.js +4 -4
- package/lib/server/firefox/ffPage.js +27 -33
- package/lib/server/firefox/firefox.js +6 -8
- package/lib/server/frameSelectors.js +14 -169
- package/lib/server/frames.js +263 -551
- 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 +8 -0
- package/lib/server/javascript.js +6 -22
- package/lib/server/launchApp.js +0 -1
- package/lib/server/localUtils.js +6 -6
- package/lib/server/network.js +59 -20
- package/lib/server/overlay.js +138 -0
- package/lib/server/page.js +179 -157
- package/lib/server/progress.js +32 -6
- package/lib/server/recorder/recorderApp.js +84 -104
- package/lib/server/recorder.js +76 -40
- package/lib/server/registry/browserFetcher.js +6 -4
- package/lib/server/registry/index.js +222 -226
- package/lib/server/registry/nativeDeps.js +1 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
- package/lib/server/screencast.js +137 -0
- package/lib/server/trace/recorder/snapshotter.js +2 -2
- package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
- package/lib/server/trace/recorder/tracing.js +98 -47
- package/lib/server/trace/viewer/traceViewer.js +24 -21
- 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/expectUtils.js +87 -2
- package/lib/server/utils/fileUtils.js +16 -2
- package/lib/server/utils/happyEyeballs.js +15 -12
- package/lib/server/utils/httpServer.js +10 -23
- package/lib/server/utils/network.js +39 -29
- package/lib/server/utils/processLauncher.js +8 -6
- package/lib/server/utils/zipFile.js +2 -2
- package/lib/server/videoRecorder.js +194 -0
- package/lib/server/webkit/webkit.js +4 -6
- package/lib/server/webkit/wkBrowser.js +1 -10
- package/lib/server/webkit/wkConnection.js +1 -6
- package/lib/server/webkit/wkInterceptableRequest.js +29 -1
- package/lib/server/webkit/wkPage.js +88 -57
- 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/tools/trace/installSkill.js +48 -0
- 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/ariaSnapshot.js +60 -2
- package/lib/utils/isomorphic/formatUtils.js +64 -0
- package/lib/utils/isomorphic/jsonSchema.js +89 -0
- package/lib/utils/isomorphic/lruCache.js +51 -0
- package/lib/utils/isomorphic/mimeType.js +7 -2
- package/lib/utils/isomorphic/protocolFormatter.js +2 -2
- package/lib/utils/isomorphic/protocolMetainfo.js +127 -98
- package/lib/utils/isomorphic/stringUtils.js +49 -0
- package/lib/utils/isomorphic/timeoutRunner.js +3 -3
- package/lib/utils/isomorphic/trace/entries.js +16 -0
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +492 -0
- package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
- package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
- package/lib/utils/isomorphic/trace/traceLoader.js +132 -0
- package/lib/utils/isomorphic/trace/traceModel.js +366 -0
- package/lib/utils/isomorphic/trace/traceModernizer.js +401 -0
- package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
- package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
- package/lib/utils/isomorphic/urlMatch.js +54 -1
- package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
- package/lib/utils/isomorphic/yaml.js +84 -0
- package/lib/utils.js +8 -2
- package/lib/utilsBundle.js +5 -26
- package/lib/utilsBundleImpl/index.js +172 -173
- 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-C8KMvO9L.js +32 -0
- package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
- package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
- package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-DS0FLvoc.js +32 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
- package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
- package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
- package/lib/vite/traceViewer/index.CzXZzn5A.css +1 -0
- package/lib/vite/traceViewer/index.Dtstcb7U.js +2 -0
- package/lib/vite/traceViewer/index.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +5 -3
- 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 +7 -1
- package/types/protocol.d.ts +1696 -221
- package/types/types.d.ts +879 -112
- package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
- package/lib/server/chromium/videoRecorder.js +0 -115
- package/lib/server/pageBinding.js +0 -87
- package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
- package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
- package/lib/vite/recorder/assets/codeMirrorModule-CBbSe-ZI.js +0 -25
- package/lib/vite/recorder/assets/index-CpZVd2nA.js +0 -193
- package/lib/vite/traceViewer/assets/codeMirrorModule-DHz0wP2C.js +0 -25
- package/lib/vite/traceViewer/assets/defaultSettingsView-WsZP88O6.js +0 -266
- package/lib/vite/traceViewer/defaultSettingsView.ConWv5KN.css +0 -1
- package/lib/vite/traceViewer/index.C4Y3Aw8n.css +0 -1
- package/lib/vite/traceViewer/index.C8xAeo93.js +0 -2
- package/lib/vite/traceViewer/uiMode.BltraIJB.js +0 -5
- /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
- /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 (
|
|
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
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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())
|
|
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
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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:
|
|
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?.
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
519
|
-
await
|
|
520
|
-
|
|
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(/&/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)));
|
|
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, "'").replace(/"/g, """);
|
|
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:
|
|
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
|