@smoothdeploy/playwright-core 1.57.1 → 1.58.1-beta-1770452953000
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.
Potentially problematic release.
This version of @smoothdeploy/playwright-core might be problematic. Click here for more details.
- package/ThirdPartyNotices.txt +3223 -308
- package/browsers.json +21 -22
- package/lib/cli/program.js +4 -5
- package/lib/client/api.js +3 -0
- package/lib/client/browser.js +3 -5
- package/lib/client/browserContext.js +35 -0
- package/lib/client/browserType.js +4 -3
- package/lib/client/channelOwner.js +4 -3
- package/lib/client/clientInstrumentation.js +10 -0
- package/lib/client/connection.js +4 -0
- package/lib/client/elementHandle.js +3 -0
- package/lib/client/events.js +3 -0
- package/lib/client/fetch.js +3 -4
- package/lib/client/frame.js +1 -0
- package/lib/client/page.js +28 -1
- package/lib/client/pageAgent.js +64 -0
- package/lib/client/platform.js +3 -0
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/mcpBundle.js +84 -0
- package/lib/mcpBundleImpl/index.js +147 -0
- package/lib/protocol/serializers.js +5 -0
- package/lib/protocol/validator.js +92 -3
- package/lib/remote/playwrightServer.js +1 -2
- package/lib/server/agent/actionRunner.js +335 -0
- package/lib/server/agent/actions.js +128 -0
- package/lib/server/agent/codegen.js +111 -0
- package/lib/server/agent/context.js +150 -0
- package/lib/server/agent/expectTools.js +156 -0
- package/lib/server/agent/pageAgent.js +204 -0
- package/lib/server/agent/performTools.js +262 -0
- package/lib/server/agent/tool.js +109 -0
- package/lib/server/artifact.js +1 -1
- package/lib/server/bidi/bidiBrowser.js +56 -12
- package/lib/server/bidi/bidiChromium.js +6 -11
- 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 +1 -1
- package/lib/server/bidi/bidiPage.js +39 -28
- package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
- package/lib/server/browserContext.js +32 -25
- package/lib/server/browserType.js +12 -4
- package/lib/server/chromium/chromium.js +14 -21
- package/lib/server/chromium/chromiumSwitches.js +2 -2
- package/lib/server/chromium/crBrowser.js +22 -12
- package/lib/server/chromium/crConnection.js +0 -5
- package/lib/server/chromium/crDevTools.js +0 -2
- package/lib/server/chromium/crNetworkManager.js +43 -2
- package/lib/server/chromium/crPage.js +19 -87
- package/lib/server/codegen/javascript.js +6 -29
- package/lib/server/deviceDescriptorsSource.json +56 -56
- package/lib/server/dispatchers/browserContextDispatcher.js +3 -0
- package/lib/server/dispatchers/dispatcher.js +6 -13
- package/lib/server/dispatchers/frameDispatcher.js +1 -1
- package/lib/server/dispatchers/pageAgentDispatcher.js +96 -0
- package/lib/server/dispatchers/pageDispatcher.js +4 -0
- package/lib/server/dom.js +12 -3
- package/lib/server/electron/electron.js +5 -2
- package/lib/server/firefox/ffBrowser.js +10 -20
- package/lib/server/firefox/ffConnection.js +0 -5
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +15 -18
- package/lib/server/firefox/firefox.js +6 -8
- package/lib/server/frameSelectors.js +9 -3
- package/lib/server/frames.js +49 -33
- package/lib/server/instrumentation.js +3 -0
- package/lib/server/network.js +50 -12
- package/lib/server/page.js +33 -89
- package/lib/server/progress.js +26 -6
- package/lib/server/recorder/recorderApp.js +79 -100
- package/lib/server/recorder.js +55 -0
- package/lib/server/registry/browserFetcher.js +6 -4
- package/lib/server/registry/index.js +172 -149
- package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
- package/lib/server/screencast.js +190 -0
- package/lib/server/screenshotCompositor.js +153 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
- package/lib/server/trace/recorder/tracing.js +21 -21
- package/lib/server/trace/viewer/traceParser.js +72 -0
- package/lib/server/trace/viewer/traceViewer.js +17 -13
- package/lib/server/utils/expectUtils.js +87 -2
- package/lib/server/utils/httpServer.js +4 -19
- package/lib/server/utils/network.js +37 -28
- package/lib/server/utils/nodePlatform.js +6 -0
- package/lib/server/videoRecorder.js +124 -0
- package/lib/server/webkit/webkit.js +4 -6
- package/lib/server/webkit/wkBrowser.js +2 -6
- package/lib/server/webkit/wkConnection.js +1 -6
- package/lib/server/webkit/wkInterceptableRequest.js +29 -1
- package/lib/server/webkit/wkPage.js +75 -46
- package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
- package/lib/utils/isomorphic/lruCache.js +51 -0
- package/lib/utils/isomorphic/protocolMetainfo.js +9 -1
- package/lib/utils/isomorphic/stringUtils.js +49 -0
- package/lib/utils/isomorphic/trace/entries.js +16 -0
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -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 +131 -0
- package/lib/utils/isomorphic/trace/traceModel.js +365 -0
- package/lib/utils/isomorphic/trace/traceModernizer.js +400 -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/yaml.js +84 -0
- package/lib/utils.js +2 -0
- package/lib/utilsBundle.js +2 -5
- package/lib/utilsBundleImpl/index.js +165 -165
- package/lib/vite/htmlReport/index.html +21 -21
- package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
- package/lib/vite/recorder/assets/codeMirrorModule-DadYNm1I.js +32 -0
- package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
- package/lib/vite/recorder/assets/index-BhTWtUlo.js +193 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-8UJPCtp4.js +16884 -0
- package/lib/vite/{recorder/assets/codeMirrorModule-BoWUGj0J.js → traceViewer/assets/codeMirrorModule-BNr6yhVP.js} +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-Dimjuz94.js +32 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DkmsYcws.js +32 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DySgctgr.js +16884 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-B1vuWQsF.js +266 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-CtEsdeVH.js +266 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-D4fm31R-.js +34087 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-JtyB0yzL.js +34087 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-tEZf-LNj.js +266 -0
- package/lib/vite/traceViewer/assets/xtermModule-DDw6eROI.js +6168 -0
- package/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -0
- package/lib/vite/traceViewer/codeMirrorModule.DuST8d_k.css +344 -0
- package/lib/vite/traceViewer/defaultSettingsView.5FCqBwKs.css +3986 -0
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -0
- package/lib/vite/traceViewer/index.BQs8gGhY.js +249 -0
- package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
- package/lib/vite/traceViewer/index.BoLn624r.js +2 -0
- package/lib/vite/traceViewer/index.Bq_EaK8x.js +249 -0
- package/lib/vite/traceViewer/index.C8YVh4B5.js +2 -0
- package/lib/vite/traceViewer/index.Cr7-GRf8.js +2 -0
- package/lib/vite/traceViewer/index.G-7UhDxt.css +164 -0
- package/lib/vite/traceViewer/index.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +5 -3
- package/lib/vite/traceViewer/uiMode.-Kflt2XM.css +1440 -0
- package/lib/vite/traceViewer/uiMode.BTRKnokb.js +5 -0
- package/lib/vite/traceViewer/uiMode.CEZ5RVHh.js +5 -0
- package/lib/vite/traceViewer/uiMode.CIWF23si.js +1829 -0
- package/lib/vite/traceViewer/uiMode.Wi-DvIEY.js +1829 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/vite/traceViewer/uiMode.zEH1ejvz.js +5 -0
- package/lib/vite/traceViewer/xtermModule.BKlWQB97.css +218 -0
- package/package.json +3 -1
- package/types/protocol.d.ts +738 -159
- package/types/types.d.ts +25 -38
- package/lib/vite/recorder/assets/index-DJqDAOZp.js +0 -193
package/lib/server/network.js
CHANGED
|
@@ -22,6 +22,7 @@ __export(network_exports, {
|
|
|
22
22
|
Response: () => Response,
|
|
23
23
|
Route: () => Route,
|
|
24
24
|
WebSocket: () => WebSocket,
|
|
25
|
+
applyHeadersOverrides: () => applyHeadersOverrides,
|
|
25
26
|
filterCookies: () => filterCookies,
|
|
26
27
|
isLocalHostname: () => isLocalHostname,
|
|
27
28
|
kMaxCookieExpiresDateInSeconds: () => kMaxCookieExpiresDateInSeconds,
|
|
@@ -61,6 +62,48 @@ function filterCookies(cookies, urls) {
|
|
|
61
62
|
function isLocalHostname(hostname) {
|
|
62
63
|
return hostname === "localhost" || hostname.endsWith(".localhost");
|
|
63
64
|
}
|
|
65
|
+
const FORBIDDEN_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
66
|
+
"accept-charset",
|
|
67
|
+
"accept-encoding",
|
|
68
|
+
"access-control-request-headers",
|
|
69
|
+
"access-control-request-method",
|
|
70
|
+
"connection",
|
|
71
|
+
"content-length",
|
|
72
|
+
"cookie",
|
|
73
|
+
"date",
|
|
74
|
+
"dnt",
|
|
75
|
+
"expect",
|
|
76
|
+
"host",
|
|
77
|
+
"keep-alive",
|
|
78
|
+
"origin",
|
|
79
|
+
"referer",
|
|
80
|
+
"set-cookie",
|
|
81
|
+
"te",
|
|
82
|
+
"trailer",
|
|
83
|
+
"transfer-encoding",
|
|
84
|
+
"upgrade",
|
|
85
|
+
"via"
|
|
86
|
+
]);
|
|
87
|
+
const FORBIDDEN_METHODS = /* @__PURE__ */ new Set(["CONNECT", "TRACE", "TRACK"]);
|
|
88
|
+
function isForbiddenHeader(name, value) {
|
|
89
|
+
const lowerName = name.toLowerCase();
|
|
90
|
+
if (FORBIDDEN_HEADER_NAMES.has(lowerName))
|
|
91
|
+
return true;
|
|
92
|
+
if (lowerName.startsWith("proxy-"))
|
|
93
|
+
return true;
|
|
94
|
+
if (lowerName.startsWith("sec-"))
|
|
95
|
+
return true;
|
|
96
|
+
if (lowerName === "x-http-method" || lowerName === "x-http-method-override" || lowerName === "x-method-override") {
|
|
97
|
+
if (value && FORBIDDEN_METHODS.has(value.toUpperCase()))
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
function applyHeadersOverrides(original, overrides) {
|
|
103
|
+
const forbiddenHeaders = original.filter((header) => isForbiddenHeader(header.name, header.value));
|
|
104
|
+
const allowedHeaders = overrides.filter((header) => !isForbiddenHeader(header.name, header.value));
|
|
105
|
+
return mergeHeaders([allowedHeaders, forbiddenHeaders]);
|
|
106
|
+
}
|
|
64
107
|
const kMaxCookieExpiresDateInSeconds = 253402300799;
|
|
65
108
|
function rewriteCookies(cookies) {
|
|
66
109
|
return cookies.map((c) => {
|
|
@@ -99,7 +142,6 @@ class Request extends import_instrumentation.SdkObject {
|
|
|
99
142
|
this._response = null;
|
|
100
143
|
this._redirectedTo = null;
|
|
101
144
|
this._failureText = null;
|
|
102
|
-
this._headersMap = /* @__PURE__ */ new Map();
|
|
103
145
|
this._frame = null;
|
|
104
146
|
this._serviceWorker = null;
|
|
105
147
|
this._rawRequestHeadersPromise = new import_manualPromise.ManualPromise();
|
|
@@ -118,7 +160,6 @@ class Request extends import_instrumentation.SdkObject {
|
|
|
118
160
|
this._method = method;
|
|
119
161
|
this._postData = postData;
|
|
120
162
|
this._headers = headers;
|
|
121
|
-
this._updateHeadersMap();
|
|
122
163
|
this._isFavicon = url.endsWith("/favicon.ico") || !!redirectedFrom?._isFavicon;
|
|
123
164
|
}
|
|
124
165
|
static {
|
|
@@ -132,13 +173,8 @@ class Request extends import_instrumentation.SdkObject {
|
|
|
132
173
|
}
|
|
133
174
|
_applyOverrides(overrides) {
|
|
134
175
|
this._overrides = { ...this._overrides, ...overrides };
|
|
135
|
-
this._updateHeadersMap();
|
|
136
176
|
return this._overrides;
|
|
137
177
|
}
|
|
138
|
-
_updateHeadersMap() {
|
|
139
|
-
for (const { name, value } of this.headers())
|
|
140
|
-
this._headersMap.set(name.toLowerCase(), value);
|
|
141
|
-
}
|
|
142
178
|
overrides() {
|
|
143
179
|
return this._overrides;
|
|
144
180
|
}
|
|
@@ -158,7 +194,8 @@ class Request extends import_instrumentation.SdkObject {
|
|
|
158
194
|
return this._overrides?.headers || this._headers;
|
|
159
195
|
}
|
|
160
196
|
headerValue(name) {
|
|
161
|
-
|
|
197
|
+
const lowerCaseName = name.toLowerCase();
|
|
198
|
+
return this.headers().find((h) => h.name.toLowerCase() === lowerCaseName)?.value;
|
|
162
199
|
}
|
|
163
200
|
// "null" means no raw headers available - we'll use provisional headers as raw headers.
|
|
164
201
|
setRawRequestHeaders(headers) {
|
|
@@ -309,10 +346,7 @@ class Route extends import_instrumentation.SdkObject {
|
|
|
309
346
|
throw new Error("New URL must have same protocol as overridden URL");
|
|
310
347
|
}
|
|
311
348
|
if (overrides.headers) {
|
|
312
|
-
overrides.headers = overrides.headers
|
|
313
|
-
const headerName = header.name.toLowerCase();
|
|
314
|
-
return headerName !== "cookie" && headerName !== "host";
|
|
315
|
-
});
|
|
349
|
+
overrides.headers = applyHeadersOverrides(this._request._headers, overrides.headers);
|
|
316
350
|
}
|
|
317
351
|
overrides = this._request._applyOverrides(overrides);
|
|
318
352
|
const nextHandler = this._futureHandlers.shift();
|
|
@@ -436,6 +470,9 @@ class Response extends import_instrumentation.SdkObject {
|
|
|
436
470
|
request() {
|
|
437
471
|
return this._request;
|
|
438
472
|
}
|
|
473
|
+
finished() {
|
|
474
|
+
return this._finishedPromise;
|
|
475
|
+
}
|
|
439
476
|
frame() {
|
|
440
477
|
return this._request.frame();
|
|
441
478
|
}
|
|
@@ -617,6 +654,7 @@ function mergeHeaders(headers) {
|
|
|
617
654
|
Response,
|
|
618
655
|
Route,
|
|
619
656
|
WebSocket,
|
|
657
|
+
applyHeadersOverrides,
|
|
620
658
|
filterCookies,
|
|
621
659
|
isLocalHostname,
|
|
622
660
|
kMaxCookieExpiresDateInSeconds,
|
package/lib/server/page.js
CHANGED
|
@@ -31,7 +31,8 @@ __export(page_exports, {
|
|
|
31
31
|
InitScript: () => InitScript,
|
|
32
32
|
Page: () => Page,
|
|
33
33
|
PageBinding: () => PageBinding,
|
|
34
|
-
Worker: () => Worker
|
|
34
|
+
Worker: () => Worker,
|
|
35
|
+
WorkerEvent: () => WorkerEvent
|
|
35
36
|
});
|
|
36
37
|
module.exports = __toCommonJS(page_exports);
|
|
37
38
|
var import_browserContext = require("./browserContext");
|
|
@@ -53,6 +54,22 @@ var import_manualPromise = require("../utils/isomorphic/manualPromise");
|
|
|
53
54
|
var import_utilityScriptSerializers = require("../utils/isomorphic/utilityScriptSerializers");
|
|
54
55
|
var import_callLog = require("./callLog");
|
|
55
56
|
var rawBindingsControllerSource = __toESM(require("../generated/bindingsControllerSource"));
|
|
57
|
+
var import_screencast = require("./screencast");
|
|
58
|
+
const PageEvent = {
|
|
59
|
+
Close: "close",
|
|
60
|
+
Crash: "crash",
|
|
61
|
+
Download: "download",
|
|
62
|
+
EmulatedSizeChanged: "emulatedsizechanged",
|
|
63
|
+
FileChooser: "filechooser",
|
|
64
|
+
FrameAttached: "frameattached",
|
|
65
|
+
FrameDetached: "framedetached",
|
|
66
|
+
InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument",
|
|
67
|
+
LocatorHandlerTriggered: "locatorhandlertriggered",
|
|
68
|
+
ScreencastFrame: "screencastframe",
|
|
69
|
+
Video: "video",
|
|
70
|
+
WebSocket: "websocket",
|
|
71
|
+
Worker: "worker"
|
|
72
|
+
};
|
|
56
73
|
class Page extends import_instrumentation.SdkObject {
|
|
57
74
|
constructor(delegate, browserContext) {
|
|
58
75
|
super(browserContext, "page");
|
|
@@ -74,9 +91,6 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
74
91
|
this._lastLocatorHandlerUid = 0;
|
|
75
92
|
this._locatorHandlerRunningCounter = 0;
|
|
76
93
|
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
94
|
this.attribution.page = this;
|
|
81
95
|
this.delegate = delegate;
|
|
82
96
|
this.browserContext = browserContext;
|
|
@@ -85,27 +99,14 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
85
99
|
this.touchscreen = new input.Touchscreen(delegate.rawTouchscreen, this);
|
|
86
100
|
this.screenshotter = new import_screenshotter.Screenshotter(this);
|
|
87
101
|
this.frameManager = new frames.FrameManager(this);
|
|
102
|
+
this.screencast = new import_screencast.Screencast(this);
|
|
88
103
|
if (delegate.pdf)
|
|
89
104
|
this.pdf = delegate.pdf.bind(delegate);
|
|
90
105
|
this.coverage = delegate.coverage ? delegate.coverage() : null;
|
|
91
106
|
this.isStorageStatePage = browserContext.isCreatingStorageStatePage();
|
|
92
107
|
}
|
|
93
108
|
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
|
-
};
|
|
109
|
+
this.Events = PageEvent;
|
|
109
110
|
}
|
|
110
111
|
async reportAsNew(opener, error) {
|
|
111
112
|
if (opener) {
|
|
@@ -158,17 +159,17 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
158
159
|
}
|
|
159
160
|
_didClose() {
|
|
160
161
|
this.frameManager.dispose();
|
|
161
|
-
this.
|
|
162
|
+
this.screencast.stopFrameThrottler();
|
|
162
163
|
(0, import_utils.assert)(this._closedState !== "closed", "Page closed twice");
|
|
163
164
|
this._closedState = "closed";
|
|
164
165
|
this.emit(Page.Events.Close);
|
|
165
166
|
this._closedPromise.resolve();
|
|
166
167
|
this.instrumentation.onPageClose(this);
|
|
167
|
-
this.openScope.close(new import_errors.TargetClosedError());
|
|
168
|
+
this.openScope.close(new import_errors.TargetClosedError(this.closeReason()));
|
|
168
169
|
}
|
|
169
170
|
_didCrash() {
|
|
170
171
|
this.frameManager.dispose();
|
|
171
|
-
this.
|
|
172
|
+
this.screencast.stopFrameThrottler();
|
|
172
173
|
this.emit(Page.Events.Crash);
|
|
173
174
|
this._crashed = true;
|
|
174
175
|
this.instrumentation.onPageClose(this);
|
|
@@ -578,7 +579,7 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
578
579
|
if (this._closedState === "closed")
|
|
579
580
|
return;
|
|
580
581
|
if (options.reason)
|
|
581
|
-
this.
|
|
582
|
+
this._closeReason = options.reason;
|
|
582
583
|
const runBeforeUnload = !!options.runBeforeUnload;
|
|
583
584
|
if (this._closedState !== "closing") {
|
|
584
585
|
if (!runBeforeUnload)
|
|
@@ -641,16 +642,6 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
641
642
|
getBinding(name) {
|
|
642
643
|
return this._pageBindings.get(name) || this.browserContext._pageBindings.get(name);
|
|
643
644
|
}
|
|
644
|
-
setScreencastOptions(options) {
|
|
645
|
-
this.delegate.setScreencastOptions(options).catch((e) => import_debugLogger.debugLogger.log("error", e));
|
|
646
|
-
this._frameThrottler.setThrottlingEnabled(!!options);
|
|
647
|
-
}
|
|
648
|
-
throttleScreencastFrameAck(ack) {
|
|
649
|
-
this._frameThrottler.ack(ack);
|
|
650
|
-
}
|
|
651
|
-
temporarilyDisableTracingScreencastThrottling() {
|
|
652
|
-
this._frameThrottler.recharge();
|
|
653
|
-
}
|
|
654
645
|
async safeNonStallingEvaluateInAllFrames(expression, world, options = {}) {
|
|
655
646
|
await Promise.all(this.frames().map(async (frame) => {
|
|
656
647
|
try {
|
|
@@ -665,11 +656,14 @@ class Page extends import_instrumentation.SdkObject {
|
|
|
665
656
|
await Promise.all(this.frames().map((frame) => frame.hideHighlight().catch(() => {
|
|
666
657
|
})));
|
|
667
658
|
}
|
|
668
|
-
async snapshotForAI(progress, options) {
|
|
659
|
+
async snapshotForAI(progress, options = {}) {
|
|
669
660
|
const snapshot = await snapshotFrameForAI(progress, this.mainFrame(), options);
|
|
670
661
|
return { full: snapshot.full.join("\n"), incremental: snapshot.incremental?.join("\n") };
|
|
671
662
|
}
|
|
672
663
|
}
|
|
664
|
+
const WorkerEvent = {
|
|
665
|
+
Close: "close"
|
|
666
|
+
};
|
|
673
667
|
class Worker extends import_instrumentation.SdkObject {
|
|
674
668
|
constructor(parent, url) {
|
|
675
669
|
super(parent, "worker");
|
|
@@ -680,9 +674,7 @@ class Worker extends import_instrumentation.SdkObject {
|
|
|
680
674
|
this.url = url;
|
|
681
675
|
}
|
|
682
676
|
static {
|
|
683
|
-
this.Events =
|
|
684
|
-
Close: "close"
|
|
685
|
-
};
|
|
677
|
+
this.Events = WorkerEvent;
|
|
686
678
|
}
|
|
687
679
|
createExecutionContext(delegate) {
|
|
688
680
|
this.existingExecutionContext = new js.ExecutionContext(this, delegate, "worker");
|
|
@@ -763,56 +755,7 @@ class InitScript {
|
|
|
763
755
|
})();`;
|
|
764
756
|
}
|
|
765
757
|
}
|
|
766
|
-
|
|
767
|
-
constructor(nonThrottledFrames, defaultInterval, throttlingInterval) {
|
|
768
|
-
this._acks = [];
|
|
769
|
-
this._throttlingEnabled = false;
|
|
770
|
-
this._nonThrottledFrames = nonThrottledFrames;
|
|
771
|
-
this._budget = nonThrottledFrames;
|
|
772
|
-
this._defaultInterval = defaultInterval;
|
|
773
|
-
this._throttlingInterval = throttlingInterval;
|
|
774
|
-
this._tick();
|
|
775
|
-
}
|
|
776
|
-
dispose() {
|
|
777
|
-
if (this._timeoutId) {
|
|
778
|
-
clearTimeout(this._timeoutId);
|
|
779
|
-
this._timeoutId = void 0;
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
setThrottlingEnabled(enabled) {
|
|
783
|
-
this._throttlingEnabled = enabled;
|
|
784
|
-
}
|
|
785
|
-
recharge() {
|
|
786
|
-
for (const ack of this._acks)
|
|
787
|
-
ack();
|
|
788
|
-
this._acks = [];
|
|
789
|
-
this._budget = this._nonThrottledFrames;
|
|
790
|
-
if (this._timeoutId) {
|
|
791
|
-
clearTimeout(this._timeoutId);
|
|
792
|
-
this._tick();
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
ack(ack) {
|
|
796
|
-
if (!this._timeoutId) {
|
|
797
|
-
ack();
|
|
798
|
-
return;
|
|
799
|
-
}
|
|
800
|
-
this._acks.push(ack);
|
|
801
|
-
}
|
|
802
|
-
_tick() {
|
|
803
|
-
const ack = this._acks.shift();
|
|
804
|
-
if (ack) {
|
|
805
|
-
--this._budget;
|
|
806
|
-
ack();
|
|
807
|
-
}
|
|
808
|
-
if (this._throttlingEnabled && this._budget <= 0) {
|
|
809
|
-
this._timeoutId = setTimeout(() => this._tick(), this._throttlingInterval);
|
|
810
|
-
} else {
|
|
811
|
-
this._timeoutId = setTimeout(() => this._tick(), this._defaultInterval);
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
async function snapshotFrameForAI(progress, frame, options) {
|
|
758
|
+
async function snapshotFrameForAI(progress, frame, options = {}) {
|
|
816
759
|
const snapshot = await frame.retryWithProgressAndTimeouts(progress, [1e3, 2e3, 4e3, 8e3], async (continuePolling) => {
|
|
817
760
|
try {
|
|
818
761
|
const context = await progress.race(frame._utilityContext());
|
|
@@ -822,7 +765,7 @@ async function snapshotFrameForAI(progress, frame, options) {
|
|
|
822
765
|
if (!node)
|
|
823
766
|
return true;
|
|
824
767
|
return injected.incrementalAriaSnapshot(node, { mode: "ai", ...options2 });
|
|
825
|
-
}, { refPrefix: frame.seq ? "f" + frame.seq : "", track: options.track }));
|
|
768
|
+
}, { refPrefix: frame.seq ? "f" + frame.seq : "", track: options.track, doNotRenderActive: options.doNotRenderActive }));
|
|
826
769
|
if (snapshotOrRetry === true)
|
|
827
770
|
return continuePolling;
|
|
828
771
|
return snapshotOrRetry;
|
|
@@ -882,5 +825,6 @@ function ensureArrayLimit(array, limit) {
|
|
|
882
825
|
InitScript,
|
|
883
826
|
Page,
|
|
884
827
|
PageBinding,
|
|
885
|
-
Worker
|
|
828
|
+
Worker,
|
|
829
|
+
WorkerEvent
|
|
886
830
|
});
|
package/lib/server/progress.js
CHANGED
|
@@ -34,19 +34,35 @@ 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
|
+
import_utils.debugLogger.log(logName, message);
|
|
43
|
+
sdkObject.instrumentation.onCallLog(sdkObject, callMetadata, logName, message);
|
|
44
|
+
});
|
|
37
45
|
}
|
|
38
46
|
async abort(error) {
|
|
39
47
|
if (this._state === "running") {
|
|
40
48
|
error[kAbortErrorSymbol] = true;
|
|
41
49
|
this._state = { error };
|
|
42
50
|
this._forceAbortPromise.reject(error);
|
|
51
|
+
this._controller.abort(error);
|
|
43
52
|
}
|
|
44
53
|
await this._donePromise;
|
|
45
54
|
}
|
|
46
55
|
async run(task, timeout) {
|
|
56
|
+
const deadline = timeout ? (0, import_utils.monotonicTime)() + timeout : 0;
|
|
47
57
|
(0, import_utils.assert)(this._state === "before");
|
|
48
58
|
this._state = "running";
|
|
59
|
+
let timer;
|
|
49
60
|
const progress = {
|
|
61
|
+
timeout: timeout ?? 0,
|
|
62
|
+
deadline,
|
|
63
|
+
disableTimeout: () => {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
},
|
|
50
66
|
log: (message) => {
|
|
51
67
|
if (this._state === "running")
|
|
52
68
|
this.metadata.log.push(message);
|
|
@@ -55,24 +71,28 @@ class ProgressController {
|
|
|
55
71
|
metadata: this.metadata,
|
|
56
72
|
race: (promise) => {
|
|
57
73
|
const promises = Array.isArray(promise) ? promise : [promise];
|
|
74
|
+
if (!promises.length)
|
|
75
|
+
return Promise.resolve();
|
|
58
76
|
return Promise.race([...promises, this._forceAbortPromise]);
|
|
59
77
|
},
|
|
60
78
|
wait: async (timeout2) => {
|
|
61
79
|
let timer2;
|
|
62
80
|
const promise = new Promise((f) => timer2 = setTimeout(f, timeout2));
|
|
63
81
|
return progress.race(promise).finally(() => clearTimeout(timer2));
|
|
64
|
-
}
|
|
82
|
+
},
|
|
83
|
+
signal: this._controller.signal
|
|
65
84
|
};
|
|
66
|
-
|
|
67
|
-
if (timeout) {
|
|
85
|
+
if (deadline) {
|
|
68
86
|
const timeoutError = new import_errors.TimeoutError(`Timeout ${timeout}ms exceeded.`);
|
|
69
87
|
timer = setTimeout(() => {
|
|
88
|
+
if (this.metadata.pauseStartTime && !this.metadata.pauseEndTime)
|
|
89
|
+
return;
|
|
70
90
|
if (this._state === "running") {
|
|
71
|
-
timeoutError[kAbortErrorSymbol] = true;
|
|
72
91
|
this._state = { error: timeoutError };
|
|
73
92
|
this._forceAbortPromise.reject(timeoutError);
|
|
93
|
+
this._controller.abort(timeoutError);
|
|
74
94
|
}
|
|
75
|
-
},
|
|
95
|
+
}, deadline - (0, import_utils.monotonicTime)());
|
|
76
96
|
}
|
|
77
97
|
try {
|
|
78
98
|
const result = await task(progress);
|
|
@@ -89,7 +109,7 @@ class ProgressController {
|
|
|
89
109
|
}
|
|
90
110
|
const kAbortErrorSymbol = Symbol("kAbortError");
|
|
91
111
|
function isAbortError(error) {
|
|
92
|
-
return !!error[kAbortErrorSymbol];
|
|
112
|
+
return error instanceof import_errors.TimeoutError || !!error[kAbortErrorSymbol];
|
|
93
113
|
}
|
|
94
114
|
async function raceUncancellableOperationWithCleanup(progress, run, cleanup) {
|
|
95
115
|
let aborted = false;
|
|
@@ -53,6 +53,7 @@ class RecorderApp {
|
|
|
53
53
|
this._recorderSources = [];
|
|
54
54
|
this._page = page;
|
|
55
55
|
this._recorder = recorder;
|
|
56
|
+
this._frontend = createRecorderFrontend(page);
|
|
56
57
|
this.wsEndpointForTest = wsEndpointForTest;
|
|
57
58
|
this._languageGeneratorOptions = {
|
|
58
59
|
browserName: params.browserName,
|
|
@@ -64,6 +65,10 @@ class RecorderApp {
|
|
|
64
65
|
this._throttledOutputFile = params.outputFile ? new import_throttledFile.ThrottledFile(params.outputFile) : null;
|
|
65
66
|
this._primaryGeneratorId = process.env.TEST_INSPECTOR_LANGUAGE || params.language || determinePrimaryGeneratorId(params.sdkLanguage);
|
|
66
67
|
this._selectedGeneratorId = this._primaryGeneratorId;
|
|
68
|
+
for (const languageGenerator of (0, import_languages.languageSet)()) {
|
|
69
|
+
if (languageGenerator.id === this._primaryGeneratorId)
|
|
70
|
+
this._recorder.setLanguage(languageGenerator.highlighter);
|
|
71
|
+
}
|
|
67
72
|
}
|
|
68
73
|
async _init(inspectedContext) {
|
|
69
74
|
await (0, import_launchApp.syncLocalStorageWithSettings)(this._page, "recorder");
|
|
@@ -89,7 +94,7 @@ class RecorderApp {
|
|
|
89
94
|
});
|
|
90
95
|
});
|
|
91
96
|
});
|
|
92
|
-
await this.
|
|
97
|
+
await this._createDispatcher(progress);
|
|
93
98
|
this._page.once("close", () => {
|
|
94
99
|
this._recorder.close();
|
|
95
100
|
this._page.browserContext.close({ reason: "Recorder window closed" }).catch(() => {
|
|
@@ -100,59 +105,56 @@ class RecorderApp {
|
|
|
100
105
|
});
|
|
101
106
|
const url = this._recorder.url();
|
|
102
107
|
if (url)
|
|
103
|
-
this.
|
|
104
|
-
this.
|
|
105
|
-
this.
|
|
108
|
+
this._frontend.pageNavigated({ url });
|
|
109
|
+
this._frontend.modeChanged({ mode: this._recorder.mode() });
|
|
110
|
+
this._frontend.pauseStateChanged({ paused: this._recorder.paused() });
|
|
106
111
|
this._updateActions("reveal");
|
|
107
112
|
this._onUserSourcesChanged(this._recorder.userSources(), this._recorder.pausedSourceId());
|
|
108
|
-
this.
|
|
113
|
+
this._frontend.callLogsUpdated({ callLogs: this._recorder.callLog() });
|
|
109
114
|
this._wireListeners(this._recorder);
|
|
110
115
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
116
|
+
async _createDispatcher(progress) {
|
|
117
|
+
const dispatcher = {
|
|
118
|
+
clear: async () => {
|
|
119
|
+
this._actions = [];
|
|
120
|
+
this._updateActions("reveal");
|
|
121
|
+
this._recorder.clear();
|
|
122
|
+
},
|
|
123
|
+
fileChanged: async (params) => {
|
|
124
|
+
const source = [...this._recorderSources, ...this._userSources].find((s) => s.id === params.fileId);
|
|
125
|
+
if (source) {
|
|
126
|
+
if (source.isRecorded)
|
|
127
|
+
this._selectedGeneratorId = source.id;
|
|
128
|
+
this._recorder.setLanguage(source.language);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
setAutoExpect: async (params) => {
|
|
132
|
+
this._languageGeneratorOptions.generateAutoExpect = params.autoExpect;
|
|
133
|
+
this._updateActions();
|
|
134
|
+
},
|
|
135
|
+
setMode: async (params) => {
|
|
136
|
+
this._recorder.setMode(params.mode);
|
|
137
|
+
},
|
|
138
|
+
resume: async () => {
|
|
139
|
+
this._recorder.resume();
|
|
140
|
+
},
|
|
141
|
+
pause: async () => {
|
|
142
|
+
this._recorder.pause();
|
|
143
|
+
},
|
|
144
|
+
step: async () => {
|
|
145
|
+
this._recorder.step();
|
|
146
|
+
},
|
|
147
|
+
highlightRequested: async (params) => {
|
|
148
|
+
if (params.selector)
|
|
149
|
+
this._recorder.setHighlightedSelector(params.selector);
|
|
150
|
+
if (params.ariaTemplate)
|
|
151
|
+
this._recorder.setHighlightedAriaTemplate(params.ariaTemplate);
|
|
124
152
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
if (data.event === "setMode") {
|
|
133
|
-
this._recorder.setMode(data.params.mode);
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
if (data.event === "resume") {
|
|
137
|
-
this._recorder.resume();
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
if (data.event === "pause") {
|
|
141
|
-
this._recorder.pause();
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
if (data.event === "step") {
|
|
145
|
-
this._recorder.step();
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (data.event === "highlightRequested") {
|
|
149
|
-
if (data.params.selector)
|
|
150
|
-
this._recorder.setHighlightedSelector(data.params.selector);
|
|
151
|
-
if (data.params.ariaTemplate)
|
|
152
|
-
this._recorder.setHighlightedAriaTemplate(data.params.ariaTemplate);
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
throw new Error(`Unknown event: ${data.event}`);
|
|
153
|
+
};
|
|
154
|
+
await this._page.exposeBinding(progress, "sendCommand", false, async (_, data) => {
|
|
155
|
+
const { method, params } = data;
|
|
156
|
+
return await dispatcher[method].call(dispatcher, params);
|
|
157
|
+
});
|
|
156
158
|
}
|
|
157
159
|
static async show(context, params) {
|
|
158
160
|
if (process.env.PW_CODEGEN_NO_INSPECTOR)
|
|
@@ -220,25 +222,29 @@ class RecorderApp {
|
|
|
220
222
|
this._onSignalAdded(signal);
|
|
221
223
|
});
|
|
222
224
|
recorder.on(import_recorder.RecorderEvent.PageNavigated, (url) => {
|
|
223
|
-
this.
|
|
225
|
+
this._frontend.pageNavigated({ url });
|
|
224
226
|
});
|
|
225
227
|
recorder.on(import_recorder.RecorderEvent.ContextClosed, () => {
|
|
226
|
-
this.
|
|
228
|
+
this._throttledOutputFile?.flush();
|
|
229
|
+
this._page.browserContext.close({ reason: "Recorder window closed" }).catch(() => {
|
|
230
|
+
});
|
|
227
231
|
});
|
|
228
232
|
recorder.on(import_recorder.RecorderEvent.ModeChanged, (mode) => {
|
|
229
|
-
this.
|
|
233
|
+
this._frontend.modeChanged({ mode });
|
|
230
234
|
});
|
|
231
235
|
recorder.on(import_recorder.RecorderEvent.PausedStateChanged, (paused) => {
|
|
232
|
-
this.
|
|
236
|
+
this._frontend.pauseStateChanged({ paused });
|
|
233
237
|
});
|
|
234
238
|
recorder.on(import_recorder.RecorderEvent.UserSourcesChanged, (sources, pausedSourceId) => {
|
|
235
239
|
this._onUserSourcesChanged(sources, pausedSourceId);
|
|
236
240
|
});
|
|
237
241
|
recorder.on(import_recorder.RecorderEvent.ElementPicked, (elementInfo, userGesture) => {
|
|
238
|
-
|
|
242
|
+
if (userGesture)
|
|
243
|
+
this._page.bringToFront();
|
|
244
|
+
this._frontend.elementPicked({ elementInfo, userGesture });
|
|
239
245
|
});
|
|
240
246
|
recorder.on(import_recorder.RecorderEvent.CallLogsUpdated, (callLogs) => {
|
|
241
|
-
this.
|
|
247
|
+
this._frontend.callLogsUpdated({ callLogs });
|
|
242
248
|
});
|
|
243
249
|
}
|
|
244
250
|
_onActionAdded(action) {
|
|
@@ -251,29 +257,6 @@ class RecorderApp {
|
|
|
251
257
|
lastAction.action.signals.push(signal.signal);
|
|
252
258
|
this._updateActions();
|
|
253
259
|
}
|
|
254
|
-
_onPageNavigated(url) {
|
|
255
|
-
this._page.mainFrame().evaluateExpression((({ url: url2 }) => {
|
|
256
|
-
window.playwrightSetPageURL(url2);
|
|
257
|
-
}).toString(), { isFunction: true }, { url }).catch(() => {
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
_onContextClosed() {
|
|
261
|
-
this._throttledOutputFile?.flush();
|
|
262
|
-
this._page.browserContext.close({ reason: "Recorder window closed" }).catch(() => {
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
_onModeChanged(mode) {
|
|
266
|
-
this._page.mainFrame().evaluateExpression(((mode2) => {
|
|
267
|
-
window.playwrightSetMode(mode2);
|
|
268
|
-
}).toString(), { isFunction: true }, mode).catch(() => {
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
_onPausedStateChanged(paused) {
|
|
272
|
-
this._page.mainFrame().evaluateExpression(((paused2) => {
|
|
273
|
-
window.playwrightSetPaused(paused2);
|
|
274
|
-
}).toString(), { isFunction: true }, paused).catch(() => {
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
260
|
_onUserSourcesChanged(sources, pausedSourceId) {
|
|
278
261
|
if (!sources.length && !this._userSources.length)
|
|
279
262
|
return;
|
|
@@ -281,34 +264,14 @@ class RecorderApp {
|
|
|
281
264
|
this._pushAllSources();
|
|
282
265
|
this._revealSource(pausedSourceId);
|
|
283
266
|
}
|
|
284
|
-
_onElementPicked(elementInfo, userGesture) {
|
|
285
|
-
if (userGesture)
|
|
286
|
-
this._page.bringToFront();
|
|
287
|
-
this._page.mainFrame().evaluateExpression(((param) => {
|
|
288
|
-
window.playwrightElementPicked(param.elementInfo, param.userGesture);
|
|
289
|
-
}).toString(), { isFunction: true }, { elementInfo, userGesture }).catch(() => {
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
_onCallLogsUpdated(callLogs) {
|
|
293
|
-
this._page.mainFrame().evaluateExpression(((callLogs2) => {
|
|
294
|
-
window.playwrightUpdateLogs(callLogs2);
|
|
295
|
-
}).toString(), { isFunction: true }, callLogs).catch(() => {
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
267
|
_pushAllSources() {
|
|
299
268
|
const sources = [...this._userSources, ...this._recorderSources];
|
|
300
|
-
this.
|
|
301
|
-
window.playwrightSetSources(sources2);
|
|
302
|
-
}).toString(), { isFunction: true }, { sources }).catch(() => {
|
|
303
|
-
});
|
|
269
|
+
this._frontend.sourcesUpdated({ sources });
|
|
304
270
|
}
|
|
305
271
|
_revealSource(sourceId) {
|
|
306
272
|
if (!sourceId)
|
|
307
273
|
return;
|
|
308
|
-
this.
|
|
309
|
-
window.playwrightSelectSource(sourceId2);
|
|
310
|
-
}).toString(), { isFunction: true }, { sourceId }).catch(() => {
|
|
311
|
-
});
|
|
274
|
+
this._frontend.sourceRevealRequested({ sourceId });
|
|
312
275
|
}
|
|
313
276
|
_updateActions(reveal) {
|
|
314
277
|
const recorderSources = [];
|
|
@@ -372,6 +335,8 @@ class ProgrammaticRecorderApp {
|
|
|
372
335
|
});
|
|
373
336
|
recorder.on(import_recorder.RecorderEvent.SignalAdded, (signal) => {
|
|
374
337
|
const page = findPageByGuid(inspectedContext, signal.frame.pageGuid);
|
|
338
|
+
if (!page)
|
|
339
|
+
return;
|
|
375
340
|
inspectedContext.emit(import_browserContext.BrowserContext.Events.RecorderEvent, { event: "signalAdded", data: signal, page, code: "" });
|
|
376
341
|
});
|
|
377
342
|
}
|
|
@@ -379,6 +344,20 @@ class ProgrammaticRecorderApp {
|
|
|
379
344
|
function findPageByGuid(context, guid) {
|
|
380
345
|
return context.pages().find((p) => p.guid === guid);
|
|
381
346
|
}
|
|
347
|
+
function createRecorderFrontend(page) {
|
|
348
|
+
return new Proxy({}, {
|
|
349
|
+
get: (_target, prop) => {
|
|
350
|
+
if (typeof prop !== "string")
|
|
351
|
+
return void 0;
|
|
352
|
+
return (params) => {
|
|
353
|
+
page.mainFrame().evaluateExpression(((event) => {
|
|
354
|
+
window.dispatch(event);
|
|
355
|
+
}).toString(), { isFunction: true }, { method: prop, params }).catch(() => {
|
|
356
|
+
});
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}
|
|
382
361
|
const recorderAppSymbol = Symbol("recorderApp");
|
|
383
362
|
// Annotate the CommonJS export names for ESM import in node:
|
|
384
363
|
0 && (module.exports = {
|