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
|
@@ -32,6 +32,7 @@ __export(bidiPage_exports, {
|
|
|
32
32
|
kPlaywrightBindingChannel: () => kPlaywrightBindingChannel
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(bidiPage_exports);
|
|
35
|
+
var import_debugLogger = require("../utils/debugLogger");
|
|
35
36
|
var import_eventsHelper = require("../utils/eventsHelper");
|
|
36
37
|
var dialog = __toESM(require("../dialog"));
|
|
37
38
|
var dom = __toESM(require("../dom"));
|
|
@@ -50,12 +51,13 @@ class BidiPage {
|
|
|
50
51
|
this._realmToWorkerContext = /* @__PURE__ */ new Map();
|
|
51
52
|
this._sessionListeners = [];
|
|
52
53
|
this._initScriptIds = /* @__PURE__ */ new Map();
|
|
54
|
+
this._fragmentNavigations = /* @__PURE__ */ new Set();
|
|
53
55
|
this._session = bidiSession;
|
|
54
56
|
this._opener = opener;
|
|
55
57
|
this.rawKeyboard = new import_bidiInput.RawKeyboardImpl(bidiSession);
|
|
56
58
|
this.rawMouse = new import_bidiInput.RawMouseImpl(bidiSession);
|
|
57
59
|
this.rawTouchscreen = new import_bidiInput.RawTouchscreenImpl(bidiSession);
|
|
58
|
-
this.
|
|
60
|
+
this._contextIdToContext = /* @__PURE__ */ new Map();
|
|
59
61
|
this._page = new import_page.Page(this, browserContext);
|
|
60
62
|
this._browserContext = browserContext;
|
|
61
63
|
this._networkManager = new import_bidiNetworkManager.BidiNetworkManager(this._session, this._page);
|
|
@@ -87,8 +89,7 @@ class BidiPage {
|
|
|
87
89
|
async _initialize() {
|
|
88
90
|
this._onFrameAttached(this._session.sessionId, null);
|
|
89
91
|
await Promise.all([
|
|
90
|
-
this.updateHttpCredentials()
|
|
91
|
-
this.updateRequestInterception()
|
|
92
|
+
this.updateHttpCredentials()
|
|
92
93
|
// If the page is created by the Playwright client's call, some initialization
|
|
93
94
|
// may be pending. Wait for it to complete before reporting the page as new.
|
|
94
95
|
]);
|
|
@@ -102,9 +103,9 @@ class BidiPage {
|
|
|
102
103
|
return this._page.frameManager.frameAttached(frameId, parentFrameId);
|
|
103
104
|
}
|
|
104
105
|
_removeContextsForFrame(frame, notifyFrame) {
|
|
105
|
-
for (const [contextId, context] of this.
|
|
106
|
+
for (const [contextId, context] of this._contextIdToContext) {
|
|
106
107
|
if (context.frame === frame) {
|
|
107
|
-
this.
|
|
108
|
+
this._contextIdToContext.delete(contextId);
|
|
108
109
|
if (notifyFrame)
|
|
109
110
|
frame._contextDestroyed(context);
|
|
110
111
|
}
|
|
@@ -119,7 +120,7 @@ class BidiPage {
|
|
|
119
120
|
this._page.addWorker(realmInfo.realm, worker);
|
|
120
121
|
return;
|
|
121
122
|
}
|
|
122
|
-
if (this.
|
|
123
|
+
if (this._contextIdToContext.has(realmInfo.realm))
|
|
123
124
|
return;
|
|
124
125
|
if (realmInfo.type !== "window")
|
|
125
126
|
return;
|
|
@@ -138,7 +139,7 @@ class BidiPage {
|
|
|
138
139
|
const delegate = new import_bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
|
|
139
140
|
const context = new dom.FrameExecutionContext(delegate, frame, worldName);
|
|
140
141
|
frame._contextCreated(worldName, context);
|
|
141
|
-
this.
|
|
142
|
+
this._contextIdToContext.set(realmInfo.realm, context);
|
|
142
143
|
}
|
|
143
144
|
async _touchUtilityWorld(context) {
|
|
144
145
|
await this._session.sendMayFail("script.evaluate", {
|
|
@@ -156,9 +157,9 @@ class BidiPage {
|
|
|
156
157
|
});
|
|
157
158
|
}
|
|
158
159
|
_onRealmDestroyed(params) {
|
|
159
|
-
const context = this.
|
|
160
|
+
const context = this._contextIdToContext.get(params.realm);
|
|
160
161
|
if (context) {
|
|
161
|
-
this.
|
|
162
|
+
this._contextIdToContext.delete(params.realm);
|
|
162
163
|
context.frame._contextDestroyed(context);
|
|
163
164
|
return true;
|
|
164
165
|
}
|
|
@@ -179,10 +180,12 @@ class BidiPage {
|
|
|
179
180
|
}
|
|
180
181
|
_onNavigationCommitted(params) {
|
|
181
182
|
const frameId = params.context;
|
|
183
|
+
const frame = this._page.frameManager.frame(frameId);
|
|
184
|
+
this._browserContext.doGrantGlobalPermissionsForURL(params.url).catch((error) => import_debugLogger.debugLogger.log("error", error));
|
|
182
185
|
this._page.frameManager.frameCommittedNewDocumentNavigation(
|
|
183
186
|
frameId,
|
|
184
187
|
params.url,
|
|
185
|
-
|
|
188
|
+
frame._name,
|
|
186
189
|
params.navigation,
|
|
187
190
|
/* initial */
|
|
188
191
|
false
|
|
@@ -202,6 +205,8 @@ class BidiPage {
|
|
|
202
205
|
this._page.frameManager.frameAbortedNavigation(params.context, "Navigation failed", params.navigation || void 0);
|
|
203
206
|
}
|
|
204
207
|
_onFragmentNavigated(params) {
|
|
208
|
+
if (params.navigation)
|
|
209
|
+
this._fragmentNavigations.add(params.navigation);
|
|
205
210
|
this._page.frameManager.frameCommittedSameDocumentNavigation(params.context, params.url);
|
|
206
211
|
}
|
|
207
212
|
_onHistoryUpdated(params) {
|
|
@@ -227,7 +232,7 @@ class BidiPage {
|
|
|
227
232
|
originPage = this._opener._page.initializedOrUndefined();
|
|
228
233
|
if (!originPage)
|
|
229
234
|
return;
|
|
230
|
-
this._browserContext._browser._downloadCreated(originPage, event.navigation, event.url, event.suggestedFilename);
|
|
235
|
+
this._browserContext._browser._downloadCreated(originPage, event.navigation, event.url, event.suggestedFilename, event.suggestedFilename);
|
|
231
236
|
}
|
|
232
237
|
_onDownloadEnded(event) {
|
|
233
238
|
if (!event.navigation)
|
|
@@ -258,12 +263,13 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
258
263
|
if (params.type !== "console")
|
|
259
264
|
return;
|
|
260
265
|
const entry = params;
|
|
261
|
-
const context = this.
|
|
266
|
+
const context = this._contextIdToContext.get(params.source.realm) ?? this._realmToWorkerContext.get(params.source.realm);
|
|
262
267
|
if (!context)
|
|
263
268
|
return;
|
|
264
269
|
const callFrame = params.stackTrace?.callFrames[0];
|
|
265
270
|
const location = callFrame ?? { url: "", lineNumber: 1, columnNumber: 1 };
|
|
266
|
-
|
|
271
|
+
const type = entry.method === "warn" ? "warning" : entry.method;
|
|
272
|
+
this._page.addConsoleMessage(null, type, entry.args.map((arg) => (0, import_bidiExecutionContext.createHandle)(context, arg)), location, void 0, params.timestamp);
|
|
267
273
|
}
|
|
268
274
|
async _onFileDialogOpened(params) {
|
|
269
275
|
if (!params.element)
|
|
@@ -272,14 +278,21 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
272
278
|
if (!frame)
|
|
273
279
|
return;
|
|
274
280
|
const executionContext = await frame._mainContext();
|
|
275
|
-
|
|
276
|
-
|
|
281
|
+
try {
|
|
282
|
+
const handle = await toBidiExecutionContext(executionContext).remoteObjectForNodeId(executionContext, { sharedId: params.element.sharedId });
|
|
283
|
+
await this._page._onFileChooserOpened(handle);
|
|
284
|
+
} catch {
|
|
285
|
+
}
|
|
277
286
|
}
|
|
278
287
|
async navigateFrame(frame, url, referrer) {
|
|
279
288
|
const { navigation } = await this._session.send("browsingContext.navigate", {
|
|
280
289
|
context: frame._id,
|
|
281
290
|
url
|
|
282
291
|
});
|
|
292
|
+
if (navigation && this._fragmentNavigations.has(navigation)) {
|
|
293
|
+
this._fragmentNavigations.delete(navigation);
|
|
294
|
+
return {};
|
|
295
|
+
}
|
|
283
296
|
return { newDocumentId: navigation || void 0 };
|
|
284
297
|
}
|
|
285
298
|
async updateExtraHTTPHeaders() {
|
|
@@ -306,6 +319,7 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
306
319
|
const emulatedSize = this._page.emulatedSize();
|
|
307
320
|
if (!emulatedSize)
|
|
308
321
|
return;
|
|
322
|
+
const screenSize = emulatedSize.screen;
|
|
309
323
|
const viewportSize = emulatedSize.viewport;
|
|
310
324
|
await Promise.all([
|
|
311
325
|
this._session.send("browsingContext.setViewport", {
|
|
@@ -318,12 +332,19 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
318
332
|
}),
|
|
319
333
|
this._session.send("emulation.setScreenOrientationOverride", {
|
|
320
334
|
contexts: [this._session.sessionId],
|
|
321
|
-
screenOrientation: (0, import_bidiBrowser.getScreenOrientation)(!!options.isMobile,
|
|
335
|
+
screenOrientation: (0, import_bidiBrowser.getScreenOrientation)(!!options.isMobile, screenSize)
|
|
336
|
+
}),
|
|
337
|
+
this._session.send("emulation.setScreenSettingsOverride", {
|
|
338
|
+
contexts: [this._session.sessionId],
|
|
339
|
+
screenArea: {
|
|
340
|
+
width: screenSize.width,
|
|
341
|
+
height: screenSize.height
|
|
342
|
+
}
|
|
322
343
|
})
|
|
323
344
|
]);
|
|
324
345
|
}
|
|
325
346
|
async updateRequestInterception() {
|
|
326
|
-
await this._networkManager.setRequestInterception(this._page.
|
|
347
|
+
await this._networkManager.setRequestInterception(this._page.requestInterceptors.length > 0);
|
|
327
348
|
}
|
|
328
349
|
async updateOffline() {
|
|
329
350
|
}
|
|
@@ -352,7 +373,13 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
352
373
|
}).then(() => true).catch(() => false);
|
|
353
374
|
}
|
|
354
375
|
async requestGC() {
|
|
355
|
-
|
|
376
|
+
const result = await this._session.send("script.evaluate", {
|
|
377
|
+
expression: "TestUtils.gc()",
|
|
378
|
+
target: { context: this._session.sessionId },
|
|
379
|
+
awaitPromise: true
|
|
380
|
+
});
|
|
381
|
+
if (result.type === "exception")
|
|
382
|
+
throw new Error("Method not implemented.");
|
|
356
383
|
}
|
|
357
384
|
async _onScriptMessage(event) {
|
|
358
385
|
if (event.channel !== kPlaywrightBindingChannel)
|
|
@@ -360,7 +387,7 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
360
387
|
const pageOrError = await this._page.waitForInitializedOrError();
|
|
361
388
|
if (pageOrError instanceof Error)
|
|
362
389
|
return;
|
|
363
|
-
const context = this.
|
|
390
|
+
const context = this._contextIdToContext.get(event.source.realm);
|
|
364
391
|
if (!context)
|
|
365
392
|
return;
|
|
366
393
|
if (event.data.type !== "string")
|
|
@@ -409,7 +436,7 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
409
436
|
context: this._session.sessionId,
|
|
410
437
|
format: {
|
|
411
438
|
type: `image/${format === "png" ? "png" : "jpeg"}`,
|
|
412
|
-
quality: quality ? quality / 100 : 0
|
|
439
|
+
quality: quality !== void 0 ? quality / 100 : void 0
|
|
413
440
|
},
|
|
414
441
|
origin: documentRect ? "document" : "viewport",
|
|
415
442
|
clip: {
|
|
@@ -482,7 +509,9 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
482
509
|
throw e;
|
|
483
510
|
});
|
|
484
511
|
}
|
|
485
|
-
|
|
512
|
+
startScreencast(options) {
|
|
513
|
+
}
|
|
514
|
+
stopScreencast() {
|
|
486
515
|
}
|
|
487
516
|
rafCountForStablePosition() {
|
|
488
517
|
return 1;
|
|
@@ -537,30 +566,28 @@ ${params.stackTrace?.callFrames.map((f) => {
|
|
|
537
566
|
const parent = frame.parentFrame();
|
|
538
567
|
if (!parent)
|
|
539
568
|
throw new Error("Frame has been detached.");
|
|
540
|
-
const
|
|
541
|
-
|
|
542
|
-
return [...document.querySelectorAll("iframe,frame")];
|
|
543
|
-
});
|
|
544
|
-
const length = await list.evaluate((list2) => list2.length);
|
|
545
|
-
let foundElement = null;
|
|
546
|
-
for (let i = 0; i < length; i++) {
|
|
547
|
-
const element = await list.evaluateHandle((list2, i2) => list2[i2], i);
|
|
548
|
-
const candidate = await element.contentFrame();
|
|
549
|
-
if (frame === candidate) {
|
|
550
|
-
foundElement = element;
|
|
551
|
-
break;
|
|
552
|
-
} else {
|
|
553
|
-
element.dispose();
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
list.dispose();
|
|
557
|
-
if (!foundElement)
|
|
569
|
+
const node = await this._getFrameNode(frame);
|
|
570
|
+
if (!node?.sharedId)
|
|
558
571
|
throw new Error("Frame has been detached.");
|
|
559
|
-
|
|
572
|
+
const parentFrameExecutionContext = await parent._mainContext();
|
|
573
|
+
return await toBidiExecutionContext(parentFrameExecutionContext).remoteObjectForNodeId(parentFrameExecutionContext, { sharedId: node.sharedId });
|
|
574
|
+
}
|
|
575
|
+
async _getFrameNode(frame) {
|
|
576
|
+
const parent = frame.parentFrame();
|
|
577
|
+
if (!parent)
|
|
578
|
+
return void 0;
|
|
579
|
+
const result = await this._session.send("browsingContext.locateNodes", {
|
|
580
|
+
context: parent._id,
|
|
581
|
+
locator: { type: "context", value: { context: frame._id } }
|
|
582
|
+
});
|
|
583
|
+
const node = result.nodes[0];
|
|
584
|
+
return node;
|
|
560
585
|
}
|
|
561
586
|
shouldToggleStyleSheetToSyncAnimations() {
|
|
562
587
|
return true;
|
|
563
588
|
}
|
|
589
|
+
async setDockTile(image) {
|
|
590
|
+
}
|
|
564
591
|
}
|
|
565
592
|
function toBidiExecutionContext(executionContext) {
|
|
566
593
|
return executionContext.delegate;
|
|
@@ -223,7 +223,9 @@ function defaultProfilePreferences(extraPrefs) {
|
|
|
223
223
|
// Disable browser animations (tabs, fullscreen, sliding alerts)
|
|
224
224
|
"toolkit.cosmeticAnimations.enabled": false,
|
|
225
225
|
// Prevent starting into safe mode after application crashes
|
|
226
|
-
"toolkit.startup.max_resumed_crashes": -1
|
|
226
|
+
"toolkit.startup.max_resumed_crashes": -1,
|
|
227
|
+
// Enable TestUtils
|
|
228
|
+
"dom.testing.testutils.enabled": true
|
|
227
229
|
};
|
|
228
230
|
return Object.assign(defaultPrefs, extraPrefs);
|
|
229
231
|
}
|
package/lib/server/browser.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,29 +17,42 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
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
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
var browser_exports = {};
|
|
20
30
|
__export(browser_exports, {
|
|
21
|
-
Browser: () => Browser
|
|
31
|
+
Browser: () => Browser,
|
|
32
|
+
BrowserServer: () => BrowserServer
|
|
22
33
|
});
|
|
23
34
|
module.exports = __toCommonJS(browser_exports);
|
|
24
|
-
var
|
|
35
|
+
var import_fs = __toESM(require("fs"));
|
|
25
36
|
var import_browserContext = require("./browserContext");
|
|
26
37
|
var import_download = require("./download");
|
|
27
38
|
var import_instrumentation = require("./instrumentation");
|
|
28
|
-
var import_page = require("./page");
|
|
29
39
|
var import_socksClientCertificatesInterceptor = require("./socksClientCertificatesInterceptor");
|
|
40
|
+
var import_playwrightPipeServer = require("../remote/playwrightPipeServer");
|
|
41
|
+
var import_playwrightWebSocketServer = require("../remote/playwrightWebSocketServer");
|
|
42
|
+
var import_serverRegistry = require("../serverRegistry");
|
|
43
|
+
var import_fileUtils = require("./utils/fileUtils");
|
|
44
|
+
var import_utils = require("../utils");
|
|
30
45
|
class Browser extends import_instrumentation.SdkObject {
|
|
31
46
|
constructor(parent, options) {
|
|
32
47
|
super(parent, "browser");
|
|
33
48
|
this._downloads = /* @__PURE__ */ new Map();
|
|
34
49
|
this._defaultContext = null;
|
|
35
50
|
this._startedClosing = false;
|
|
36
|
-
this._idToVideo = /* @__PURE__ */ new Map();
|
|
37
51
|
this._isCollocatedWithServer = true;
|
|
38
52
|
this.attribution.browser = this;
|
|
39
53
|
this.options = options;
|
|
40
54
|
this.instrumentation.onBrowserOpen(this);
|
|
55
|
+
this._server = new BrowserServer(this);
|
|
41
56
|
}
|
|
42
57
|
static {
|
|
43
58
|
this.Events = {
|
|
@@ -88,8 +103,8 @@ class Browser extends import_instrumentation.SdkObject {
|
|
|
88
103
|
contextForReuse() {
|
|
89
104
|
return this._contextForReuse?.context;
|
|
90
105
|
}
|
|
91
|
-
_downloadCreated(page, uuid, url, suggestedFilename) {
|
|
92
|
-
const download = new import_download.Download(page, this.options.downloadsPath || "", uuid, url, suggestedFilename);
|
|
106
|
+
_downloadCreated(page, uuid, url, suggestedFilename, downloadFilename) {
|
|
107
|
+
const download = new import_download.Download(page, this.options.downloadsPath || "", uuid, url, suggestedFilename, downloadFilename);
|
|
93
108
|
this._downloads.set(uuid, download);
|
|
94
109
|
}
|
|
95
110
|
_downloadFilenameSuggested(uuid, suggestedFilename) {
|
|
@@ -105,27 +120,19 @@ class Browser extends import_instrumentation.SdkObject {
|
|
|
105
120
|
download.artifact.reportFinished(error ? new Error(error) : void 0);
|
|
106
121
|
this._downloads.delete(uuid);
|
|
107
122
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
this._idToVideo.set(videoId, { context, artifact });
|
|
111
|
-
pageOrError.then((page) => {
|
|
112
|
-
if (page instanceof import_page.Page) {
|
|
113
|
-
page.video = artifact;
|
|
114
|
-
page.emitOnContext(import_browserContext.BrowserContext.Events.VideoStarted, artifact);
|
|
115
|
-
page.emit(import_page.Page.Events.Video, artifact);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
123
|
+
async startServer(title, options) {
|
|
124
|
+
return await this._server.start(title, options);
|
|
118
125
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
this._idToVideo.delete(videoId);
|
|
122
|
-
return video?.artifact;
|
|
126
|
+
async stopServer() {
|
|
127
|
+
await this._server.stop();
|
|
123
128
|
}
|
|
124
129
|
_didClose() {
|
|
125
130
|
for (const context of this.contexts())
|
|
126
131
|
context._browserClosed();
|
|
127
132
|
if (this._defaultContext)
|
|
128
133
|
this._defaultContext._browserClosed();
|
|
134
|
+
this.stopServer().catch(() => {
|
|
135
|
+
});
|
|
129
136
|
this.emit(Browser.Events.Disconnected);
|
|
130
137
|
this.instrumentation.onBrowserClose(this);
|
|
131
138
|
}
|
|
@@ -143,7 +150,63 @@ class Browser extends import_instrumentation.SdkObject {
|
|
|
143
150
|
await this.options.browserProcess.kill();
|
|
144
151
|
}
|
|
145
152
|
}
|
|
153
|
+
class BrowserServer {
|
|
154
|
+
constructor(browser) {
|
|
155
|
+
this._isStarted = false;
|
|
156
|
+
this._browser = browser;
|
|
157
|
+
}
|
|
158
|
+
async start(title, options) {
|
|
159
|
+
if (this._isStarted)
|
|
160
|
+
throw new Error(`Server is already started.`);
|
|
161
|
+
this._isStarted = true;
|
|
162
|
+
let endpoint;
|
|
163
|
+
if (options.host !== void 0 || options.port !== void 0) {
|
|
164
|
+
this._wsServer = new import_playwrightWebSocketServer.PlaywrightWebSocketServer(this._browser, "/");
|
|
165
|
+
endpoint = await this._wsServer.listen(options.port ?? 0, options.host, (0, import_utils.createGuid)());
|
|
166
|
+
} else {
|
|
167
|
+
this._pipeServer = new import_playwrightPipeServer.PlaywrightPipeServer(this._browser);
|
|
168
|
+
this._pipeSocketPath = await this._socketPath();
|
|
169
|
+
await this._pipeServer.listen(this._pipeSocketPath);
|
|
170
|
+
endpoint = this._pipeSocketPath;
|
|
171
|
+
}
|
|
172
|
+
const browserInfo = {
|
|
173
|
+
guid: this._browser.guid,
|
|
174
|
+
browserName: this._browser.options.browserType,
|
|
175
|
+
launchOptions: asClientLaunchOptions(this._browser.options.originalLaunchOptions),
|
|
176
|
+
userDataDir: this._browser.options.userDataDir
|
|
177
|
+
};
|
|
178
|
+
await import_serverRegistry.serverRegistry.create(browserInfo, {
|
|
179
|
+
title,
|
|
180
|
+
endpoint,
|
|
181
|
+
workspaceDir: options.workspaceDir,
|
|
182
|
+
metadata: options.metadata
|
|
183
|
+
});
|
|
184
|
+
return { endpoint };
|
|
185
|
+
}
|
|
186
|
+
async stop() {
|
|
187
|
+
if (!this._browser.options.userDataDir)
|
|
188
|
+
await import_serverRegistry.serverRegistry.delete(this._browser.guid);
|
|
189
|
+
if (this._pipeSocketPath && process.platform !== "win32")
|
|
190
|
+
await import_fs.default.promises.unlink(this._pipeSocketPath).catch(() => {
|
|
191
|
+
});
|
|
192
|
+
await this._pipeServer?.close();
|
|
193
|
+
await this._wsServer?.close();
|
|
194
|
+
this._pipeServer = void 0;
|
|
195
|
+
this._wsServer = void 0;
|
|
196
|
+
this._isStarted = false;
|
|
197
|
+
}
|
|
198
|
+
async _socketPath() {
|
|
199
|
+
return (0, import_fileUtils.makeSocketPath)("browser", this._browser.guid.slice(0, 14));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function asClientLaunchOptions(serverOptions) {
|
|
203
|
+
return {
|
|
204
|
+
...serverOptions,
|
|
205
|
+
env: serverOptions.env ? Object.fromEntries(serverOptions.env.map(({ name, value }) => [name, value])) : void 0
|
|
206
|
+
};
|
|
207
|
+
}
|
|
146
208
|
// Annotate the CommonJS export names for ESM import in node:
|
|
147
209
|
0 && (module.exports = {
|
|
148
|
-
Browser
|
|
210
|
+
Browser,
|
|
211
|
+
BrowserServer
|
|
149
212
|
});
|