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
|
@@ -101,7 +101,7 @@ const tBinary = (arg, path, context) => {
|
|
|
101
101
|
return arg.toString("base64");
|
|
102
102
|
}
|
|
103
103
|
if (context.binary === "buffer") {
|
|
104
|
-
if (!(arg instanceof Buffer))
|
|
104
|
+
if (!(arg instanceof Buffer) && !(arg instanceof Object))
|
|
105
105
|
throw new ValidationError(`${path}: expected Buffer, got ${typeof arg}`);
|
|
106
106
|
return arg;
|
|
107
107
|
}
|
|
@@ -29,10 +29,10 @@ var import_profiler = require("../server/utils/profiler");
|
|
|
29
29
|
var import_utils = require("../utils");
|
|
30
30
|
var import_debugLogger = require("../server/utils/debugLogger");
|
|
31
31
|
class PlaywrightConnection {
|
|
32
|
-
constructor(semaphore,
|
|
32
|
+
constructor(semaphore, transport, controller, playwright, initialize, id) {
|
|
33
33
|
this._cleanups = [];
|
|
34
34
|
this._disconnected = false;
|
|
35
|
-
this.
|
|
35
|
+
this._transport = transport;
|
|
36
36
|
this._semaphore = semaphore;
|
|
37
37
|
this._id = id;
|
|
38
38
|
this._profileName = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -40,16 +40,16 @@ class PlaywrightConnection {
|
|
|
40
40
|
this._dispatcherConnection = new import_server.DispatcherConnection();
|
|
41
41
|
this._dispatcherConnection.onmessage = async (message) => {
|
|
42
42
|
await lock;
|
|
43
|
-
if (
|
|
43
|
+
if (!transport.isClosed()) {
|
|
44
44
|
const messageString = JSON.stringify(message);
|
|
45
45
|
if (import_debugLogger.debugLogger.isEnabled("server:channel"))
|
|
46
46
|
import_debugLogger.debugLogger.log("server:channel", `[${this._id}] ${(0, import_utils.monotonicTime)() * 1e3} SEND \u25BA ${messageString}`);
|
|
47
47
|
if (import_debugLogger.debugLogger.isEnabled("server:metadata"))
|
|
48
48
|
this.logServerMetadata(message, messageString, "SEND");
|
|
49
|
-
|
|
49
|
+
transport.send(messageString);
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
|
-
|
|
52
|
+
transport.on("message", async (message) => {
|
|
53
53
|
await lock;
|
|
54
54
|
const messageString = Buffer.from(message).toString();
|
|
55
55
|
const jsonMessage = JSON.parse(messageString);
|
|
@@ -59,8 +59,8 @@ class PlaywrightConnection {
|
|
|
59
59
|
this.logServerMetadata(jsonMessage, messageString, "RECV");
|
|
60
60
|
this._dispatcherConnection.dispatch(jsonMessage);
|
|
61
61
|
});
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
transport.on("close", () => this._onDisconnect());
|
|
63
|
+
transport.on("error", (error) => this._onDisconnect(error));
|
|
64
64
|
if (controller) {
|
|
65
65
|
import_debugLogger.debugLogger.log("server", `[${this._id}] engaged reuse controller mode`);
|
|
66
66
|
this._root = new import_debugControllerDispatcher.DebugControllerDispatcher(this._dispatcherConnection, playwright.debugController);
|
|
@@ -90,6 +90,8 @@ class PlaywrightConnection {
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
async _onDisconnect(error) {
|
|
93
|
+
if (this._disconnected)
|
|
94
|
+
return;
|
|
93
95
|
this._disconnected = true;
|
|
94
96
|
import_debugLogger.debugLogger.log("server", `[${this._id}] disconnected. error: ${error}`);
|
|
95
97
|
await this._root.stopPendingOperations(new Error("Disconnected")).catch(() => {
|
|
@@ -118,7 +120,7 @@ class PlaywrightConnection {
|
|
|
118
120
|
return;
|
|
119
121
|
import_debugLogger.debugLogger.log("server", `[${this._id}] force closing connection: ${reason?.reason || ""} (${reason?.code || 0})`);
|
|
120
122
|
try {
|
|
121
|
-
this.
|
|
123
|
+
this._transport.close(reason);
|
|
122
124
|
} catch (e) {
|
|
123
125
|
}
|
|
124
126
|
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var playwrightPipeServer_exports = {};
|
|
30
|
+
__export(playwrightPipeServer_exports, {
|
|
31
|
+
PlaywrightPipeServer: () => PlaywrightPipeServer
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(playwrightPipeServer_exports);
|
|
34
|
+
var import_net = __toESM(require("net"));
|
|
35
|
+
var import_fs = __toESM(require("fs"));
|
|
36
|
+
var import_playwrightConnection = require("./playwrightConnection");
|
|
37
|
+
var import_serverTransport = require("./serverTransport");
|
|
38
|
+
var import_debugLogger = require("../server/utils/debugLogger");
|
|
39
|
+
var import_browser = require("../server/browser");
|
|
40
|
+
var import_utils = require("../utils");
|
|
41
|
+
class PlaywrightPipeServer {
|
|
42
|
+
constructor(browser) {
|
|
43
|
+
this._connections = /* @__PURE__ */ new Set();
|
|
44
|
+
this._connectionId = 0;
|
|
45
|
+
this._browser = browser;
|
|
46
|
+
browser.on(import_browser.Browser.Events.Disconnected, () => this.close());
|
|
47
|
+
}
|
|
48
|
+
async listen(pipeName) {
|
|
49
|
+
if (!pipeName.startsWith("\\\\.\\pipe\\")) {
|
|
50
|
+
try {
|
|
51
|
+
import_fs.default.unlinkSync(pipeName);
|
|
52
|
+
} catch {
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this._server = import_net.default.createServer((socket) => {
|
|
56
|
+
const id = String(++this._connectionId);
|
|
57
|
+
import_debugLogger.debugLogger.log("server", `[${id}] pipe client connected`);
|
|
58
|
+
const transport = new import_serverTransport.SocketServerTransport(socket);
|
|
59
|
+
const connection = new import_playwrightConnection.PlaywrightConnection(
|
|
60
|
+
new import_utils.Semaphore(1),
|
|
61
|
+
transport,
|
|
62
|
+
false,
|
|
63
|
+
this._browser.attribution.playwright,
|
|
64
|
+
() => this._initPreLaunchedBrowserMode(id),
|
|
65
|
+
id
|
|
66
|
+
);
|
|
67
|
+
this._connections.add(connection);
|
|
68
|
+
transport.on("close", () => this._connections.delete(connection));
|
|
69
|
+
});
|
|
70
|
+
(0, import_utils.decorateServer)(this._server);
|
|
71
|
+
await new Promise((resolve, reject) => {
|
|
72
|
+
this._server.listen(pipeName, () => resolve());
|
|
73
|
+
this._server.on("error", reject);
|
|
74
|
+
});
|
|
75
|
+
import_debugLogger.debugLogger.log("server", `Pipe server listening at ${pipeName}`);
|
|
76
|
+
}
|
|
77
|
+
async _initPreLaunchedBrowserMode(id) {
|
|
78
|
+
import_debugLogger.debugLogger.log("server", `[${id}] engaged pre-launched (browser) pipe mode`);
|
|
79
|
+
return {
|
|
80
|
+
preLaunchedBrowser: this._browser,
|
|
81
|
+
sharedBrowser: true,
|
|
82
|
+
denyLaunch: true
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async close() {
|
|
86
|
+
if (!this._server)
|
|
87
|
+
return;
|
|
88
|
+
import_debugLogger.debugLogger.log("server", "closing pipe server");
|
|
89
|
+
for (const connection of this._connections)
|
|
90
|
+
await connection.close({ code: 1001, reason: "Server closing" });
|
|
91
|
+
this._connections.clear();
|
|
92
|
+
await new Promise((f) => this._server.close(() => f()));
|
|
93
|
+
this._server = void 0;
|
|
94
|
+
import_debugLogger.debugLogger.log("server", "closed pipe server");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
98
|
+
0 && (module.exports = {
|
|
99
|
+
PlaywrightPipeServer
|
|
100
|
+
});
|
|
@@ -22,6 +22,7 @@ __export(playwrightServer_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(playwrightServer_exports);
|
|
24
24
|
var import_playwrightConnection = require("./playwrightConnection");
|
|
25
|
+
var import_serverTransport = require("./serverTransport");
|
|
25
26
|
var import_playwright = require("../server/playwright");
|
|
26
27
|
var import_semaphore = require("../utils/isomorphic/semaphore");
|
|
27
28
|
var import_time = require("../utils/isomorphic/time");
|
|
@@ -86,6 +87,8 @@ ${uaError}` };
|
|
|
86
87
|
const isExtension = this._options.mode === "extension";
|
|
87
88
|
const allowFSPaths = isExtension;
|
|
88
89
|
launchOptions = filterLaunchOptions(launchOptions, allowFSPaths);
|
|
90
|
+
if (this._options.artifactsDir)
|
|
91
|
+
launchOptions.artifactsDir = this._options.artifactsDir;
|
|
89
92
|
if (isExtension) {
|
|
90
93
|
const connectFilter = url.searchParams.get("connect");
|
|
91
94
|
if (connectFilter) {
|
|
@@ -93,7 +96,7 @@ ${uaError}` };
|
|
|
93
96
|
throw new Error(`Unknown connect filter: ${connectFilter}`);
|
|
94
97
|
return new import_playwrightConnection.PlaywrightConnection(
|
|
95
98
|
browserSemaphore,
|
|
96
|
-
ws,
|
|
99
|
+
new import_serverTransport.WebSocketServerTransport(ws),
|
|
97
100
|
false,
|
|
98
101
|
this._playwright,
|
|
99
102
|
() => this._initConnectMode(id, connectFilter, browserName, launchOptions),
|
|
@@ -103,7 +106,7 @@ ${uaError}` };
|
|
|
103
106
|
if (url.searchParams.has("debug-controller")) {
|
|
104
107
|
return new import_playwrightConnection.PlaywrightConnection(
|
|
105
108
|
controllerSemaphore,
|
|
106
|
-
ws,
|
|
109
|
+
new import_serverTransport.WebSocketServerTransport(ws),
|
|
107
110
|
true,
|
|
108
111
|
this._playwright,
|
|
109
112
|
async () => {
|
|
@@ -114,7 +117,7 @@ ${uaError}` };
|
|
|
114
117
|
}
|
|
115
118
|
return new import_playwrightConnection.PlaywrightConnection(
|
|
116
119
|
reuseBrowserSemaphore,
|
|
117
|
-
ws,
|
|
120
|
+
new import_serverTransport.WebSocketServerTransport(ws),
|
|
118
121
|
false,
|
|
119
122
|
this._playwright,
|
|
120
123
|
() => this._initReuseBrowsersMode(browserName, launchOptions, id),
|
|
@@ -125,7 +128,7 @@ ${uaError}` };
|
|
|
125
128
|
if (this._options.preLaunchedBrowser) {
|
|
126
129
|
return new import_playwrightConnection.PlaywrightConnection(
|
|
127
130
|
browserSemaphore,
|
|
128
|
-
ws,
|
|
131
|
+
new import_serverTransport.WebSocketServerTransport(ws),
|
|
129
132
|
false,
|
|
130
133
|
this._playwright,
|
|
131
134
|
() => this._initPreLaunchedBrowserMode(id),
|
|
@@ -134,7 +137,7 @@ ${uaError}` };
|
|
|
134
137
|
}
|
|
135
138
|
return new import_playwrightConnection.PlaywrightConnection(
|
|
136
139
|
browserSemaphore,
|
|
137
|
-
ws,
|
|
140
|
+
new import_serverTransport.WebSocketServerTransport(ws),
|
|
138
141
|
false,
|
|
139
142
|
this._playwright,
|
|
140
143
|
() => this._initPreLaunchedAndroidMode(id),
|
|
@@ -143,7 +146,7 @@ ${uaError}` };
|
|
|
143
146
|
}
|
|
144
147
|
return new import_playwrightConnection.PlaywrightConnection(
|
|
145
148
|
browserSemaphore,
|
|
146
|
-
ws,
|
|
149
|
+
new import_serverTransport.WebSocketServerTransport(ws),
|
|
147
150
|
false,
|
|
148
151
|
this._playwright,
|
|
149
152
|
() => this._initLaunchBrowserMode(browserName, proxyValue, launchOptions, id),
|
|
@@ -313,7 +316,8 @@ function filterLaunchOptions(options, allowFSPaths) {
|
|
|
313
316
|
firefoxUserPrefs: options.firefoxUserPrefs,
|
|
314
317
|
slowMo: options.slowMo,
|
|
315
318
|
executablePath: (0, import_utils.isUnderTest)() || allowFSPaths ? options.executablePath : void 0,
|
|
316
|
-
downloadsPath: allowFSPaths ? options.downloadsPath : void 0
|
|
319
|
+
downloadsPath: allowFSPaths ? options.downloadsPath : void 0,
|
|
320
|
+
artifactsDir: (0, import_utils.isUnderTest)() || allowFSPaths ? options.artifactsDir : void 0
|
|
317
321
|
};
|
|
318
322
|
}
|
|
319
323
|
const defaultLaunchOptions = {
|
|
@@ -321,13 +325,13 @@ const defaultLaunchOptions = {
|
|
|
321
325
|
handleSIGINT: false,
|
|
322
326
|
handleSIGTERM: false,
|
|
323
327
|
handleSIGHUP: false,
|
|
324
|
-
headless: true
|
|
325
|
-
devtools: false
|
|
328
|
+
headless: true
|
|
326
329
|
};
|
|
327
330
|
const optionsThatAllowBrowserReuse = [
|
|
328
331
|
"headless",
|
|
329
332
|
"timeout",
|
|
330
|
-
"tracesDir"
|
|
333
|
+
"tracesDir",
|
|
334
|
+
"artifactsDir"
|
|
331
335
|
];
|
|
332
336
|
// Annotate the CommonJS export names for ESM import in node:
|
|
333
337
|
0 && (module.exports = {
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var playwrightWebSocketServer_exports = {};
|
|
20
|
+
__export(playwrightWebSocketServer_exports, {
|
|
21
|
+
PlaywrightWebSocketServer: () => PlaywrightWebSocketServer
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(playwrightWebSocketServer_exports);
|
|
24
|
+
var import_playwrightConnection = require("./playwrightConnection");
|
|
25
|
+
var import_serverTransport = require("./serverTransport");
|
|
26
|
+
var import_debugLogger = require("../server/utils/debugLogger");
|
|
27
|
+
var import_browser = require("../server/browser");
|
|
28
|
+
var import_utils = require("../utils");
|
|
29
|
+
var import_wsServer = require("../server/utils/wsServer");
|
|
30
|
+
class PlaywrightWebSocketServer {
|
|
31
|
+
constructor(browser, path) {
|
|
32
|
+
this._browser = browser;
|
|
33
|
+
browser.on(import_browser.Browser.Events.Disconnected, () => this.close());
|
|
34
|
+
const semaphore = new import_utils.Semaphore(Infinity);
|
|
35
|
+
this._wsServer = new import_wsServer.WSServer({
|
|
36
|
+
onRequest: (request, response) => {
|
|
37
|
+
response.end("Running");
|
|
38
|
+
},
|
|
39
|
+
onUpgrade: () => void 0,
|
|
40
|
+
onHeaders: () => {
|
|
41
|
+
},
|
|
42
|
+
onConnection: (request, url, ws, id) => {
|
|
43
|
+
import_debugLogger.debugLogger.log("server", `[${id}] ws client connected`);
|
|
44
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
45
|
+
semaphore,
|
|
46
|
+
new import_serverTransport.WebSocketServerTransport(ws),
|
|
47
|
+
false,
|
|
48
|
+
this._browser.attribution.playwright,
|
|
49
|
+
() => this._initPreLaunchedBrowserMode(id),
|
|
50
|
+
id
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async _initPreLaunchedBrowserMode(id) {
|
|
56
|
+
import_debugLogger.debugLogger.log("server", `[${id}] engaged pre-launched (browser) ws mode`);
|
|
57
|
+
return {
|
|
58
|
+
preLaunchedBrowser: this._browser,
|
|
59
|
+
sharedBrowser: true,
|
|
60
|
+
denyLaunch: true
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
async listen(port = 0, hostname, path) {
|
|
64
|
+
return await this._wsServer.listen(port, hostname, path || "/");
|
|
65
|
+
}
|
|
66
|
+
async close() {
|
|
67
|
+
await this._wsServer.close();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
71
|
+
0 && (module.exports = {
|
|
72
|
+
PlaywrightWebSocketServer
|
|
73
|
+
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var serverTransport_exports = {};
|
|
20
|
+
__export(serverTransport_exports, {
|
|
21
|
+
SocketServerTransport: () => SocketServerTransport,
|
|
22
|
+
WebSocketServerTransport: () => WebSocketServerTransport
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(serverTransport_exports);
|
|
25
|
+
var import_events = require("events");
|
|
26
|
+
class WebSocketServerTransport {
|
|
27
|
+
constructor(ws) {
|
|
28
|
+
this._ws = ws;
|
|
29
|
+
}
|
|
30
|
+
send(message) {
|
|
31
|
+
this._ws.send(message);
|
|
32
|
+
}
|
|
33
|
+
close(reason) {
|
|
34
|
+
this._ws.close(reason?.code, reason?.reason);
|
|
35
|
+
}
|
|
36
|
+
on(event, handler) {
|
|
37
|
+
this._ws.on(event, handler);
|
|
38
|
+
}
|
|
39
|
+
isClosed() {
|
|
40
|
+
return this._ws.readyState === this._ws.CLOSING || this._ws.readyState === this._ws.CLOSED;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
class SocketServerTransport extends import_events.EventEmitter {
|
|
44
|
+
constructor(socket) {
|
|
45
|
+
super();
|
|
46
|
+
this._closed = false;
|
|
47
|
+
this._pendingBuffers = [];
|
|
48
|
+
this._socket = socket;
|
|
49
|
+
socket.on("data", (buffer) => this._dispatch(buffer));
|
|
50
|
+
socket.on("close", () => {
|
|
51
|
+
this._closed = true;
|
|
52
|
+
super.emit("close");
|
|
53
|
+
});
|
|
54
|
+
socket.on("error", (error) => {
|
|
55
|
+
super.emit("error", error);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
send(message) {
|
|
59
|
+
if (this._closed)
|
|
60
|
+
return;
|
|
61
|
+
this._socket.write(message);
|
|
62
|
+
this._socket.write("\0");
|
|
63
|
+
}
|
|
64
|
+
close(reason) {
|
|
65
|
+
if (this._closed)
|
|
66
|
+
return;
|
|
67
|
+
this._closed = true;
|
|
68
|
+
this._socket.end();
|
|
69
|
+
}
|
|
70
|
+
isClosed() {
|
|
71
|
+
return this._closed;
|
|
72
|
+
}
|
|
73
|
+
_dispatch(buffer) {
|
|
74
|
+
let end = buffer.indexOf("\0");
|
|
75
|
+
if (end === -1) {
|
|
76
|
+
this._pendingBuffers.push(buffer);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this._pendingBuffers.push(buffer.slice(0, end));
|
|
80
|
+
const message = Buffer.concat(this._pendingBuffers).toString();
|
|
81
|
+
super.emit("message", message);
|
|
82
|
+
let start = end + 1;
|
|
83
|
+
end = buffer.indexOf("\0", start);
|
|
84
|
+
while (end !== -1) {
|
|
85
|
+
super.emit("message", buffer.toString(void 0, start, end));
|
|
86
|
+
start = end + 1;
|
|
87
|
+
end = buffer.indexOf("\0", start);
|
|
88
|
+
}
|
|
89
|
+
this._pendingBuffers = [buffer.slice(start)];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
93
|
+
0 && (module.exports = {
|
|
94
|
+
SocketServerTransport,
|
|
95
|
+
WebSocketServerTransport
|
|
96
|
+
});
|
|
@@ -261,7 +261,7 @@ class AndroidDevice extends import_instrumentation.SdkObject {
|
|
|
261
261
|
const proxyBypassRules = [];
|
|
262
262
|
if (proxy.bypass)
|
|
263
263
|
proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t));
|
|
264
|
-
if (
|
|
264
|
+
if ((0, import_crBrowser.shouldProxyLoopback)(proxy.bypass))
|
|
265
265
|
proxyBypassRules.push("<-loopback>");
|
|
266
266
|
if (proxyBypassRules.length > 0)
|
|
267
267
|
chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`);
|
|
@@ -294,7 +294,7 @@ class AndroidDevice extends import_instrumentation.SdkObject {
|
|
|
294
294
|
});
|
|
295
295
|
const browserOptions = {
|
|
296
296
|
name: "clank",
|
|
297
|
-
|
|
297
|
+
browserType: "chromium",
|
|
298
298
|
slowMo: 0,
|
|
299
299
|
persistent: { ...options, noDefaultViewport: true },
|
|
300
300
|
artifactsDir,
|
package/lib/server/artifact.js
CHANGED
|
@@ -103,7 +103,7 @@ class Artifact extends import_instrumentation.SdkObject {
|
|
|
103
103
|
if (!this._unaccessibleErrorMessage)
|
|
104
104
|
await import_fs.default.promises.unlink(this._localPath).catch((e) => {
|
|
105
105
|
});
|
|
106
|
-
await this.reportFinished(new import_errors.TargetClosedError());
|
|
106
|
+
await this.reportFinished(new import_errors.TargetClosedError(this.closeReason()));
|
|
107
107
|
}
|
|
108
108
|
async reportFinished(error) {
|
|
109
109
|
if (this._finished)
|
|
@@ -48,6 +48,7 @@ class BidiBrowser extends import_browser.Browser {
|
|
|
48
48
|
super(parent, options);
|
|
49
49
|
this._contexts = /* @__PURE__ */ new Map();
|
|
50
50
|
this._bidiPages = /* @__PURE__ */ new Map();
|
|
51
|
+
this._cacheBehavior = "default";
|
|
51
52
|
this._connection = new import_bidiConnection.BidiConnection(transport, this._onDisconnect.bind(this), options.protocolLogger, options.browserLogsCollector);
|
|
52
53
|
this._browserSession = this._connection.browserSession;
|
|
53
54
|
this._eventListeners = [
|
|
@@ -84,6 +85,7 @@ class BidiBrowser extends import_browser.Browser {
|
|
|
84
85
|
"input"
|
|
85
86
|
]
|
|
86
87
|
});
|
|
88
|
+
await browser._browserSession.send("network.addIntercept", { phases: [bidi.Network.InterceptPhase.AuthRequired] });
|
|
87
89
|
await browser._browserSession.send("network.addDataCollector", {
|
|
88
90
|
dataTypes: [bidi.Network.DataType.Response],
|
|
89
91
|
maxEncodedDataSize: 2e7
|
|
@@ -124,16 +126,27 @@ class BidiBrowser extends import_browser.Browser {
|
|
|
124
126
|
isConnected() {
|
|
125
127
|
return !this._connection.isClosed();
|
|
126
128
|
}
|
|
129
|
+
async updateCacheBehavior() {
|
|
130
|
+
const cacheBehavior = [...this._contexts.values()].some((context) => context.requestInterceptors.length > 0) ? "bypass" : "default";
|
|
131
|
+
if (this._cacheBehavior !== cacheBehavior) {
|
|
132
|
+
await this._browserSession.send("network.setCacheBehavior", { cacheBehavior });
|
|
133
|
+
this._cacheBehavior = cacheBehavior;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
127
136
|
_onBrowsingContextCreated(event) {
|
|
128
137
|
if (event.parent) {
|
|
129
138
|
const parentFrameId = event.parent;
|
|
130
139
|
const page2 = this._findPageForFrame(parentFrameId);
|
|
131
140
|
if (page2) {
|
|
132
141
|
page2._session.addFrameBrowsingContext(event.context);
|
|
133
|
-
page2._page.frameManager.frameAttached(event.context, parentFrameId);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
142
|
+
const frame = page2._page.frameManager.frameAttached(event.context, parentFrameId);
|
|
143
|
+
frame._url = event.url;
|
|
144
|
+
page2._getFrameNode(frame).then((node) => {
|
|
145
|
+
const attributes = node?.value?.attributes;
|
|
146
|
+
frame._name = attributes?.name ?? attributes?.id ?? "";
|
|
147
|
+
}, () => {
|
|
148
|
+
});
|
|
149
|
+
return;
|
|
137
150
|
}
|
|
138
151
|
return;
|
|
139
152
|
}
|
|
@@ -142,6 +155,7 @@ class BidiBrowser extends import_browser.Browser {
|
|
|
142
155
|
context = this._defaultContext;
|
|
143
156
|
if (!context)
|
|
144
157
|
return;
|
|
158
|
+
context.doGrantGlobalPermissionsForURL(event.url);
|
|
145
159
|
const session = this._connection.createMainFrameBrowsingContextSession(event.context);
|
|
146
160
|
const opener = event.originalOpener && this._findPageForFrame(event.originalOpener);
|
|
147
161
|
const page = new import_bidiPage.BidiPage(context, session, opener || null);
|
|
@@ -194,6 +208,11 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
194
208
|
const promises = [
|
|
195
209
|
super._initialize()
|
|
196
210
|
];
|
|
211
|
+
const downloadBehavior = this._options.acceptDownloads === "accept" ? { type: "allowed", destinationFolder: this._browser.options.downloadsPath } : { type: "denied" };
|
|
212
|
+
promises.push(this._browser._browserSession.send("browser.setDownloadBehavior", {
|
|
213
|
+
downloadBehavior,
|
|
214
|
+
userContexts: [this._userContextId()]
|
|
215
|
+
}));
|
|
197
216
|
promises.push(this.doUpdateDefaultViewport());
|
|
198
217
|
if (this._options.geolocation)
|
|
199
218
|
promises.push(this.setGeolocation(this._options.geolocation));
|
|
@@ -217,6 +236,10 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
217
236
|
}
|
|
218
237
|
if (this._options.extraHTTPHeaders)
|
|
219
238
|
promises.push(this.doUpdateExtraHTTPHeaders());
|
|
239
|
+
if (this._options.permissions)
|
|
240
|
+
promises.push(this.doGrantPermissions("*", this._options.permissions));
|
|
241
|
+
if (this._options.offline)
|
|
242
|
+
promises.push(this.doUpdateOffline());
|
|
220
243
|
await Promise.all(promises);
|
|
221
244
|
}
|
|
222
245
|
possiblyUninitializedPages() {
|
|
@@ -263,7 +286,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
263
286
|
};
|
|
264
287
|
return this._browser._browserSession.send(
|
|
265
288
|
"storage.setCookie",
|
|
266
|
-
{ cookie, partition: { type: "storageKey", userContext: this._browserContextId } }
|
|
289
|
+
{ cookie, partition: { type: "storageKey", userContext: this._browserContextId, sourceOrigin: c.partitionKey } }
|
|
267
290
|
);
|
|
268
291
|
});
|
|
269
292
|
await Promise.all(promises);
|
|
@@ -275,17 +298,34 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
275
298
|
);
|
|
276
299
|
}
|
|
277
300
|
async doGrantPermissions(origin, permissions) {
|
|
301
|
+
if (origin === "null")
|
|
302
|
+
return;
|
|
278
303
|
const currentPermissions = this._originToPermissions.get(origin) || [];
|
|
279
304
|
const toGrant = permissions.filter((permission) => !currentPermissions.includes(permission));
|
|
280
305
|
this._originToPermissions.set(origin, [...currentPermissions, ...toGrant]);
|
|
281
|
-
|
|
306
|
+
if (origin === "*") {
|
|
307
|
+
await Promise.all(this._bidiPages().flatMap(
|
|
308
|
+
(page) => page._page.frames().map(
|
|
309
|
+
(frame) => this.doGrantPermissions(new URL(frame._url).origin, permissions)
|
|
310
|
+
)
|
|
311
|
+
));
|
|
312
|
+
} else {
|
|
313
|
+
await Promise.all(toGrant.map((permission) => this._setPermission(origin, permission, bidi.Permissions.PermissionState.Granted)));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
async doGrantGlobalPermissionsForURL(url) {
|
|
317
|
+
const permissions = this._originToPermissions.get("*");
|
|
318
|
+
if (!permissions)
|
|
319
|
+
return;
|
|
320
|
+
await this.doGrantPermissions(new URL(url).origin, permissions);
|
|
282
321
|
}
|
|
283
322
|
async doClearPermissions() {
|
|
284
323
|
const currentPermissions = [...this._originToPermissions.entries()];
|
|
285
324
|
this._originToPermissions = /* @__PURE__ */ new Map();
|
|
286
|
-
await Promise.all(currentPermissions.
|
|
287
|
-
|
|
288
|
-
|
|
325
|
+
await Promise.all(currentPermissions.flatMap(([origin, permissions]) => {
|
|
326
|
+
if (origin !== "*")
|
|
327
|
+
return permissions.map((p) => this._setPermission(origin, p, bidi.Permissions.PermissionState.Prompt));
|
|
328
|
+
}));
|
|
289
329
|
}
|
|
290
330
|
async _setPermission(origin, permission, state) {
|
|
291
331
|
await this._browser._browserSession.send("permissions.setPermission", {
|
|
@@ -324,6 +364,10 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
324
364
|
});
|
|
325
365
|
}
|
|
326
366
|
async doUpdateOffline() {
|
|
367
|
+
await this._browser._browserSession.send("emulation.setNetworkConditions", {
|
|
368
|
+
networkConditions: this._options.offline ? { type: "offline" } : null,
|
|
369
|
+
userContexts: [this._userContextId()]
|
|
370
|
+
});
|
|
327
371
|
}
|
|
328
372
|
async doSetHTTPCredentials(httpCredentials) {
|
|
329
373
|
this._options.httpCredentials = httpCredentials;
|
|
@@ -349,21 +393,42 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
349
393
|
await Promise.all(ids.map((script) => this._browser._browserSession.send("script.removePreloadScript", { script })));
|
|
350
394
|
}
|
|
351
395
|
async doUpdateRequestInterception() {
|
|
396
|
+
let interceptPromise = Promise.resolve(void 0);
|
|
397
|
+
if (this.requestInterceptors.length > 0 && !this._interceptId) {
|
|
398
|
+
interceptPromise = this._browser._browserSession.send("network.addIntercept", {
|
|
399
|
+
phases: [bidi.Network.InterceptPhase.BeforeRequestSent]
|
|
400
|
+
}).then(({ intercept }) => this._interceptId = intercept);
|
|
401
|
+
}
|
|
402
|
+
if (this.requestInterceptors.length === 0 && this._interceptId) {
|
|
403
|
+
const intercept = this._interceptId;
|
|
404
|
+
this._interceptId = void 0;
|
|
405
|
+
interceptPromise = this._browser._browserSession.send("network.removeIntercept", { intercept });
|
|
406
|
+
}
|
|
407
|
+
await Promise.all([this._browser.updateCacheBehavior(), interceptPromise]);
|
|
352
408
|
}
|
|
353
409
|
async doUpdateDefaultViewport() {
|
|
354
|
-
if (!this._options.viewport)
|
|
410
|
+
if (!this._options.viewport && !this._options.screen)
|
|
355
411
|
return;
|
|
412
|
+
const screenSize = this._options.screen || this._options.viewport;
|
|
413
|
+
const viewportSize = this._options.viewport || this._options.screen;
|
|
356
414
|
await Promise.all([
|
|
357
415
|
this._browser._browserSession.send("browsingContext.setViewport", {
|
|
358
416
|
viewport: {
|
|
359
|
-
width:
|
|
360
|
-
height:
|
|
417
|
+
width: viewportSize.width,
|
|
418
|
+
height: viewportSize.height
|
|
361
419
|
},
|
|
362
420
|
devicePixelRatio: this._options.deviceScaleFactor || 1,
|
|
363
421
|
userContexts: [this._userContextId()]
|
|
364
422
|
}),
|
|
365
423
|
this._browser._browserSession.send("emulation.setScreenOrientationOverride", {
|
|
366
|
-
screenOrientation: getScreenOrientation(!!this._options.isMobile,
|
|
424
|
+
screenOrientation: getScreenOrientation(!!this._options.isMobile, screenSize),
|
|
425
|
+
userContexts: [this._userContextId()]
|
|
426
|
+
}),
|
|
427
|
+
this._browser._browserSession.send("emulation.setScreenSettingsOverride", {
|
|
428
|
+
screenArea: {
|
|
429
|
+
width: screenSize.width,
|
|
430
|
+
height: screenSize.height
|
|
431
|
+
},
|
|
367
432
|
userContexts: [this._userContextId()]
|
|
368
433
|
})
|
|
369
434
|
]);
|
|
@@ -386,7 +451,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
386
451
|
userContexts: [this._userContextId()]
|
|
387
452
|
}));
|
|
388
453
|
promises.push(...this._bidiPages().map((page) => {
|
|
389
|
-
const realms = [...page.
|
|
454
|
+
const realms = [...page._contextIdToContext].filter(([realm, context]) => context.world === "main").map(([realm, context]) => realm);
|
|
390
455
|
return Promise.all(realms.map((realm) => {
|
|
391
456
|
return page._session.send("script.callFunction", {
|
|
392
457
|
functionDeclaration,
|
|
@@ -411,6 +476,7 @@ class BidiBrowserContext extends import_browserContext.BrowserContext {
|
|
|
411
476
|
await this._browser._browserSession.send("browser.removeUserContext", {
|
|
412
477
|
userContext: this._browserContextId
|
|
413
478
|
});
|
|
479
|
+
await Promise.all(this._bidiPages().map((bidiPage) => bidiPage._page.closedPromise));
|
|
414
480
|
this._browser._contexts.delete(this._browserContextId);
|
|
415
481
|
}
|
|
416
482
|
async cancelDownload(uuid) {
|