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
|
@@ -34,8 +34,12 @@ var import_networkDispatchers = require("./networkDispatchers");
|
|
|
34
34
|
var import_networkDispatchers2 = require("./networkDispatchers");
|
|
35
35
|
var import_networkDispatchers3 = require("./networkDispatchers");
|
|
36
36
|
var import_webSocketRouteDispatcher = require("./webSocketRouteDispatcher");
|
|
37
|
+
var import_disposableDispatcher = require("./disposableDispatcher");
|
|
37
38
|
var import_instrumentation = require("../instrumentation");
|
|
38
39
|
var import_urlMatch = require("../../utils/isomorphic/urlMatch");
|
|
40
|
+
var import_recorder = require("../recorder");
|
|
41
|
+
var import_disposable = require("../disposable");
|
|
42
|
+
var import_videoRecorder = require("../videoRecorder");
|
|
39
43
|
class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
40
44
|
constructor(parentScope, page) {
|
|
41
45
|
const mainFrame = import_frameDispatcher.FrameDispatcher.from(parentScope, page.mainFrame());
|
|
@@ -43,14 +47,14 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
43
47
|
mainFrame,
|
|
44
48
|
viewportSize: page.emulatedSize()?.viewport,
|
|
45
49
|
isClosed: page.isClosed(),
|
|
46
|
-
opener: PageDispatcher.fromNullable(parentScope, page.opener())
|
|
50
|
+
opener: PageDispatcher.fromNullable(parentScope, page.opener()),
|
|
51
|
+
video: page.video ? createVideoDispatcher(parentScope, page.video) : void 0
|
|
47
52
|
});
|
|
48
53
|
this._type_EventTarget = true;
|
|
49
54
|
this._type_Page = true;
|
|
50
55
|
this._subscriptions = /* @__PURE__ */ new Set();
|
|
51
56
|
this._webSocketInterceptionPatterns = [];
|
|
52
|
-
this.
|
|
53
|
-
this._initScripts = [];
|
|
57
|
+
this._disposables = [];
|
|
54
58
|
this._interceptionUrlMatchers = [];
|
|
55
59
|
this._locatorHandlers = /* @__PURE__ */ new Set();
|
|
56
60
|
this._jsCoverageActive = false;
|
|
@@ -84,9 +88,6 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
84
88
|
this.addObjectListener(import_page.Page.Events.LocatorHandlerTriggered, (uid) => this._dispatchEvent("locatorHandlerTriggered", { uid }));
|
|
85
89
|
this.addObjectListener(import_page.Page.Events.WebSocket, (webSocket) => this._dispatchEvent("webSocket", { webSocket: new import_networkDispatchers3.WebSocketDispatcher(this, webSocket) }));
|
|
86
90
|
this.addObjectListener(import_page.Page.Events.Worker, (worker) => this._dispatchEvent("worker", { worker: new WorkerDispatcher(this, worker) }));
|
|
87
|
-
this.addObjectListener(import_page.Page.Events.Video, (artifact) => this._dispatchEvent("video", { artifact: import_artifactDispatcher.ArtifactDispatcher.from(parentScope, artifact) }));
|
|
88
|
-
if (page.video)
|
|
89
|
-
this._dispatchEvent("video", { artifact: import_artifactDispatcher.ArtifactDispatcher.from(this.parentScope(), page.video) });
|
|
90
91
|
const frames = page.frameManager.frames();
|
|
91
92
|
for (let i = 1; i < frames.length; i++)
|
|
92
93
|
this._onFrameAttached(frames[i]);
|
|
@@ -111,7 +112,8 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
111
112
|
this._dispatchEvent("bindingCall", { binding: binding2 });
|
|
112
113
|
return binding2.promise();
|
|
113
114
|
});
|
|
114
|
-
this.
|
|
115
|
+
this._disposables.push(binding);
|
|
116
|
+
return { disposable: new import_disposableDispatcher.DisposableDispatcher(this, binding) };
|
|
115
117
|
}
|
|
116
118
|
async setExtraHTTPHeaders(params, progress) {
|
|
117
119
|
await this._page.setExtraHTTPHeaders(progress, params.headers);
|
|
@@ -153,7 +155,9 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
153
155
|
await this._page.setViewportSize(progress, params.viewportSize);
|
|
154
156
|
}
|
|
155
157
|
async addInitScript(params, progress) {
|
|
156
|
-
|
|
158
|
+
const initScript = await this._page.addInitScript(params.source);
|
|
159
|
+
this._disposables.push(initScript);
|
|
160
|
+
return { disposable: new import_disposableDispatcher.DisposableDispatcher(this, initScript) };
|
|
157
161
|
}
|
|
158
162
|
async setNetworkInterceptionPatterns(params, progress) {
|
|
159
163
|
const hadMatchers = this._interceptionUrlMatchers.length > 0;
|
|
@@ -162,7 +166,7 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
162
166
|
await this._page.removeRequestInterceptor(this._requestInterceptor);
|
|
163
167
|
this._interceptionUrlMatchers = [];
|
|
164
168
|
} else {
|
|
165
|
-
this._interceptionUrlMatchers = params.patterns.map(
|
|
169
|
+
this._interceptionUrlMatchers = params.patterns.map(import_urlMatch.deserializeURLMatch);
|
|
166
170
|
if (!hadMatchers)
|
|
167
171
|
await this._page.addRequestInterceptor(progress, this._requestInterceptor);
|
|
168
172
|
}
|
|
@@ -208,49 +212,51 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
208
212
|
this._subscriptions.delete(params.event);
|
|
209
213
|
}
|
|
210
214
|
async keyboardDown(params, progress) {
|
|
211
|
-
await this._page.keyboard.
|
|
215
|
+
await this._page.keyboard.apiDown(progress, params.key);
|
|
212
216
|
}
|
|
213
217
|
async keyboardUp(params, progress) {
|
|
214
|
-
await this._page.keyboard.
|
|
218
|
+
await this._page.keyboard.apiUp(progress, params.key);
|
|
215
219
|
}
|
|
216
220
|
async keyboardInsertText(params, progress) {
|
|
217
|
-
await this._page.keyboard.
|
|
221
|
+
await this._page.keyboard.apiInsertText(progress, params.text);
|
|
218
222
|
}
|
|
219
223
|
async keyboardType(params, progress) {
|
|
220
|
-
await this._page.keyboard.
|
|
224
|
+
await this._page.keyboard.apiType(progress, params.text, params);
|
|
221
225
|
}
|
|
222
226
|
async keyboardPress(params, progress) {
|
|
223
|
-
await this._page.keyboard.
|
|
227
|
+
await this._page.keyboard.apiPress(progress, params.key, params);
|
|
228
|
+
}
|
|
229
|
+
async clearConsoleMessages(params, progress) {
|
|
230
|
+
this._page.clearConsoleMessages();
|
|
224
231
|
}
|
|
225
232
|
async consoleMessages(params, progress) {
|
|
226
233
|
this._subscriptions.add("console");
|
|
227
|
-
return { messages: this._page.consoleMessages().map((message) => this.parentScope().serializeConsoleMessage(message, this)) };
|
|
234
|
+
return { messages: this._page.consoleMessages(params.filter).map((message) => this.parentScope().serializeConsoleMessage(message, this)) };
|
|
235
|
+
}
|
|
236
|
+
async clearPageErrors(params, progress) {
|
|
237
|
+
this._page.clearPageErrors();
|
|
228
238
|
}
|
|
229
239
|
async pageErrors(params, progress) {
|
|
230
|
-
return { errors: this._page.pageErrors().map((error) => (0, import_errors.serializeError)(error)) };
|
|
240
|
+
return { errors: this._page.pageErrors(params.filter).map((error) => (0, import_errors.serializeError)(error)) };
|
|
231
241
|
}
|
|
232
242
|
async mouseMove(params, progress) {
|
|
233
|
-
|
|
234
|
-
await this._page.mouse.move(progress, params.x, params.y, params);
|
|
243
|
+
await this._page.mouse.apiMove(progress, params.x, params.y, params);
|
|
235
244
|
}
|
|
236
245
|
async mouseDown(params, progress) {
|
|
237
|
-
|
|
238
|
-
await this._page.mouse.down(progress, params);
|
|
246
|
+
await this._page.mouse.apiDown(progress, params);
|
|
239
247
|
}
|
|
240
248
|
async mouseUp(params, progress) {
|
|
241
|
-
|
|
242
|
-
await this._page.mouse.up(progress, params);
|
|
249
|
+
await this._page.mouse.apiUp(progress, params);
|
|
243
250
|
}
|
|
244
251
|
async mouseClick(params, progress) {
|
|
245
|
-
|
|
246
|
-
await this._page.mouse.click(progress, params.x, params.y, params);
|
|
252
|
+
await this._page.mouse.apiClick(progress, params.x, params.y, params);
|
|
247
253
|
}
|
|
248
254
|
async mouseWheel(params, progress) {
|
|
249
|
-
await this._page.mouse.
|
|
255
|
+
await this._page.mouse.apiWheel(progress, params.deltaX, params.deltaY);
|
|
250
256
|
}
|
|
251
257
|
async touchscreenTap(params, progress) {
|
|
252
258
|
progress.metadata.point = { x: params.x, y: params.y };
|
|
253
|
-
await this._page.touchscreen.
|
|
259
|
+
await this._page.touchscreen.apiTap(progress, params.x, params.y);
|
|
254
260
|
}
|
|
255
261
|
async pdf(params, progress) {
|
|
256
262
|
if (!this._page.pdf)
|
|
@@ -262,12 +268,69 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
262
268
|
this._subscriptions.add("request");
|
|
263
269
|
return { requests: this._page.networkRequests().map((request) => import_networkDispatchers.RequestDispatcher.from(this.parentScope(), request)) };
|
|
264
270
|
}
|
|
265
|
-
async snapshotForAI(params, progress) {
|
|
266
|
-
return await this._page.snapshotForAI(progress, params);
|
|
267
|
-
}
|
|
268
271
|
async bringToFront(params, progress) {
|
|
269
272
|
await progress.race(this._page.bringToFront());
|
|
270
273
|
}
|
|
274
|
+
async pickLocator(params, progress) {
|
|
275
|
+
const recorder = await import_recorder.Recorder.forContext(this._page.browserContext, { omitCallTracking: true, hideToolbar: true });
|
|
276
|
+
const selector = await recorder.pickLocator(progress, this._page);
|
|
277
|
+
return { selector };
|
|
278
|
+
}
|
|
279
|
+
async cancelPickLocator(params, progress) {
|
|
280
|
+
const recorder = await import_recorder.Recorder.existingForContext(this._page.browserContext);
|
|
281
|
+
await recorder?.setMode("none");
|
|
282
|
+
}
|
|
283
|
+
async screencastShowOverlay(params) {
|
|
284
|
+
const id = await this._page.overlay.show(params.html, params.duration);
|
|
285
|
+
return { id };
|
|
286
|
+
}
|
|
287
|
+
async screencastRemoveOverlay(params) {
|
|
288
|
+
await this._page.overlay.remove(params.id);
|
|
289
|
+
}
|
|
290
|
+
async screencastChapter(params) {
|
|
291
|
+
await this._page.overlay.chapter(params);
|
|
292
|
+
}
|
|
293
|
+
async screencastSetOverlayVisible(params) {
|
|
294
|
+
await this._page.overlay.setVisible(params.visible);
|
|
295
|
+
}
|
|
296
|
+
async screencastShowActions(params) {
|
|
297
|
+
this._page.screencast.showActions({ duration: params.duration, position: params.position, fontSize: params.fontSize });
|
|
298
|
+
}
|
|
299
|
+
async screencastHideActions() {
|
|
300
|
+
this._page.screencast.hideActions();
|
|
301
|
+
}
|
|
302
|
+
async screencastStart(params, progress) {
|
|
303
|
+
if (this._screencastClient || this._videoRecorder)
|
|
304
|
+
throw new Error("Screencast is already running");
|
|
305
|
+
if (params.sendFrames) {
|
|
306
|
+
this._screencastClient = {
|
|
307
|
+
onFrame: (frame) => {
|
|
308
|
+
this._dispatchEvent("screencastFrame", { data: frame.buffer });
|
|
309
|
+
},
|
|
310
|
+
dispose: () => {
|
|
311
|
+
},
|
|
312
|
+
size: params.size,
|
|
313
|
+
quality: params.quality
|
|
314
|
+
};
|
|
315
|
+
this._page.screencast.addClient(this._screencastClient);
|
|
316
|
+
}
|
|
317
|
+
let artifact;
|
|
318
|
+
if (params.record) {
|
|
319
|
+
this._videoRecorder = new import_videoRecorder.VideoRecorder(this._page.screencast);
|
|
320
|
+
artifact = this._videoRecorder.start(params);
|
|
321
|
+
}
|
|
322
|
+
return { artifact: artifact ? createVideoDispatcher(this.parentScope(), artifact) : void 0 };
|
|
323
|
+
}
|
|
324
|
+
async screencastStop(params, progress) {
|
|
325
|
+
if (this._videoRecorder) {
|
|
326
|
+
await this._videoRecorder.stop();
|
|
327
|
+
this._videoRecorder = void 0;
|
|
328
|
+
}
|
|
329
|
+
const client = this._screencastClient;
|
|
330
|
+
this._screencastClient = void 0;
|
|
331
|
+
if (client)
|
|
332
|
+
this._page.screencast.removeClient(client);
|
|
333
|
+
}
|
|
271
334
|
async startJSCoverage(params, progress) {
|
|
272
335
|
const coverage = this._page.coverage;
|
|
273
336
|
await coverage.startJSCoverage(progress, params);
|
|
@@ -300,12 +363,8 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
300
363
|
this._interceptionUrlMatchers = [];
|
|
301
364
|
this._page.removeRequestInterceptor(this._requestInterceptor).catch(() => {
|
|
302
365
|
});
|
|
303
|
-
|
|
304
|
-
});
|
|
305
|
-
this._bindings = [];
|
|
306
|
-
this._page.removeInitScripts(this._initScripts).catch(() => {
|
|
366
|
+
(0, import_disposable.disposeAll)(this._disposables).catch(() => {
|
|
307
367
|
});
|
|
308
|
-
this._initScripts = [];
|
|
309
368
|
if (this._routeWebSocketInitScript)
|
|
310
369
|
import_webSocketRouteDispatcher.WebSocketRouteDispatcher.uninstall(this.connection, this._page, this._routeWebSocketInitScript).catch(() => {
|
|
311
370
|
});
|
|
@@ -323,6 +382,11 @@ class PageDispatcher extends import_dispatcher.Dispatcher {
|
|
|
323
382
|
this._page.coverage.stopCSSCoverage().catch(() => {
|
|
324
383
|
});
|
|
325
384
|
this._cssCoverageActive = false;
|
|
385
|
+
this.screencastStop({}, void 0).catch(() => {
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
async setDockTile(params) {
|
|
389
|
+
await this._page.setDockTile(params.image);
|
|
326
390
|
}
|
|
327
391
|
}
|
|
328
392
|
class WorkerDispatcher extends import_dispatcher.Dispatcher {
|
|
@@ -381,6 +445,9 @@ class BindingCallDispatcher extends import_dispatcher.Dispatcher {
|
|
|
381
445
|
this._dispose();
|
|
382
446
|
}
|
|
383
447
|
}
|
|
448
|
+
function createVideoDispatcher(parentScope, video) {
|
|
449
|
+
return import_artifactDispatcher.ArtifactDispatcher.from(parentScope.parentScope(), video);
|
|
450
|
+
}
|
|
384
451
|
// Annotate the CommonJS export names for ESM import in node:
|
|
385
452
|
0 && (module.exports = {
|
|
386
453
|
BindingCallDispatcher,
|
|
@@ -101,7 +101,7 @@ class WebSocketRouteDispatcher extends import_dispatcher.Dispatcher {
|
|
|
101
101
|
}, data);
|
|
102
102
|
}
|
|
103
103
|
++data.counter;
|
|
104
|
-
return await target.addInitScript(
|
|
104
|
+
return await target.addInitScript(`
|
|
105
105
|
(() => {
|
|
106
106
|
const module = {};
|
|
107
107
|
${rawWebSocketMockSource.source}
|
|
@@ -115,8 +115,8 @@ class WebSocketRouteDispatcher extends import_dispatcher.Dispatcher {
|
|
|
115
115
|
if (!data || data.connection !== connection)
|
|
116
116
|
return;
|
|
117
117
|
if (--data.counter <= 0)
|
|
118
|
-
await
|
|
119
|
-
await
|
|
118
|
+
await data.binding.dispose();
|
|
119
|
+
await initScript.dispose();
|
|
120
120
|
}
|
|
121
121
|
async connect(params, progress) {
|
|
122
122
|
await this._evaluateAPIRequest(progress, { id: this._id, type: "connect" });
|
|
@@ -152,8 +152,7 @@ class WebSocketRouteDispatcher extends import_dispatcher.Dispatcher {
|
|
|
152
152
|
}
|
|
153
153
|
function matchesPattern(dispatcher, baseURL, url) {
|
|
154
154
|
for (const pattern of dispatcher._webSocketInterceptionPatterns || []) {
|
|
155
|
-
|
|
156
|
-
if ((0, import_urlMatch.urlMatches)(baseURL, url, urlMatch, true))
|
|
155
|
+
if ((0, import_urlMatch.urlMatches)(baseURL, url, (0, import_urlMatch.deserializeURLMatch)(pattern), true))
|
|
157
156
|
return true;
|
|
158
157
|
}
|
|
159
158
|
return false;
|
|
@@ -0,0 +1,41 @@
|
|
|
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 disposable_exports = {};
|
|
20
|
+
__export(disposable_exports, {
|
|
21
|
+
DisposableObject: () => DisposableObject,
|
|
22
|
+
disposeAll: () => disposeAll
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(disposable_exports);
|
|
25
|
+
var import_instrumentation = require("./instrumentation");
|
|
26
|
+
class DisposableObject extends import_instrumentation.SdkObject {
|
|
27
|
+
constructor(parent) {
|
|
28
|
+
super(parent, "disposable");
|
|
29
|
+
this.parent = parent;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function disposeAll(disposables) {
|
|
33
|
+
const copy = [...disposables];
|
|
34
|
+
disposables.length = 0;
|
|
35
|
+
await Promise.all(copy.map((d) => d.dispose()));
|
|
36
|
+
}
|
|
37
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
38
|
+
0 && (module.exports = {
|
|
39
|
+
DisposableObject,
|
|
40
|
+
disposeAll
|
|
41
|
+
});
|
package/lib/server/dom.js
CHANGED
|
@@ -202,17 +202,17 @@ class ElementHandle extends js.JSHandle {
|
|
|
202
202
|
);
|
|
203
203
|
}
|
|
204
204
|
async _clickablePoint() {
|
|
205
|
-
const intersectQuadWithViewport = (
|
|
206
|
-
return
|
|
205
|
+
const intersectQuadWithViewport = (quad2) => {
|
|
206
|
+
return quad2.map((point) => ({
|
|
207
207
|
x: Math.min(Math.max(point.x, 0), metrics.width),
|
|
208
208
|
y: Math.min(Math.max(point.y, 0), metrics.height)
|
|
209
209
|
}));
|
|
210
210
|
};
|
|
211
|
-
const computeQuadArea = (
|
|
211
|
+
const computeQuadArea = (quad2) => {
|
|
212
212
|
let area = 0;
|
|
213
|
-
for (let i = 0; i <
|
|
214
|
-
const p1 =
|
|
215
|
-
const p2 =
|
|
213
|
+
for (let i = 0; i < quad2.length; ++i) {
|
|
214
|
+
const p1 = quad2[i];
|
|
215
|
+
const p2 = quad2[(i + 1) % quad2.length];
|
|
216
216
|
area += (p1.x * p2.y - p2.x * p1.y) / 2;
|
|
217
217
|
}
|
|
218
218
|
return Math.abs(area);
|
|
@@ -225,17 +225,19 @@ class ElementHandle extends js.JSHandle {
|
|
|
225
225
|
return quads;
|
|
226
226
|
if (!quads || !quads.length)
|
|
227
227
|
return "error:notvisible";
|
|
228
|
-
const filtered = quads.map((
|
|
228
|
+
const filtered = quads.map((quad2) => intersectQuadWithViewport(quad2)).filter((quad2) => computeQuadArea(quad2) > 0.99);
|
|
229
229
|
if (!filtered.length)
|
|
230
230
|
return "error:notinviewport";
|
|
231
|
+
const quad = filtered[0];
|
|
232
|
+
const box = quadToRect(quad);
|
|
231
233
|
if (this._page.browserContext._browser.options.name === "firefox") {
|
|
232
|
-
for (const
|
|
233
|
-
const integerPoint = findIntegerPointInsideQuad(
|
|
234
|
+
for (const q of filtered) {
|
|
235
|
+
const integerPoint = findIntegerPointInsideQuad(q);
|
|
234
236
|
if (integerPoint)
|
|
235
|
-
return integerPoint;
|
|
237
|
+
return { point: integerPoint, box };
|
|
236
238
|
}
|
|
237
239
|
}
|
|
238
|
-
return quadMiddlePoint(
|
|
240
|
+
return { point: quadMiddlePoint(quad), box };
|
|
239
241
|
}
|
|
240
242
|
async _offsetPoint(offset) {
|
|
241
243
|
const [box, border] = await Promise.all([
|
|
@@ -248,13 +250,17 @@ class ElementHandle extends js.JSHandle {
|
|
|
248
250
|
if (border === "error:notconnected")
|
|
249
251
|
return border;
|
|
250
252
|
return {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
+
point: {
|
|
254
|
+
x: box.x + border.left + offset.x,
|
|
255
|
+
y: box.y + border.top + offset.y
|
|
256
|
+
},
|
|
257
|
+
box
|
|
253
258
|
};
|
|
254
259
|
}
|
|
255
260
|
async _retryAction(progress, actionName, action, options) {
|
|
256
261
|
let retry = 0;
|
|
257
262
|
const waitTime = [0, 20, 100, 100, 500];
|
|
263
|
+
const noAutoWaiting = options.__testHookNoAutoWaiting ?? options.noAutoWaiting;
|
|
258
264
|
while (true) {
|
|
259
265
|
if (retry) {
|
|
260
266
|
progress.log(`retrying ${actionName} action${options.trial ? " (trial run)" : ""}`);
|
|
@@ -268,35 +274,43 @@ class ElementHandle extends js.JSHandle {
|
|
|
268
274
|
} else {
|
|
269
275
|
progress.log(`attempting ${actionName} action${options.trial ? " (trial run)" : ""}`);
|
|
270
276
|
}
|
|
271
|
-
if (!options.skipActionPreChecks && !options.force)
|
|
277
|
+
if (!options.skipActionPreChecks && !options.force && !noAutoWaiting)
|
|
272
278
|
await this._frame._page.performActionPreChecks(progress);
|
|
273
279
|
const result = await action(retry);
|
|
274
280
|
++retry;
|
|
275
281
|
if (result === "error:notvisible") {
|
|
276
|
-
if (options.force)
|
|
282
|
+
if (options.force || noAutoWaiting)
|
|
277
283
|
throw new NonRecoverableDOMError("Element is not visible");
|
|
278
284
|
progress.log(" element is not visible");
|
|
279
285
|
continue;
|
|
280
286
|
}
|
|
281
287
|
if (result === "error:notinviewport") {
|
|
282
|
-
if (options.force)
|
|
288
|
+
if (options.force || noAutoWaiting)
|
|
283
289
|
throw new NonRecoverableDOMError("Element is outside of the viewport");
|
|
284
290
|
progress.log(" element is outside of the viewport");
|
|
285
291
|
continue;
|
|
286
292
|
}
|
|
287
293
|
if (result === "error:optionsnotfound") {
|
|
294
|
+
if (noAutoWaiting)
|
|
295
|
+
throw new NonRecoverableDOMError("Did not find some options");
|
|
288
296
|
progress.log(" did not find some options");
|
|
289
297
|
continue;
|
|
290
298
|
}
|
|
291
299
|
if (result === "error:optionnotenabled") {
|
|
300
|
+
if (noAutoWaiting)
|
|
301
|
+
throw new NonRecoverableDOMError("Option being selected is not enabled");
|
|
292
302
|
progress.log(" option being selected is not enabled");
|
|
293
303
|
continue;
|
|
294
304
|
}
|
|
295
305
|
if (typeof result === "object" && "hitTargetDescription" in result) {
|
|
306
|
+
if (noAutoWaiting)
|
|
307
|
+
throw new NonRecoverableDOMError(`${result.hitTargetDescription} intercepts pointer events`);
|
|
296
308
|
progress.log(` ${result.hitTargetDescription} intercepts pointer events`);
|
|
297
309
|
continue;
|
|
298
310
|
}
|
|
299
311
|
if (typeof result === "object" && "missingState" in result) {
|
|
312
|
+
if (noAutoWaiting)
|
|
313
|
+
throw new NonRecoverableDOMError(`Element is not ${result.missingState}`);
|
|
300
314
|
progress.log(` element is not ${result.missingState}`);
|
|
301
315
|
continue;
|
|
302
316
|
}
|
|
@@ -351,11 +365,12 @@ class ElementHandle extends js.JSHandle {
|
|
|
351
365
|
if (scrolled !== "done")
|
|
352
366
|
return scrolled;
|
|
353
367
|
progress.log(" done scrolling");
|
|
354
|
-
const
|
|
355
|
-
if (typeof
|
|
356
|
-
return
|
|
357
|
-
const point = roundPoint(
|
|
368
|
+
const maybeResult = position ? await progress.race(this._offsetPoint(position)) : await progress.race(this._clickablePoint());
|
|
369
|
+
if (typeof maybeResult === "string")
|
|
370
|
+
return maybeResult;
|
|
371
|
+
const point = roundPoint(maybeResult.point);
|
|
358
372
|
progress.metadata.point = point;
|
|
373
|
+
progress.metadata.box = maybeResult.box;
|
|
359
374
|
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
360
375
|
let hitTargetInterceptionHandle;
|
|
361
376
|
if (force) {
|
|
@@ -461,10 +476,15 @@ class ElementHandle extends js.JSHandle {
|
|
|
461
476
|
const result = await this._selectOption(progress, elements, values, options);
|
|
462
477
|
return throwRetargetableDOMError(result);
|
|
463
478
|
}
|
|
479
|
+
async _beforeNonPointerAction(progress) {
|
|
480
|
+
if (progress.metadata.annotate)
|
|
481
|
+
progress.metadata.box = await this.boundingBox() || void 0;
|
|
482
|
+
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
483
|
+
}
|
|
464
484
|
async _selectOption(progress, elements, values, options) {
|
|
465
485
|
let resultingOptions = [];
|
|
466
486
|
const result = await this._retryAction(progress, "select option", async () => {
|
|
467
|
-
await
|
|
487
|
+
await this._beforeNonPointerAction(progress);
|
|
468
488
|
if (!options.force)
|
|
469
489
|
progress.log(` waiting for element to be visible and enabled`);
|
|
470
490
|
const optionsToSelect = [...elements, ...values];
|
|
@@ -495,7 +515,7 @@ class ElementHandle extends js.JSHandle {
|
|
|
495
515
|
async _fill(progress, value, options) {
|
|
496
516
|
progress.log(` fill("${value}")`);
|
|
497
517
|
return await this._retryAction(progress, "fill", async () => {
|
|
498
|
-
await
|
|
518
|
+
await this._beforeNonPointerAction(progress);
|
|
499
519
|
if (!options.force)
|
|
500
520
|
progress.log(" waiting for element to be visible, enabled and editable");
|
|
501
521
|
const result = await progress.race(this.evaluateInUtility(async ([injected, node, { value: value2, force }]) => {
|
|
@@ -508,7 +528,7 @@ class ElementHandle extends js.JSHandle {
|
|
|
508
528
|
}, { value, force: options.force }));
|
|
509
529
|
if (result === "needsinput") {
|
|
510
530
|
if (value)
|
|
511
|
-
await this._page.keyboard.
|
|
531
|
+
await this._page.keyboard._insertText(progress, value);
|
|
512
532
|
else
|
|
513
533
|
await this._page.keyboard.press(progress, "Delete");
|
|
514
534
|
return "done";
|
|
@@ -559,7 +579,7 @@ class ElementHandle extends js.JSHandle {
|
|
|
559
579
|
if (result === "error:notconnected" || !result.asElement())
|
|
560
580
|
return "error:notconnected";
|
|
561
581
|
const retargeted = result.asElement();
|
|
562
|
-
await
|
|
582
|
+
await this._beforeNonPointerAction(progress);
|
|
563
583
|
if (localPaths || localDirectory) {
|
|
564
584
|
const localPathsOrDirectory = localDirectory ? [localDirectory] : localPaths;
|
|
565
585
|
await progress.race(Promise.all(localPathsOrDirectory.map((localPath) => import_fs.default.promises.access(localPath, import_fs.default.constants.F_OK))));
|
|
@@ -592,7 +612,7 @@ class ElementHandle extends js.JSHandle {
|
|
|
592
612
|
}
|
|
593
613
|
async _type(progress, text, options) {
|
|
594
614
|
progress.log(`elementHandle.type("${text}")`);
|
|
595
|
-
await
|
|
615
|
+
await this._beforeNonPointerAction(progress);
|
|
596
616
|
const result = await this._focus(
|
|
597
617
|
progress,
|
|
598
618
|
true
|
|
@@ -610,7 +630,7 @@ class ElementHandle extends js.JSHandle {
|
|
|
610
630
|
}
|
|
611
631
|
async _press(progress, key, options) {
|
|
612
632
|
progress.log(`elementHandle.press("${key}")`);
|
|
613
|
-
await
|
|
633
|
+
await this._beforeNonPointerAction(progress);
|
|
614
634
|
return this._page.frameManager.waitForSignalsCreatedBy(progress, !options.noWaitAfter, async () => {
|
|
615
635
|
const result = await this._focus(
|
|
616
636
|
progress,
|
|
@@ -657,9 +677,6 @@ class ElementHandle extends js.JSHandle {
|
|
|
657
677
|
async boundingBox() {
|
|
658
678
|
return this._page.delegate.getBoundingBox(this);
|
|
659
679
|
}
|
|
660
|
-
async ariaSnapshot() {
|
|
661
|
-
return await this.evaluateInUtility(([injected, element]) => injected.ariaSnapshot(element, { mode: "expect" }), {});
|
|
662
|
-
}
|
|
663
680
|
async screenshot(progress, options) {
|
|
664
681
|
return await this._page.screenshotter.screenshotElement(progress, this, options);
|
|
665
682
|
}
|
|
@@ -758,6 +775,16 @@ function roundPoint(point) {
|
|
|
758
775
|
y: (point.y * 100 | 0) / 100
|
|
759
776
|
};
|
|
760
777
|
}
|
|
778
|
+
function quadToRect(quad) {
|
|
779
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
780
|
+
for (const point of quad) {
|
|
781
|
+
minX = Math.min(minX, point.x);
|
|
782
|
+
minY = Math.min(minY, point.y);
|
|
783
|
+
maxX = Math.max(maxX, point.x);
|
|
784
|
+
maxY = Math.max(maxY, point.y);
|
|
785
|
+
}
|
|
786
|
+
return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
|
|
787
|
+
}
|
|
761
788
|
function quadMiddlePoint(quad) {
|
|
762
789
|
const result = { x: 0, y: 0 };
|
|
763
790
|
for (const point of quad) {
|
package/lib/server/download.js
CHANGED
|
@@ -36,9 +36,10 @@ var import_page = require("./page");
|
|
|
36
36
|
var import_utils = require("../utils");
|
|
37
37
|
var import_artifact = require("./artifact");
|
|
38
38
|
class Download {
|
|
39
|
-
constructor(page, downloadsPath, uuid, url, suggestedFilename) {
|
|
39
|
+
constructor(page, downloadsPath, uuid, url, suggestedFilename, downloadFilename) {
|
|
40
40
|
const unaccessibleErrorMessage = page.browserContext._options.acceptDownloads === "deny" ? "Pass { acceptDownloads: true } when you are creating your browser context." : void 0;
|
|
41
|
-
|
|
41
|
+
const downloadPath = import_path.default.join(downloadsPath, downloadFilename ?? uuid);
|
|
42
|
+
this.artifact = new import_artifact.Artifact(page, downloadPath, unaccessibleErrorMessage, () => {
|
|
42
43
|
return this._page.browserContext.cancelDownload(uuid);
|
|
43
44
|
});
|
|
44
45
|
this._page = page;
|
|
@@ -76,7 +76,6 @@ class ElectronApplication extends import_instrumentation.SdkObject {
|
|
|
76
76
|
this._nodeSession.on("Runtime.consoleAPICalled", (event) => this._onConsoleAPI(event));
|
|
77
77
|
const appClosePromise = new Promise((f) => this.once(ElectronApplication.Events.Close, f));
|
|
78
78
|
this._browserContext.setCustomCloseHandler(async () => {
|
|
79
|
-
await this._browserContext.stopVideoRecording();
|
|
80
79
|
const electronHandle = await this._nodeElectronHandlePromise;
|
|
81
80
|
await electronHandle.evaluate(({ app }) => app.quit()).catch(() => {
|
|
82
81
|
});
|
|
@@ -97,7 +96,7 @@ class ElectronApplication extends import_instrumentation.SdkObject {
|
|
|
97
96
|
if (!this._nodeExecutionContext)
|
|
98
97
|
return;
|
|
99
98
|
const args = event.args.map((arg) => (0, import_crExecutionContext.createHandle)(this._nodeExecutionContext, arg));
|
|
100
|
-
const message = new import_console.ConsoleMessage(null, null, event.type, void 0, args, (0, import_crProtocolHelper.toConsoleMessageLocation)(event.stackTrace));
|
|
99
|
+
const message = new import_console.ConsoleMessage(null, null, event.type, void 0, args, (0, import_crProtocolHelper.toConsoleMessageLocation)(event.stackTrace), event.timestamp);
|
|
101
100
|
this.emit(ElectronApplication.Events.Console, message);
|
|
102
101
|
}
|
|
103
102
|
async initialize() {
|
|
@@ -131,11 +130,17 @@ class Electron extends import_instrumentation.SdkObject {
|
|
|
131
130
|
let app = void 0;
|
|
132
131
|
let electronArguments = ["--inspect=0", "--remote-debugging-port=0", ...options.args || []];
|
|
133
132
|
if (import_os.default.platform() === "linux") {
|
|
134
|
-
|
|
135
|
-
if (runningAsRoot && electronArguments.indexOf("--no-sandbox") === -1)
|
|
133
|
+
if (!options.chromiumSandbox && electronArguments.indexOf("--no-sandbox") === -1)
|
|
136
134
|
electronArguments.unshift("--no-sandbox");
|
|
137
135
|
}
|
|
138
|
-
|
|
136
|
+
let artifactsDir;
|
|
137
|
+
const tempDirectories = [];
|
|
138
|
+
if (options.artifactsDir) {
|
|
139
|
+
artifactsDir = options.artifactsDir;
|
|
140
|
+
} else {
|
|
141
|
+
artifactsDir = await progress.race(import_fs.default.promises.mkdtemp(ARTIFACTS_FOLDER));
|
|
142
|
+
tempDirectories.push(artifactsDir);
|
|
143
|
+
}
|
|
139
144
|
const browserLogsCollector = new import_debugLogger.RecentLogsCollector();
|
|
140
145
|
const env = options.env ? (0, import_processLauncher.envArrayToObject)(options.env) : process.env;
|
|
141
146
|
let command;
|
|
@@ -158,8 +163,8 @@ class Electron extends import_instrumentation.SdkObject {
|
|
|
158
163
|
let shell = false;
|
|
159
164
|
if (process.platform === "win32") {
|
|
160
165
|
shell = true;
|
|
161
|
-
command = `"${
|
|
162
|
-
electronArguments =
|
|
166
|
+
command = [command, ...electronArguments].map((arg) => `"${escapeDoubleQuotes(arg)}"`).join(" ");
|
|
167
|
+
electronArguments = [];
|
|
163
168
|
}
|
|
164
169
|
delete env.NODE_OPTIONS;
|
|
165
170
|
const { launchedProcess, gracefullyClose, kill } = await (0, import_processLauncher.launchProcess)({
|
|
@@ -173,7 +178,7 @@ class Electron extends import_instrumentation.SdkObject {
|
|
|
173
178
|
shell,
|
|
174
179
|
stdio: "pipe",
|
|
175
180
|
cwd: options.cwd,
|
|
176
|
-
tempDirectories
|
|
181
|
+
tempDirectories,
|
|
177
182
|
attemptToGracefullyClose: () => app.close(),
|
|
178
183
|
handleSIGINT: true,
|
|
179
184
|
handleSIGTERM: true,
|
|
@@ -219,7 +224,7 @@ class Electron extends import_instrumentation.SdkObject {
|
|
|
219
224
|
};
|
|
220
225
|
const browserOptions = {
|
|
221
226
|
name: "electron",
|
|
222
|
-
|
|
227
|
+
browserType: "chromium",
|
|
223
228
|
headful: true,
|
|
224
229
|
persistent: contextOptions,
|
|
225
230
|
browserProcess,
|
|
@@ -263,6 +268,9 @@ async function waitForLine(progress, process2, regex) {
|
|
|
263
268
|
import_eventsHelper.eventsHelper.removeEventListeners(listeners);
|
|
264
269
|
}
|
|
265
270
|
}
|
|
271
|
+
function escapeDoubleQuotes(str) {
|
|
272
|
+
return str.replace(/"/g, '\\"');
|
|
273
|
+
}
|
|
266
274
|
// Annotate the CommonJS export names for ESM import in node:
|
|
267
275
|
0 && (module.exports = {
|
|
268
276
|
Electron,
|