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
|
@@ -37,7 +37,6 @@ var import_artifact = require("../artifact");
|
|
|
37
37
|
var import_harTracer = require("./harTracer");
|
|
38
38
|
var import_crypto = require("../utils/crypto");
|
|
39
39
|
var import_manualPromise = require("../../utils/isomorphic/manualPromise");
|
|
40
|
-
var import_zipBundle = require("../../zipBundle");
|
|
41
40
|
class HarRecorder {
|
|
42
41
|
constructor(context, page, options) {
|
|
43
42
|
this._isFlushed = false;
|
|
@@ -56,7 +55,8 @@ class HarRecorder {
|
|
|
56
55
|
waitForContentOnStop: true,
|
|
57
56
|
urlFilter: urlFilterRe ?? options.urlGlob
|
|
58
57
|
});
|
|
59
|
-
|
|
58
|
+
const { yazl } = require("../../zipBundle");
|
|
59
|
+
this._zipFile = content === "attach" || expectsZip ? new yazl.ZipFile() : null;
|
|
60
60
|
this._tracer.start({ omitScripts: false });
|
|
61
61
|
}
|
|
62
62
|
onEntryStarted(entry) {
|
|
@@ -278,9 +278,6 @@ class HarTracer {
|
|
|
278
278
|
harEntry._securityDetails = details;
|
|
279
279
|
}));
|
|
280
280
|
}
|
|
281
|
-
const httpVersion = response.httpVersion();
|
|
282
|
-
harEntry.request.httpVersion = httpVersion;
|
|
283
|
-
harEntry.response.httpVersion = httpVersion;
|
|
284
281
|
const compressionCalculationBarrier = this._options.omitSizes ? void 0 : {
|
|
285
282
|
_encodedBodySize: -1,
|
|
286
283
|
_decodedBodySize: -1,
|
|
@@ -317,6 +314,10 @@ class HarTracer {
|
|
|
317
314
|
this._delegate.onEntryFinished(harEntry);
|
|
318
315
|
});
|
|
319
316
|
this._addBarrier(page || request.serviceWorker(), promise);
|
|
317
|
+
this._addBarrier(page || request.serviceWorker(), response.httpVersion().then((httpVersion) => {
|
|
318
|
+
harEntry.request.httpVersion = httpVersion;
|
|
319
|
+
harEntry.response.httpVersion = httpVersion;
|
|
320
|
+
}));
|
|
320
321
|
const timing = response.timing();
|
|
321
322
|
harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? import_helper.helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
|
|
322
323
|
this._computeHarEntryTotalTime(harEntry);
|
|
@@ -389,7 +390,7 @@ class HarTracer {
|
|
|
389
390
|
harEntry.response = {
|
|
390
391
|
status: response.status(),
|
|
391
392
|
statusText: response.statusText(),
|
|
392
|
-
httpVersion:
|
|
393
|
+
httpVersion: FALLBACK_HTTP_VERSION,
|
|
393
394
|
// These are bad values that will be overwritten below.
|
|
394
395
|
cookies: [],
|
|
395
396
|
headers: [],
|
package/lib/server/input.js
CHANGED
|
@@ -48,6 +48,10 @@ class Keyboard {
|
|
|
48
48
|
this._raw = raw;
|
|
49
49
|
this._page = page;
|
|
50
50
|
}
|
|
51
|
+
async apiDown(progress, key) {
|
|
52
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
53
|
+
await this.down(progress, key);
|
|
54
|
+
}
|
|
51
55
|
async down(progress, key) {
|
|
52
56
|
const description = this._keyDescriptionForString(key);
|
|
53
57
|
const autoRepeat = this._pressedKeys.has(description.code);
|
|
@@ -67,6 +71,10 @@ class Keyboard {
|
|
|
67
71
|
return { ...description, text: "" };
|
|
68
72
|
return description;
|
|
69
73
|
}
|
|
74
|
+
async apiUp(progress, key) {
|
|
75
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
76
|
+
await this.up(progress, key);
|
|
77
|
+
}
|
|
70
78
|
async up(progress, key) {
|
|
71
79
|
const description = this._keyDescriptionForString(key);
|
|
72
80
|
if (kModifiers.includes(description.key))
|
|
@@ -74,9 +82,17 @@ class Keyboard {
|
|
|
74
82
|
this._pressedKeys.delete(description.code);
|
|
75
83
|
await this._raw.keyup(progress, this._pressedModifiers, key, description);
|
|
76
84
|
}
|
|
77
|
-
async
|
|
85
|
+
async apiInsertText(progress, text) {
|
|
86
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
87
|
+
await this._insertText(progress, text);
|
|
88
|
+
}
|
|
89
|
+
async _insertText(progress, text) {
|
|
78
90
|
await this._raw.sendText(progress, text);
|
|
79
91
|
}
|
|
92
|
+
async apiType(progress, text, options) {
|
|
93
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
94
|
+
await this.type(progress, text, options);
|
|
95
|
+
}
|
|
80
96
|
async type(progress, text, options) {
|
|
81
97
|
const delay = options && options.delay || void 0;
|
|
82
98
|
for (const char of text) {
|
|
@@ -85,10 +101,14 @@ class Keyboard {
|
|
|
85
101
|
} else {
|
|
86
102
|
if (delay)
|
|
87
103
|
await progress.wait(delay);
|
|
88
|
-
await this.
|
|
104
|
+
await this._insertText(progress, char);
|
|
89
105
|
}
|
|
90
106
|
}
|
|
91
107
|
}
|
|
108
|
+
async apiPress(progress, key, options = {}) {
|
|
109
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
110
|
+
await this.press(progress, key, options);
|
|
111
|
+
}
|
|
92
112
|
async press(progress, key, options = {}) {
|
|
93
113
|
function split(keyString) {
|
|
94
114
|
const keys = [];
|
|
@@ -157,6 +177,11 @@ class Mouse {
|
|
|
157
177
|
currentPoint() {
|
|
158
178
|
return { x: this._x, y: this._y };
|
|
159
179
|
}
|
|
180
|
+
async apiMove(progress, x, y, options = {}) {
|
|
181
|
+
progress.metadata.point = { x, y };
|
|
182
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
183
|
+
await this.move(progress, x, y, options);
|
|
184
|
+
}
|
|
160
185
|
async move(progress, x, y, options = {}) {
|
|
161
186
|
const { steps = 1 } = options;
|
|
162
187
|
const fromX = this._x;
|
|
@@ -169,18 +194,33 @@ class Mouse {
|
|
|
169
194
|
await this._raw.move(progress, middleX, middleY, this._lastButton, this._buttons, this._keyboard._modifiers(), !!options.forClick);
|
|
170
195
|
}
|
|
171
196
|
}
|
|
197
|
+
async apiDown(progress, options = {}) {
|
|
198
|
+
progress.metadata.point = this.currentPoint();
|
|
199
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
200
|
+
await this.down(progress, options);
|
|
201
|
+
}
|
|
172
202
|
async down(progress, options = {}) {
|
|
173
203
|
const { button = "left", clickCount = 1 } = options;
|
|
174
204
|
this._lastButton = button;
|
|
175
205
|
this._buttons.add(button);
|
|
176
206
|
await this._raw.down(progress, this._x, this._y, this._lastButton, this._buttons, this._keyboard._modifiers(), clickCount);
|
|
177
207
|
}
|
|
208
|
+
async apiUp(progress, options = {}) {
|
|
209
|
+
progress.metadata.point = this.currentPoint();
|
|
210
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
211
|
+
await this.up(progress, options);
|
|
212
|
+
}
|
|
178
213
|
async up(progress, options = {}) {
|
|
179
214
|
const { button = "left", clickCount = 1 } = options;
|
|
180
215
|
this._lastButton = "none";
|
|
181
216
|
this._buttons.delete(button);
|
|
182
217
|
await this._raw.up(progress, this._x, this._y, button, this._buttons, this._keyboard._modifiers(), clickCount);
|
|
183
218
|
}
|
|
219
|
+
async apiClick(progress, x, y, options = {}) {
|
|
220
|
+
progress.metadata.point = { x, y };
|
|
221
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
222
|
+
await this.click(progress, x, y, options);
|
|
223
|
+
}
|
|
184
224
|
async click(progress, x, y, options = {}) {
|
|
185
225
|
const { delay = null, clickCount = 1, steps } = options;
|
|
186
226
|
if (delay) {
|
|
@@ -206,7 +246,8 @@ class Mouse {
|
|
|
206
246
|
await Promise.all(promises);
|
|
207
247
|
}
|
|
208
248
|
}
|
|
209
|
-
async
|
|
249
|
+
async apiWheel(progress, deltaX, deltaY) {
|
|
250
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
210
251
|
await this._raw.wheel(progress, this._x, this._y, this._buttons, this._keyboard._modifiers(), deltaX, deltaY);
|
|
211
252
|
}
|
|
212
253
|
}
|
|
@@ -260,9 +301,13 @@ class Touchscreen {
|
|
|
260
301
|
this._raw = raw;
|
|
261
302
|
this._page = page;
|
|
262
303
|
}
|
|
263
|
-
async
|
|
304
|
+
async apiTap(progress, x, y) {
|
|
264
305
|
if (!this._page.browserContext._options.hasTouch)
|
|
265
306
|
throw new Error("hasTouch must be enabled on the browser context before using the touchscreen.");
|
|
307
|
+
await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
|
|
308
|
+
await this.tap(progress, x, y);
|
|
309
|
+
}
|
|
310
|
+
async tap(progress, x, y) {
|
|
266
311
|
await this._raw.tap(progress, x, y, this._page.keyboard._modifiers());
|
|
267
312
|
}
|
|
268
313
|
}
|
|
@@ -25,6 +25,7 @@ __export(instrumentation_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(instrumentation_exports);
|
|
26
26
|
var import_events = require("events");
|
|
27
27
|
var import_crypto = require("./utils/crypto");
|
|
28
|
+
var import_debugLogger = require("./utils/debugLogger");
|
|
28
29
|
class SdkObject extends import_events.EventEmitter {
|
|
29
30
|
constructor(parent, guidPrefix, guid) {
|
|
30
31
|
super();
|
|
@@ -33,6 +34,13 @@ class SdkObject extends import_events.EventEmitter {
|
|
|
33
34
|
this.attribution = { ...parent.attribution };
|
|
34
35
|
this.instrumentation = parent.instrumentation;
|
|
35
36
|
}
|
|
37
|
+
apiLog(message) {
|
|
38
|
+
if (!this.attribution.playwright.options.isInternalPlaywright)
|
|
39
|
+
import_debugLogger.debugLogger.log("api", message);
|
|
40
|
+
}
|
|
41
|
+
closeReason() {
|
|
42
|
+
return this.attribution.page?._closeReason || this.attribution.context?._closeReason || this.attribution.browser?._closeReason;
|
|
43
|
+
}
|
|
36
44
|
}
|
|
37
45
|
function createRootSdkObject() {
|
|
38
46
|
const fakeParent = { attribution: {}, instrumentation: createInstrumentation() };
|
package/lib/server/javascript.js
CHANGED
|
@@ -113,30 +113,14 @@ class JSHandle extends import_instrumentation.SdkObject {
|
|
|
113
113
|
async evaluateHandle(pageFunction, arg) {
|
|
114
114
|
return evaluate(this._context, false, pageFunction, this, arg);
|
|
115
115
|
}
|
|
116
|
-
async evaluateExpression(expression, options, arg
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const frame = context.frame;
|
|
120
|
-
if (frame) {
|
|
121
|
-
if (isolatedContext) context = await frame._utilityContext();
|
|
122
|
-
else if (!isolatedContext) context = await frame._mainContext();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
const value = await evaluateExpression(context, expression, { ...options, returnByValue: true }, this, arg);
|
|
126
|
-
await context.doSlowMo();
|
|
116
|
+
async evaluateExpression(expression, options, arg) {
|
|
117
|
+
const value = await evaluateExpression(this._context, expression, { ...options, returnByValue: true }, this, arg);
|
|
118
|
+
await this._context.doSlowMo();
|
|
127
119
|
return value;
|
|
128
120
|
}
|
|
129
|
-
async evaluateExpressionHandle(expression, options, arg
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const frame = this._context.frame;
|
|
133
|
-
if (frame) {
|
|
134
|
-
if (isolatedContext) context = await frame._utilityContext();
|
|
135
|
-
else if (!isolatedContext) context = await frame._mainContext();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
const value = await evaluateExpression(context, expression, { ...options, returnByValue: false }, this, arg);
|
|
139
|
-
await context.doSlowMo();
|
|
121
|
+
async evaluateExpressionHandle(expression, options, arg) {
|
|
122
|
+
const value = await evaluateExpression(this._context, expression, { ...options, returnByValue: false }, this, arg);
|
|
123
|
+
await this._context.doSlowMo();
|
|
140
124
|
return value;
|
|
141
125
|
}
|
|
142
126
|
async getProperty(propertyName) {
|
package/lib/server/launchApp.js
CHANGED
|
@@ -106,7 +106,6 @@ async function syncLocalStorageWithSettings(page, appName) {
|
|
|
106
106
|
});
|
|
107
107
|
const settings = await import_fs.default.promises.readFile(settingsFile, "utf-8").catch(() => "{}");
|
|
108
108
|
await page.addInitScript(
|
|
109
|
-
progress,
|
|
110
109
|
`(${String((settings2) => {
|
|
111
110
|
if (location && location.protocol === "data:")
|
|
112
111
|
return;
|
package/lib/server/localUtils.js
CHANGED
|
@@ -45,13 +45,13 @@ var import_crypto = require("./utils/crypto");
|
|
|
45
45
|
var import_harBackend = require("./harBackend");
|
|
46
46
|
var import_manualPromise = require("../utils/isomorphic/manualPromise");
|
|
47
47
|
var import_zipFile = require("./utils/zipFile");
|
|
48
|
-
var
|
|
49
|
-
var import_traceUtils = require("../utils/isomorphic/traceUtils");
|
|
48
|
+
var import_traceUtils = require("../utils/isomorphic/trace/traceUtils");
|
|
50
49
|
var import_assert = require("../utils/isomorphic/assert");
|
|
51
50
|
var import_fileUtils = require("./utils/fileUtils");
|
|
52
51
|
async function zip(progress, stackSessions, params) {
|
|
53
52
|
const promise = new import_manualPromise.ManualPromise();
|
|
54
|
-
const
|
|
53
|
+
const { yauzl, yazl } = require("../zipBundle");
|
|
54
|
+
const zipFile = new yazl.ZipFile();
|
|
55
55
|
zipFile.on("error", (error) => promise.reject(error));
|
|
56
56
|
const addFile = (file, name) => {
|
|
57
57
|
try {
|
|
@@ -69,7 +69,7 @@ async function zip(progress, stackSessions, params) {
|
|
|
69
69
|
zipFile.addBuffer(buffer, "trace.stacks");
|
|
70
70
|
}
|
|
71
71
|
if (params.includeSources) {
|
|
72
|
-
const sourceFiles =
|
|
72
|
+
const sourceFiles = new Set(params.additionalSources);
|
|
73
73
|
for (const { stack } of stackSession?.callStacks || []) {
|
|
74
74
|
if (!stack)
|
|
75
75
|
continue;
|
|
@@ -77,7 +77,7 @@ async function zip(progress, stackSessions, params) {
|
|
|
77
77
|
sourceFiles.add(file);
|
|
78
78
|
}
|
|
79
79
|
for (const sourceFile of sourceFiles)
|
|
80
|
-
addFile(sourceFile, "resources/src@" +
|
|
80
|
+
addFile(sourceFile, "resources/src@" + (0, import_crypto.calculateSha1)(sourceFile) + ".txt");
|
|
81
81
|
}
|
|
82
82
|
if (params.mode === "write") {
|
|
83
83
|
await progress.race(import_fs.default.promises.mkdir(import_path.default.dirname(params.zipFile), { recursive: true }));
|
|
@@ -90,7 +90,7 @@ async function zip(progress, stackSessions, params) {
|
|
|
90
90
|
}
|
|
91
91
|
const tempFile = params.zipFile + ".tmp";
|
|
92
92
|
await progress.race(import_fs.default.promises.rename(params.zipFile, tempFile));
|
|
93
|
-
|
|
93
|
+
yauzl.open(tempFile, (err, inZipFile) => {
|
|
94
94
|
if (err) {
|
|
95
95
|
promise.reject(err);
|
|
96
96
|
return;
|
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();
|
|
@@ -339,7 +373,7 @@ class Route extends import_instrumentation.SdkObject {
|
|
|
339
373
|
}
|
|
340
374
|
}
|
|
341
375
|
class Response extends import_instrumentation.SdkObject {
|
|
342
|
-
constructor(request, status, statusText2, headers, timing, getResponseBodyCallback, fromServiceWorker
|
|
376
|
+
constructor(request, status, statusText2, headers, timing, getResponseBodyCallback, fromServiceWorker) {
|
|
343
377
|
super(request.frame() || request._context, "response");
|
|
344
378
|
this._contentPromise = null;
|
|
345
379
|
this._finishedPromise = new import_manualPromise.ManualPromise();
|
|
@@ -347,6 +381,7 @@ class Response extends import_instrumentation.SdkObject {
|
|
|
347
381
|
this._serverAddrPromise = new import_manualPromise.ManualPromise();
|
|
348
382
|
this._securityDetailsPromise = new import_manualPromise.ManualPromise();
|
|
349
383
|
this._rawResponseHeadersPromise = new import_manualPromise.ManualPromise();
|
|
384
|
+
this._httpVersionPromise = new import_manualPromise.ManualPromise();
|
|
350
385
|
this._encodedBodySizePromise = new import_manualPromise.ManualPromise();
|
|
351
386
|
this._transferSizePromise = new import_manualPromise.ManualPromise();
|
|
352
387
|
this._responseHeadersSizePromise = new import_manualPromise.ManualPromise();
|
|
@@ -360,7 +395,6 @@ class Response extends import_instrumentation.SdkObject {
|
|
|
360
395
|
this._headersMap.set(name.toLowerCase(), value);
|
|
361
396
|
this._getResponseBodyCallback = getResponseBodyCallback;
|
|
362
397
|
this._request._setResponse(this);
|
|
363
|
-
this._httpVersion = httpVersion;
|
|
364
398
|
this._fromServiceWorker = fromServiceWorker;
|
|
365
399
|
}
|
|
366
400
|
_serverAddrFinished(addr) {
|
|
@@ -376,7 +410,7 @@ class Response extends import_instrumentation.SdkObject {
|
|
|
376
410
|
this._finishedPromise.resolve();
|
|
377
411
|
}
|
|
378
412
|
_setHttpVersion(httpVersion) {
|
|
379
|
-
this.
|
|
413
|
+
this._httpVersionPromise.resolve(httpVersion);
|
|
380
414
|
}
|
|
381
415
|
url() {
|
|
382
416
|
return this._url;
|
|
@@ -436,17 +470,21 @@ 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
|
}
|
|
442
|
-
httpVersion() {
|
|
443
|
-
|
|
479
|
+
async httpVersion() {
|
|
480
|
+
const httpVersion = await this._httpVersionPromise || null;
|
|
481
|
+
if (!httpVersion)
|
|
444
482
|
return "HTTP/1.1";
|
|
445
|
-
if (
|
|
483
|
+
if (httpVersion === "http/1.1")
|
|
446
484
|
return "HTTP/1.1";
|
|
447
|
-
if (
|
|
485
|
+
if (httpVersion === "h2")
|
|
448
486
|
return "HTTP/2.0";
|
|
449
|
-
return
|
|
487
|
+
return httpVersion;
|
|
450
488
|
}
|
|
451
489
|
fromServiceWorker() {
|
|
452
490
|
return this._fromServiceWorker;
|
|
@@ -617,6 +655,7 @@ function mergeHeaders(headers) {
|
|
|
617
655
|
Response,
|
|
618
656
|
Route,
|
|
619
657
|
WebSocket,
|
|
658
|
+
applyHeadersOverrides,
|
|
620
659
|
filterCookies,
|
|
621
660
|
isLocalHostname,
|
|
622
661
|
kMaxCookieExpiresDateInSeconds,
|
|
@@ -0,0 +1,138 @@
|
|
|
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 overlay_exports = {};
|
|
20
|
+
__export(overlay_exports, {
|
|
21
|
+
Overlay: () => Overlay
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(overlay_exports);
|
|
24
|
+
var import_utils = require("../utils");
|
|
25
|
+
var import_page = require("./page");
|
|
26
|
+
class Overlay {
|
|
27
|
+
constructor(page) {
|
|
28
|
+
this._overlays = /* @__PURE__ */ new Map();
|
|
29
|
+
this._page = page;
|
|
30
|
+
this._page.on(import_page.Page.Events.InternalFrameNavigatedToNewDocument, (frame) => {
|
|
31
|
+
if (frame.parentFrame())
|
|
32
|
+
return;
|
|
33
|
+
for (const [id, html] of this._overlays)
|
|
34
|
+
this._doAdd(id, html).catch((e) => import_utils.debugLogger.log("error", e));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
dispose() {
|
|
38
|
+
}
|
|
39
|
+
async show(html, duration) {
|
|
40
|
+
const id = (0, import_utils.createGuid)();
|
|
41
|
+
this._overlays.set(id, html);
|
|
42
|
+
await this._doAdd(id, html).catch((e) => import_utils.debugLogger.log("error", e));
|
|
43
|
+
if (duration) {
|
|
44
|
+
await new Promise((f) => setTimeout(f, duration));
|
|
45
|
+
await this.remove(id);
|
|
46
|
+
}
|
|
47
|
+
return id;
|
|
48
|
+
}
|
|
49
|
+
async _doAdd(id, html) {
|
|
50
|
+
const utility = await this._page.mainFrame()._utilityContext();
|
|
51
|
+
await utility.evaluate(({ injected, html: html2, id: id2 }) => {
|
|
52
|
+
return injected.addUserOverlay(id2, html2);
|
|
53
|
+
}, { injected: await utility.injectedScript(), html, id });
|
|
54
|
+
}
|
|
55
|
+
async remove(id) {
|
|
56
|
+
this._overlays.delete(id);
|
|
57
|
+
const utility = await this._page.mainFrame()._utilityContext();
|
|
58
|
+
await utility.evaluate(({ injected, id: id2 }) => {
|
|
59
|
+
injected.removeUserOverlay(id2);
|
|
60
|
+
}, { injected: await utility.injectedScript(), id }).catch((e) => import_utils.debugLogger.log("error", e));
|
|
61
|
+
}
|
|
62
|
+
async chapter(options) {
|
|
63
|
+
const fadeDuration = 300;
|
|
64
|
+
const descriptionHtml = options.description ? `<div id="description">${(0, import_utils.escapeHTML)(options.description)}</div>` : "";
|
|
65
|
+
const styleSheet = `
|
|
66
|
+
@keyframes pw-chapter-fade-in {
|
|
67
|
+
from { opacity: 0; }
|
|
68
|
+
to { opacity: 1; }
|
|
69
|
+
}
|
|
70
|
+
@keyframes pw-chapter-fade-out {
|
|
71
|
+
from { opacity: 1; }
|
|
72
|
+
to { opacity: 0; }
|
|
73
|
+
}
|
|
74
|
+
#background {
|
|
75
|
+
position: absolute;
|
|
76
|
+
inset: 0;
|
|
77
|
+
display: flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
justify-content: center;
|
|
80
|
+
backdrop-filter: blur(2px);
|
|
81
|
+
animation: pw-chapter-fade-in ${fadeDuration}ms ease-out forwards;
|
|
82
|
+
}
|
|
83
|
+
#background.fade-out {
|
|
84
|
+
animation: pw-chapter-fade-out ${fadeDuration}ms ease-in forwards;
|
|
85
|
+
}
|
|
86
|
+
#content {
|
|
87
|
+
background: rgba(0, 0, 0, 0.7);
|
|
88
|
+
border: 1px solid rgba(255, 255, 255, 0.15);
|
|
89
|
+
border-radius: 16px;
|
|
90
|
+
padding: 40px 56px;
|
|
91
|
+
max-width: 560px;
|
|
92
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
|
|
93
|
+
}
|
|
94
|
+
#title {
|
|
95
|
+
color: white;
|
|
96
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
97
|
+
font-size: 28px;
|
|
98
|
+
font-weight: 600;
|
|
99
|
+
line-height: 1.3;
|
|
100
|
+
text-align: center;
|
|
101
|
+
letter-spacing: -0.01em;
|
|
102
|
+
}
|
|
103
|
+
#description {
|
|
104
|
+
color: rgba(255, 255, 255, 0.7);
|
|
105
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
106
|
+
font-size: 15px;
|
|
107
|
+
line-height: 1.5;
|
|
108
|
+
margin-top: 12px;
|
|
109
|
+
text-align: center;
|
|
110
|
+
}
|
|
111
|
+
`;
|
|
112
|
+
const duration = options.duration ?? 2e3;
|
|
113
|
+
const html = `<style>${styleSheet}</style><div id="background"><div id="content"><div id="title">${(0, import_utils.escapeHTML)(options.title)}</div>${descriptionHtml}</div></div>`;
|
|
114
|
+
const id = await this.show(html);
|
|
115
|
+
await new Promise((f) => setTimeout(f, duration));
|
|
116
|
+
const utility = await this._page.mainFrame()._utilityContext();
|
|
117
|
+
await utility.evaluate(({ injected, id: id2, fadeDuration: fadeDuration2 }) => {
|
|
118
|
+
const overlay = injected.getUserOverlay(id2);
|
|
119
|
+
const bg = overlay?.querySelector("#background");
|
|
120
|
+
if (bg)
|
|
121
|
+
bg.classList.add("fade-out");
|
|
122
|
+
return new Promise((f) => injected.utils.builtins.setTimeout(f, fadeDuration2));
|
|
123
|
+
}, { injected: await utility.injectedScript(), id, fadeDuration }).catch((e) => import_utils.debugLogger.log("error", e));
|
|
124
|
+
await this.remove(id);
|
|
125
|
+
}
|
|
126
|
+
async setVisible(visible) {
|
|
127
|
+
if (!this._overlays.size)
|
|
128
|
+
return;
|
|
129
|
+
const utility = await this._page.mainFrame()._utilityContext();
|
|
130
|
+
await utility.evaluate(({ injected, visible: visible2 }) => {
|
|
131
|
+
injected.setUserOverlaysVisible(visible2);
|
|
132
|
+
}, { injected: await utility.injectedScript(), visible }).catch((e) => import_utils.debugLogger.log("error", e));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
136
|
+
0 && (module.exports = {
|
|
137
|
+
Overlay
|
|
138
|
+
});
|