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
package/lib/server/page.js
CHANGED
|
@@ -31,11 +31,13 @@ __export(page_exports, {
|
|
|
31
31
|
InitScript: () => InitScript,
|
|
32
32
|
Page: () => Page,
|
|
33
33
|
PageBinding: () => PageBinding,
|
|
34
|
-
Worker: () => Worker
|
|
34
|
+
Worker: () => Worker,
|
|
35
|
+
WorkerEvent: () => WorkerEvent,
|
|
36
|
+
ariaSnapshotForFrame: () => ariaSnapshotForFrame
|
|
35
37
|
});
|
|
36
38
|
module.exports = __toCommonJS(page_exports);
|
|
37
|
-
var import_pageBinding = require("./pageBinding");
|
|
38
39
|
var import_browserContext = require("./browserContext");
|
|
40
|
+
var import_disposable = require("./disposable");
|
|
39
41
|
var import_console = require("./console");
|
|
40
42
|
var import_errors = require("./errors");
|
|
41
43
|
var import_fileChooser = require("./fileChooser");
|
|
@@ -53,11 +55,29 @@ var import_selectorParser = require("../utils/isomorphic/selectorParser");
|
|
|
53
55
|
var import_manualPromise = require("../utils/isomorphic/manualPromise");
|
|
54
56
|
var import_utilityScriptSerializers = require("../utils/isomorphic/utilityScriptSerializers");
|
|
55
57
|
var import_callLog = require("./callLog");
|
|
58
|
+
var rawBindingsControllerSource = __toESM(require("../generated/bindingsControllerSource"));
|
|
59
|
+
var import_overlay = require("./overlay");
|
|
60
|
+
var import_dom = require("./dom");
|
|
61
|
+
var import_screencast = require("./screencast");
|
|
62
|
+
const PageEvent = {
|
|
63
|
+
Close: "close",
|
|
64
|
+
Crash: "crash",
|
|
65
|
+
Download: "download",
|
|
66
|
+
EmulatedSizeChanged: "emulatedsizechanged",
|
|
67
|
+
FileChooser: "filechooser",
|
|
68
|
+
FrameAttached: "frameattached",
|
|
69
|
+
FrameDetached: "framedetached",
|
|
70
|
+
InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument",
|
|
71
|
+
LocatorHandlerTriggered: "locatorhandlertriggered",
|
|
72
|
+
WebSocket: "websocket",
|
|
73
|
+
Worker: "worker"
|
|
74
|
+
};
|
|
75
|
+
const navigationMarkSymbol = Symbol("navigationMark");
|
|
56
76
|
class Page extends import_instrumentation.SdkObject {
|
|
57
77
|
constructor(delegate, browserContext) {
|
|
58
78
|
super(browserContext, "page");
|
|
59
79
|
this._closedState = "open";
|
|
60
|
-
this.
|
|
80
|
+
this.closedPromise = new import_manualPromise.ManualPromise();
|
|
61
81
|
this._initializedPromise = new import_manualPromise.ManualPromise();
|
|
62
82
|
this._consoleMessages = [];
|
|
63
83
|
this._pageErrors = [];
|
|
@@ -69,14 +89,10 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
69
89
|
this.initScripts = [];
|
|
70
90
|
this._workers = /* @__PURE__ */ new Map();
|
|
71
91
|
this.requestInterceptors = [];
|
|
72
|
-
this.video = null;
|
|
73
92
|
this._locatorHandlers = /* @__PURE__ */ new Map();
|
|
74
93
|
this._lastLocatorHandlerUid = 0;
|
|
75
94
|
this._locatorHandlerRunningCounter = 0;
|
|
76
95
|
this._networkRequests = [];
|
|
77
|
-
// Aiming at 25 fps by default - each frame is 40ms, but we give some slack with 35ms.
|
|
78
|
-
// When throttling for tracing, 200ms between frames, except for 10 frames around the action.
|
|
79
|
-
this._frameThrottler = new FrameThrottler(10, 35, 200);
|
|
80
96
|
this.attribution.page = this;
|
|
81
97
|
this.delegate = delegate;
|
|
82
98
|
this.browserContext = browserContext;
|
|
@@ -85,27 +101,15 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
85
101
|
this.touchscreen = new input.Touchscreen(delegate.rawTouchscreen, this);
|
|
86
102
|
this.screenshotter = new import_screenshotter.Screenshotter(this);
|
|
87
103
|
this.frameManager = new frames.FrameManager(this);
|
|
104
|
+
this.overlay = new import_overlay.Overlay(this);
|
|
105
|
+
this.screencast = new import_screencast.Screencast(this);
|
|
88
106
|
if (delegate.pdf)
|
|
89
107
|
this.pdf = delegate.pdf.bind(delegate);
|
|
90
108
|
this.coverage = delegate.coverage ? delegate.coverage() : null;
|
|
91
109
|
this.isStorageStatePage = browserContext.isCreatingStorageStatePage();
|
|
92
110
|
}
|
|
93
111
|
static {
|
|
94
|
-
this.Events =
|
|
95
|
-
Close: "close",
|
|
96
|
-
Crash: "crash",
|
|
97
|
-
Download: "download",
|
|
98
|
-
EmulatedSizeChanged: "emulatedsizechanged",
|
|
99
|
-
FileChooser: "filechooser",
|
|
100
|
-
FrameAttached: "frameattached",
|
|
101
|
-
FrameDetached: "framedetached",
|
|
102
|
-
InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument",
|
|
103
|
-
LocatorHandlerTriggered: "locatorhandlertriggered",
|
|
104
|
-
ScreencastFrame: "screencastframe",
|
|
105
|
-
Video: "video",
|
|
106
|
-
WebSocket: "websocket",
|
|
107
|
-
Worker: "worker"
|
|
108
|
-
};
|
|
112
|
+
this.Events = PageEvent;
|
|
109
113
|
}
|
|
110
114
|
async reportAsNew(opener, error) {
|
|
111
115
|
if (opener) {
|
|
@@ -158,17 +162,20 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
158
162
|
}
|
|
159
163
|
_didClose() {
|
|
160
164
|
this.frameManager.dispose();
|
|
161
|
-
this.
|
|
165
|
+
this.screencast.dispose();
|
|
166
|
+
this.overlay.dispose();
|
|
162
167
|
(0, import_utils.assert)(this._closedState !== "closed", "Page closed twice");
|
|
163
168
|
this._closedState = "closed";
|
|
164
169
|
this.emit(Page.Events.Close);
|
|
165
|
-
this.
|
|
170
|
+
this.browserContext.emit(import_browserContext.BrowserContext.Events.PageClosed, this);
|
|
171
|
+
this.closedPromise.resolve();
|
|
166
172
|
this.instrumentation.onPageClose(this);
|
|
167
|
-
this.openScope.close(new import_errors.TargetClosedError());
|
|
173
|
+
this.openScope.close(new import_errors.TargetClosedError(this.closeReason()));
|
|
168
174
|
}
|
|
169
175
|
_didCrash() {
|
|
170
176
|
this.frameManager.dispose();
|
|
171
|
-
this.
|
|
177
|
+
this.screencast.dispose();
|
|
178
|
+
this.overlay.dispose();
|
|
172
179
|
this.emit(Page.Events.Crash);
|
|
173
180
|
this._crashed = true;
|
|
174
181
|
this.instrumentation.onPageClose(this);
|
|
@@ -202,16 +209,25 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
202
209
|
throw new Error(`Function "${name}" has been already registered`);
|
|
203
210
|
if (this.browserContext._pageBindings.has(name))
|
|
204
211
|
throw new Error(`Function "${name}" has been already registered in the browser context`);
|
|
205
|
-
|
|
212
|
+
await progress.race(this.browserContext.exposePlaywrightBindingIfNeeded());
|
|
213
|
+
const binding = new PageBinding(this, name, playwrightBinding, needsHandle);
|
|
206
214
|
this._pageBindings.set(name, binding);
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
215
|
+
try {
|
|
216
|
+
await progress.race(this.delegate.addInitScript(binding.initScript));
|
|
217
|
+
await progress.race(this.safeNonStallingEvaluateInAllFrames(binding.initScript.source, "main"));
|
|
218
|
+
return binding;
|
|
219
|
+
} catch (error) {
|
|
220
|
+
this._pageBindings.delete(name);
|
|
221
|
+
throw error;
|
|
213
222
|
}
|
|
214
|
-
|
|
223
|
+
}
|
|
224
|
+
async removeExposedBinding(binding) {
|
|
225
|
+
if (this._pageBindings.get(binding.name) !== binding)
|
|
226
|
+
return;
|
|
227
|
+
this._pageBindings.delete(binding.name);
|
|
228
|
+
await this.delegate.removeInitScripts([binding.initScript]);
|
|
229
|
+
const cleanup = `{ ${binding.cleanupScript} };`;
|
|
230
|
+
await this.safeNonStallingEvaluateInAllFrames(cleanup, "main");
|
|
215
231
|
}
|
|
216
232
|
async setExtraHTTPHeaders(progress, headers) {
|
|
217
233
|
const oldHeaders = this._extraHTTPHeaders;
|
|
@@ -240,8 +256,8 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
240
256
|
return;
|
|
241
257
|
await PageBinding.dispatch(this, payload, context);
|
|
242
258
|
}
|
|
243
|
-
addConsoleMessage(worker, type, args, location, text) {
|
|
244
|
-
const message = new import_console.ConsoleMessage(this, worker, type, text, args, location);
|
|
259
|
+
addConsoleMessage(worker, type, args, location, text, timestamp) {
|
|
260
|
+
const message = new import_console.ConsoleMessage(this, worker, type, text, args, location, timestamp);
|
|
245
261
|
const intercepted = this.frameManager.interceptConsoleMessage(message);
|
|
246
262
|
if (intercepted) {
|
|
247
263
|
args.forEach((arg) => arg.dispose());
|
|
@@ -252,8 +268,14 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
252
268
|
if (this._initialized)
|
|
253
269
|
this.emitOnContext(import_browserContext.BrowserContext.Events.Console, message);
|
|
254
270
|
}
|
|
255
|
-
|
|
256
|
-
|
|
271
|
+
clearConsoleMessages() {
|
|
272
|
+
this._consoleMessages.length = 0;
|
|
273
|
+
}
|
|
274
|
+
consoleMessages(filter) {
|
|
275
|
+
if (filter === "all")
|
|
276
|
+
return this._consoleMessages;
|
|
277
|
+
const marked = this._consoleMessages.findLastIndex((m) => m[navigationMarkSymbol]);
|
|
278
|
+
return marked === -1 ? this._consoleMessages : this._consoleMessages.slice(marked + 1);
|
|
257
279
|
}
|
|
258
280
|
addPageError(pageError) {
|
|
259
281
|
this._pageErrors.push(pageError);
|
|
@@ -261,8 +283,14 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
261
283
|
if (this._initialized)
|
|
262
284
|
this.emitOnContext(import_browserContext.BrowserContext.Events.PageError, pageError, this);
|
|
263
285
|
}
|
|
264
|
-
|
|
265
|
-
|
|
286
|
+
clearPageErrors() {
|
|
287
|
+
this._pageErrors.length = 0;
|
|
288
|
+
}
|
|
289
|
+
pageErrors(filter) {
|
|
290
|
+
if (filter === "all")
|
|
291
|
+
return this._pageErrors;
|
|
292
|
+
const marked = this._pageErrors.findLastIndex((e) => e[navigationMarkSymbol]);
|
|
293
|
+
return marked === -1 ? this._pageErrors : this._pageErrors.slice(marked + 1);
|
|
266
294
|
}
|
|
267
295
|
async reload(progress, options) {
|
|
268
296
|
return this.mainFrame().raceNavigationAction(progress, async () => {
|
|
@@ -439,21 +467,21 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
439
467
|
async bringToFront() {
|
|
440
468
|
await this.delegate.bringToFront();
|
|
441
469
|
}
|
|
442
|
-
async addInitScript(
|
|
443
|
-
const initScript = new InitScript(source);
|
|
470
|
+
async addInitScript(source) {
|
|
471
|
+
const initScript = new InitScript(this, source);
|
|
444
472
|
this.initScripts.push(initScript);
|
|
445
473
|
try {
|
|
446
|
-
await
|
|
474
|
+
await this.delegate.addInitScript(initScript);
|
|
447
475
|
} catch (error) {
|
|
448
|
-
|
|
476
|
+
initScript.dispose().catch(() => {
|
|
449
477
|
});
|
|
450
478
|
throw error;
|
|
451
479
|
}
|
|
452
480
|
return initScript;
|
|
453
481
|
}
|
|
454
|
-
async
|
|
455
|
-
this.initScripts
|
|
456
|
-
await this.delegate.removeInitScripts();
|
|
482
|
+
async removeInitScript(initScript) {
|
|
483
|
+
this.initScripts = this.initScripts.filter((script) => initScript !== script);
|
|
484
|
+
await this.delegate.removeInitScripts([initScript]);
|
|
457
485
|
}
|
|
458
486
|
needsRequestInterception() {
|
|
459
487
|
return this.requestInterceptors.length > 0 || this.browserContext.requestInterceptors.length > 0;
|
|
@@ -567,15 +595,17 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
567
595
|
if (this._closedState === "closed")
|
|
568
596
|
return;
|
|
569
597
|
if (options.reason)
|
|
570
|
-
this.
|
|
598
|
+
this._closeReason = options.reason;
|
|
571
599
|
const runBeforeUnload = !!options.runBeforeUnload;
|
|
600
|
+
if (!runBeforeUnload)
|
|
601
|
+
await this.screencast.handlePageOrContextClose();
|
|
572
602
|
if (this._closedState !== "closing") {
|
|
573
603
|
if (!runBeforeUnload)
|
|
574
604
|
this._closedState = "closing";
|
|
575
605
|
await this.delegate.closePage(runBeforeUnload).catch((e) => import_debugLogger.debugLogger.log("error", e));
|
|
576
606
|
}
|
|
577
607
|
if (!runBeforeUnload)
|
|
578
|
-
await this.
|
|
608
|
+
await this.closedPromise;
|
|
579
609
|
}
|
|
580
610
|
isClosed() {
|
|
581
611
|
return this._closedState === "closed";
|
|
@@ -617,23 +647,26 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
617
647
|
}
|
|
618
648
|
frameNavigatedToNewDocument(frame) {
|
|
619
649
|
this.emit(Page.Events.InternalFrameNavigatedToNewDocument, frame);
|
|
650
|
+
this.browserContext.emit(import_browserContext.BrowserContext.Events.InternalFrameNavigatedToNewDocument, frame, this);
|
|
620
651
|
const origin = frame.origin();
|
|
621
652
|
if (origin)
|
|
622
653
|
this.browserContext.addVisitedOrigin(origin);
|
|
654
|
+
if (frame === this.mainFrame()) {
|
|
655
|
+
if (this._consoleMessages.length > 0)
|
|
656
|
+
this._consoleMessages[this._consoleMessages.length - 1][navigationMarkSymbol] = true;
|
|
657
|
+
if (this._pageErrors.length > 0)
|
|
658
|
+
this._pageErrors[this._pageErrors.length - 1][navigationMarkSymbol] = true;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
allInitScripts() {
|
|
662
|
+
const bindings = [...this.browserContext._pageBindings.values(), ...this._pageBindings.values()].map((binding) => binding.initScript);
|
|
663
|
+
if (this.browserContext.bindingsInitScript)
|
|
664
|
+
bindings.unshift(this.browserContext.bindingsInitScript);
|
|
665
|
+
return [...bindings, ...this.browserContext.initScripts, ...this.initScripts];
|
|
623
666
|
}
|
|
624
667
|
getBinding(name) {
|
|
625
668
|
return this._pageBindings.get(name) || this.browserContext._pageBindings.get(name);
|
|
626
669
|
}
|
|
627
|
-
setScreencastOptions(options) {
|
|
628
|
-
this.delegate.setScreencastOptions(options).catch((e) => import_debugLogger.debugLogger.log("error", e));
|
|
629
|
-
this._frameThrottler.setThrottlingEnabled(!!options);
|
|
630
|
-
}
|
|
631
|
-
throttleScreencastFrameAck(ack) {
|
|
632
|
-
this._frameThrottler.ack(ack);
|
|
633
|
-
}
|
|
634
|
-
temporarilyDisableTracingScreencastThrottling() {
|
|
635
|
-
this._frameThrottler.recharge();
|
|
636
|
-
}
|
|
637
670
|
async safeNonStallingEvaluateInAllFrames(expression, world, options = {}) {
|
|
638
671
|
await Promise.all(this.frames().map(async (frame) => {
|
|
639
672
|
try {
|
|
@@ -648,14 +681,13 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
648
681
|
await Promise.all(this.frames().map((frame) => frame.hideHighlight().catch(() => {
|
|
649
682
|
})));
|
|
650
683
|
}
|
|
651
|
-
async
|
|
652
|
-
|
|
653
|
-
return { full: snapshot.full.join("\n"), incremental: snapshot.incremental?.join("\n") };
|
|
654
|
-
}
|
|
655
|
-
allBindings() {
|
|
656
|
-
return [...this.browserContext._pageBindings.values(), ...this._pageBindings.values()];
|
|
684
|
+
async setDockTile(image) {
|
|
685
|
+
await this.delegate.setDockTile(image);
|
|
657
686
|
}
|
|
658
687
|
}
|
|
688
|
+
const WorkerEvent = {
|
|
689
|
+
Close: "close"
|
|
690
|
+
};
|
|
659
691
|
class Worker extends import_instrumentation.SdkObject {
|
|
660
692
|
constructor(parent, url) {
|
|
661
693
|
super(parent, "worker");
|
|
@@ -666,9 +698,7 @@ class Worker extends import_instrumentation.SdkObject {
|
|
|
666
698
|
this.url = url;
|
|
667
699
|
}
|
|
668
700
|
static {
|
|
669
|
-
this.Events =
|
|
670
|
-
Close: "close"
|
|
671
|
-
};
|
|
701
|
+
this.Events = WorkerEvent;
|
|
672
702
|
}
|
|
673
703
|
createExecutionContext(delegate) {
|
|
674
704
|
this.existingExecutionContext = new js.ExecutionContext(this, delegate, "worker");
|
|
@@ -681,41 +711,51 @@ class Worker extends import_instrumentation.SdkObject {
|
|
|
681
711
|
if (this.existingExecutionContext)
|
|
682
712
|
this._executionContextPromise.resolve(this.existingExecutionContext);
|
|
683
713
|
}
|
|
714
|
+
_prepareContextForRestart() {
|
|
715
|
+
if (this.existingExecutionContext)
|
|
716
|
+
this.existingExecutionContext.contextDestroyed("Service worker restarted");
|
|
717
|
+
this.existingExecutionContext = null;
|
|
718
|
+
this._workerScriptLoaded = false;
|
|
719
|
+
this._executionContextPromise = new import_manualPromise.ManualPromise();
|
|
720
|
+
}
|
|
684
721
|
didClose() {
|
|
685
722
|
if (this.existingExecutionContext)
|
|
686
723
|
this.existingExecutionContext.contextDestroyed("Worker was closed");
|
|
687
724
|
this.emit(Worker.Events.Close, this);
|
|
688
725
|
this.openScope.close(new Error("Worker closed"));
|
|
689
726
|
}
|
|
690
|
-
async evaluateExpression(expression, isFunction, arg
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
if (isolatedContext) context = await frame._utilityContext();
|
|
696
|
-
else if (!isolatedContext) context = await frame._mainContext();
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
return js.evaluateExpression(context, expression, { returnByValue: true, isFunction }, arg);
|
|
700
|
-
}
|
|
701
|
-
async evaluateExpressionHandle(expression, isFunction, arg, isolatedContext) {
|
|
702
|
-
let context = await this._executionContextPromise;
|
|
703
|
-
if (context.constructor.name === "FrameExecutionContext") {
|
|
704
|
-
const frame = this._context.frame;
|
|
705
|
-
if (frame) {
|
|
706
|
-
if (isolatedContext) context = await frame._utilityContext();
|
|
707
|
-
else if (!isolatedContext) context = await frame._mainContext();
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
return js.evaluateExpression(context, expression, { returnByValue: false, isFunction }, arg);
|
|
727
|
+
async evaluateExpression(expression, isFunction, arg) {
|
|
728
|
+
return js.evaluateExpression(await this._executionContextPromise, expression, { returnByValue: true, isFunction }, arg);
|
|
729
|
+
}
|
|
730
|
+
async evaluateExpressionHandle(expression, isFunction, arg) {
|
|
731
|
+
return js.evaluateExpression(await this._executionContextPromise, expression, { returnByValue: false, isFunction }, arg);
|
|
711
732
|
}
|
|
712
733
|
}
|
|
713
|
-
class PageBinding {
|
|
714
|
-
|
|
734
|
+
class PageBinding extends import_disposable.DisposableObject {
|
|
735
|
+
static {
|
|
736
|
+
this.kController = "__playwright__binding__controller__";
|
|
737
|
+
}
|
|
738
|
+
static {
|
|
739
|
+
this.kBindingName = "__playwright__binding__";
|
|
740
|
+
}
|
|
741
|
+
static createInitScript(browserContext) {
|
|
742
|
+
return new InitScript(browserContext, `
|
|
743
|
+
(() => {
|
|
744
|
+
const module = {};
|
|
745
|
+
${rawBindingsControllerSource.source}
|
|
746
|
+
const property = '${PageBinding.kController}';
|
|
747
|
+
if (!globalThis[property])
|
|
748
|
+
globalThis[property] = new (module.exports.BindingsController())(globalThis, '${PageBinding.kBindingName}');
|
|
749
|
+
})();
|
|
750
|
+
`);
|
|
751
|
+
}
|
|
752
|
+
constructor(parent, name, playwrightFunction, needsHandle) {
|
|
753
|
+
super(parent);
|
|
715
754
|
this.name = name;
|
|
716
755
|
this.playwrightFunction = playwrightFunction;
|
|
717
|
-
this.
|
|
756
|
+
this.initScript = new InitScript(parent, `globalThis['${PageBinding.kController}'].addBinding(${JSON.stringify(name)}, ${needsHandle})`);
|
|
718
757
|
this.needsHandle = needsHandle;
|
|
758
|
+
this.cleanupScript = `globalThis['${PageBinding.kController}'].removeBinding(${JSON.stringify(name)})`;
|
|
719
759
|
}
|
|
720
760
|
static async dispatch(page, payload, context) {
|
|
721
761
|
const { name, seq, serializedArgs } = JSON.parse(payload);
|
|
@@ -726,87 +766,62 @@ class PageBinding {
|
|
|
726
766
|
throw new Error(`Function "${name}" is not exposed`);
|
|
727
767
|
let result;
|
|
728
768
|
if (binding.needsHandle) {
|
|
729
|
-
const handle = await context.
|
|
730
|
-
result = await binding.playwrightFunction({ frame: context.frame, page, context: page.
|
|
769
|
+
const handle = await context.evaluateExpressionHandle(`arg => globalThis['${PageBinding.kController}'].takeBindingHandle(arg)`, { isFunction: true }, { name, seq }).catch((e) => null);
|
|
770
|
+
result = await binding.playwrightFunction({ frame: context.frame, page, context: page.browserContext }, handle);
|
|
731
771
|
} else {
|
|
732
772
|
if (!Array.isArray(serializedArgs))
|
|
733
773
|
throw new Error(`serializedArgs is not an array. This can happen when Array.prototype.toJSON is defined incorrectly`);
|
|
734
774
|
const args = serializedArgs.map((a) => (0, import_utilityScriptSerializers.parseEvaluationResultValue)(a));
|
|
735
|
-
result = await binding.playwrightFunction({ frame: context.frame, page, context: page.
|
|
775
|
+
result = await binding.playwrightFunction({ frame: context.frame, page, context: page.browserContext }, ...args);
|
|
736
776
|
}
|
|
737
|
-
context.
|
|
777
|
+
context.evaluateExpressionHandle(`arg => globalThis['${PageBinding.kController}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, result }).catch((e) => import_debugLogger.debugLogger.log("error", e));
|
|
738
778
|
} catch (error) {
|
|
739
|
-
context.
|
|
779
|
+
context.evaluateExpressionHandle(`arg => globalThis['${PageBinding.kController}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, error }).catch((e) => import_debugLogger.debugLogger.log("error", e));
|
|
740
780
|
}
|
|
741
781
|
}
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
constructor(source) {
|
|
745
|
-
this.source = `(() => { ${source} })();`;
|
|
782
|
+
async dispose() {
|
|
783
|
+
await this.parent.removeExposedBinding(this);
|
|
746
784
|
}
|
|
747
785
|
}
|
|
748
|
-
class
|
|
749
|
-
constructor(
|
|
750
|
-
|
|
751
|
-
this.
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
this._defaultInterval = defaultInterval;
|
|
755
|
-
this._throttlingInterval = throttlingInterval;
|
|
756
|
-
this._tick();
|
|
757
|
-
}
|
|
758
|
-
dispose() {
|
|
759
|
-
if (this._timeoutId) {
|
|
760
|
-
clearTimeout(this._timeoutId);
|
|
761
|
-
this._timeoutId = void 0;
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
setThrottlingEnabled(enabled) {
|
|
765
|
-
this._throttlingEnabled = enabled;
|
|
766
|
-
}
|
|
767
|
-
recharge() {
|
|
768
|
-
for (const ack of this._acks)
|
|
769
|
-
ack();
|
|
770
|
-
this._acks = [];
|
|
771
|
-
this._budget = this._nonThrottledFrames;
|
|
772
|
-
if (this._timeoutId) {
|
|
773
|
-
clearTimeout(this._timeoutId);
|
|
774
|
-
this._tick();
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
ack(ack) {
|
|
778
|
-
if (!this._timeoutId) {
|
|
779
|
-
ack();
|
|
780
|
-
return;
|
|
781
|
-
}
|
|
782
|
-
this._acks.push(ack);
|
|
786
|
+
class InitScript extends import_disposable.DisposableObject {
|
|
787
|
+
constructor(owner, source) {
|
|
788
|
+
super(owner);
|
|
789
|
+
this.source = `(() => {
|
|
790
|
+
${source}
|
|
791
|
+
})();`;
|
|
783
792
|
}
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
if (ack) {
|
|
787
|
-
--this._budget;
|
|
788
|
-
ack();
|
|
789
|
-
}
|
|
790
|
-
if (this._throttlingEnabled && this._budget <= 0) {
|
|
791
|
-
this._timeoutId = setTimeout(() => this._tick(), this._throttlingInterval);
|
|
792
|
-
} else {
|
|
793
|
-
this._timeoutId = setTimeout(() => this._tick(), this._defaultInterval);
|
|
794
|
-
}
|
|
793
|
+
async dispose() {
|
|
794
|
+
await this.parent.removeInitScript(this);
|
|
795
795
|
}
|
|
796
796
|
}
|
|
797
|
-
async function
|
|
797
|
+
async function ariaSnapshotForFrame(progress, frame, options = {}) {
|
|
798
798
|
const snapshot = await frame.retryWithProgressAndTimeouts(progress, [1e3, 2e3, 4e3, 8e3], async (continuePolling) => {
|
|
799
799
|
try {
|
|
800
800
|
const context = await progress.race(frame._utilityContext());
|
|
801
801
|
const injectedScript = await progress.race(context.injectedScript());
|
|
802
802
|
const snapshotOrRetry = await progress.race(injectedScript.evaluate((injected, options2) => {
|
|
803
|
+
if (options2.info) {
|
|
804
|
+
const element = injected.querySelector(options2.info.parsed, injected.document, options2.info.strict);
|
|
805
|
+
if (!element)
|
|
806
|
+
return false;
|
|
807
|
+
return injected.incrementalAriaSnapshot(element, options2);
|
|
808
|
+
}
|
|
803
809
|
const node = injected.document.body;
|
|
804
810
|
if (!node)
|
|
805
811
|
return true;
|
|
806
|
-
return injected.incrementalAriaSnapshot(node,
|
|
807
|
-
}, {
|
|
812
|
+
return injected.incrementalAriaSnapshot(node, options2);
|
|
813
|
+
}, {
|
|
814
|
+
mode: options.mode ?? "default",
|
|
815
|
+
refPrefix: frame.seq ? "f" + frame.seq : "",
|
|
816
|
+
track: options.track,
|
|
817
|
+
doNotRenderActive: options.doNotRenderActive,
|
|
818
|
+
info: options.info,
|
|
819
|
+
depth: options.depth
|
|
820
|
+
}));
|
|
808
821
|
if (snapshotOrRetry === true)
|
|
809
822
|
return continuePolling;
|
|
823
|
+
if (snapshotOrRetry === false)
|
|
824
|
+
throw new import_dom.NonRecoverableDOMError(`Selector "${(0, import_selectorParser.stringifySelector)(options.info.parsed)}" does not match any element`);
|
|
810
825
|
return snapshotOrRetry;
|
|
811
826
|
} catch (e) {
|
|
812
827
|
if (frame.isNonRetriableError(e))
|
|
@@ -814,18 +829,23 @@ async function snapshotFrameForAI(progress, frame, options) {
|
|
|
814
829
|
return continuePolling;
|
|
815
830
|
}
|
|
816
831
|
});
|
|
817
|
-
const
|
|
832
|
+
const renderedIframeRefs = snapshot.iframeRefs.filter((ref) => ref in snapshot.iframeDepths);
|
|
833
|
+
const childSnapshotPromises = renderedIframeRefs.map((ref) => {
|
|
834
|
+
const iframeDepth = snapshot.iframeDepths[ref];
|
|
835
|
+
const childDepth = options.depth ? options.depth - iframeDepth - 1 : void 0;
|
|
836
|
+
return ariaSnapshotFrameRef(progress, frame, ref, { ...options, depth: childDepth });
|
|
837
|
+
});
|
|
818
838
|
const childSnapshots = await Promise.all(childSnapshotPromises);
|
|
819
839
|
const full = [];
|
|
820
840
|
let incremental;
|
|
821
841
|
if (snapshot.incremental !== void 0) {
|
|
822
842
|
incremental = snapshot.incremental.split("\n");
|
|
823
|
-
for (let i = 0; i <
|
|
843
|
+
for (let i = 0; i < renderedIframeRefs.length; i++) {
|
|
824
844
|
const childSnapshot = childSnapshots[i];
|
|
825
845
|
if (childSnapshot.incremental)
|
|
826
846
|
incremental.push(...childSnapshot.incremental);
|
|
827
847
|
else if (childSnapshot.full.length)
|
|
828
|
-
incremental.push("- <changed> iframe [ref=" +
|
|
848
|
+
incremental.push("- <changed> iframe [ref=" + renderedIframeRefs[i] + "]:", ...childSnapshot.full.map((l) => " " + l));
|
|
829
849
|
}
|
|
830
850
|
}
|
|
831
851
|
for (const line of snapshot.full.split("\n")) {
|
|
@@ -836,20 +856,20 @@ async function snapshotFrameForAI(progress, frame, options) {
|
|
|
836
856
|
}
|
|
837
857
|
const leadingSpace = match[1];
|
|
838
858
|
const ref = match[2];
|
|
839
|
-
const childSnapshot = childSnapshots[
|
|
859
|
+
const childSnapshot = childSnapshots[renderedIframeRefs.indexOf(ref)] ?? { full: [] };
|
|
840
860
|
full.push(childSnapshot.full.length ? line + ":" : line);
|
|
841
861
|
full.push(...childSnapshot.full.map((l) => leadingSpace + " " + l));
|
|
842
862
|
}
|
|
843
863
|
return { full, incremental };
|
|
844
864
|
}
|
|
845
|
-
async function
|
|
865
|
+
async function ariaSnapshotFrameRef(progress, parentFrame, frameRef, options) {
|
|
846
866
|
const frameSelector = `aria-ref=${frameRef} >> internal:control=enter-frame`;
|
|
847
867
|
const frameBodySelector = `${frameSelector} >> body`;
|
|
848
868
|
const child = await progress.race(parentFrame.selectors.resolveFrameForSelector(frameBodySelector, { strict: true }));
|
|
849
869
|
if (!child)
|
|
850
870
|
return { full: [] };
|
|
851
871
|
try {
|
|
852
|
-
return await
|
|
872
|
+
return await ariaSnapshotForFrame(progress, child.frame, { ...options, info: void 0 });
|
|
853
873
|
} catch {
|
|
854
874
|
return { full: [] };
|
|
855
875
|
}
|
|
@@ -864,5 +884,7 @@ function ensureArrayLimit(array, limit) {
|
|
|
864
884
|
InitScript,
|
|
865
885
|
Page,
|
|
866
886
|
PageBinding,
|
|
867
|
-
Worker
|
|
887
|
+
Worker,
|
|
888
|
+
WorkerEvent,
|
|
889
|
+
ariaSnapshotForFrame
|
|
868
890
|
});
|
package/lib/server/progress.js
CHANGED
|
@@ -34,19 +34,41 @@ class ProgressController {
|
|
|
34
34
|
this.metadata = metadata || { id: "", startTime: 0, endTime: 0, type: "Internal", method: "", params: {}, log: [], internal: true };
|
|
35
35
|
this._onCallLog = onCallLog;
|
|
36
36
|
this._forceAbortPromise.catch((e) => null);
|
|
37
|
+
this._controller = new AbortController();
|
|
38
|
+
}
|
|
39
|
+
static createForSdkObject(sdkObject, callMetadata) {
|
|
40
|
+
const logName = sdkObject.logName || "api";
|
|
41
|
+
return new ProgressController(callMetadata, (message) => {
|
|
42
|
+
if (logName === "api" && sdkObject.attribution.playwright?.options.isInternalPlaywright)
|
|
43
|
+
return;
|
|
44
|
+
import_utils.debugLogger.log(logName, message);
|
|
45
|
+
sdkObject.instrumentation.onCallLog(sdkObject, callMetadata, logName, message);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
static runInternalTask(task, timeout) {
|
|
49
|
+
const progress = new ProgressController();
|
|
50
|
+
return progress.run(task, timeout);
|
|
37
51
|
}
|
|
38
52
|
async abort(error) {
|
|
39
53
|
if (this._state === "running") {
|
|
40
54
|
error[kAbortErrorSymbol] = true;
|
|
41
55
|
this._state = { error };
|
|
42
56
|
this._forceAbortPromise.reject(error);
|
|
57
|
+
this._controller.abort(error);
|
|
43
58
|
}
|
|
44
59
|
await this._donePromise;
|
|
45
60
|
}
|
|
46
61
|
async run(task, timeout) {
|
|
62
|
+
const deadline = timeout ? (0, import_utils.monotonicTime)() + timeout : 0;
|
|
47
63
|
(0, import_utils.assert)(this._state === "before");
|
|
48
64
|
this._state = "running";
|
|
65
|
+
let timer;
|
|
49
66
|
const progress = {
|
|
67
|
+
timeout: timeout ?? 0,
|
|
68
|
+
deadline,
|
|
69
|
+
disableTimeout: () => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
},
|
|
50
72
|
log: (message) => {
|
|
51
73
|
if (this._state === "running")
|
|
52
74
|
this.metadata.log.push(message);
|
|
@@ -55,24 +77,28 @@ class ProgressController {
|
|
|
55
77
|
metadata: this.metadata,
|
|
56
78
|
race: (promise) => {
|
|
57
79
|
const promises = Array.isArray(promise) ? promise : [promise];
|
|
80
|
+
if (!promises.length)
|
|
81
|
+
return Promise.resolve();
|
|
58
82
|
return Promise.race([...promises, this._forceAbortPromise]);
|
|
59
83
|
},
|
|
60
84
|
wait: async (timeout2) => {
|
|
61
85
|
let timer2;
|
|
62
86
|
const promise = new Promise((f) => timer2 = setTimeout(f, timeout2));
|
|
63
87
|
return progress.race(promise).finally(() => clearTimeout(timer2));
|
|
64
|
-
}
|
|
88
|
+
},
|
|
89
|
+
signal: this._controller.signal
|
|
65
90
|
};
|
|
66
|
-
|
|
67
|
-
if (timeout) {
|
|
91
|
+
if (deadline) {
|
|
68
92
|
const timeoutError = new import_errors.TimeoutError(`Timeout ${timeout}ms exceeded.`);
|
|
69
93
|
timer = setTimeout(() => {
|
|
94
|
+
if (this.metadata.pauseStartTime && !this.metadata.pauseEndTime)
|
|
95
|
+
return;
|
|
70
96
|
if (this._state === "running") {
|
|
71
|
-
timeoutError[kAbortErrorSymbol] = true;
|
|
72
97
|
this._state = { error: timeoutError };
|
|
73
98
|
this._forceAbortPromise.reject(timeoutError);
|
|
99
|
+
this._controller.abort(timeoutError);
|
|
74
100
|
}
|
|
75
|
-
},
|
|
101
|
+
}, deadline - (0, import_utils.monotonicTime)());
|
|
76
102
|
}
|
|
77
103
|
try {
|
|
78
104
|
const result = await task(progress);
|
|
@@ -89,7 +115,7 @@ class ProgressController {
|
|
|
89
115
|
}
|
|
90
116
|
const kAbortErrorSymbol = Symbol("kAbortError");
|
|
91
117
|
function isAbortError(error) {
|
|
92
|
-
return !!error[kAbortErrorSymbol];
|
|
118
|
+
return error instanceof import_errors.TimeoutError || !!error[kAbortErrorSymbol];
|
|
93
119
|
}
|
|
94
120
|
async function raceUncancellableOperationWithCleanup(progress, run, cleanup) {
|
|
95
121
|
let aborted = false;
|