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
|
@@ -29,6 +29,7 @@ var import_path = __toESM(require("path"));
|
|
|
29
29
|
var import_manualPromise = require("../../utils/isomorphic/manualPromise");
|
|
30
30
|
var import_network = require("../utils/network");
|
|
31
31
|
var import_zipBundle = require("../../zipBundle");
|
|
32
|
+
var import_fileUtils = require("../utils/fileUtils");
|
|
32
33
|
function log(message) {
|
|
33
34
|
process.send?.({ method: "log", params: { message } });
|
|
34
35
|
}
|
|
@@ -99,6 +100,8 @@ function downloadFile(options) {
|
|
|
99
100
|
async function main(options) {
|
|
100
101
|
await downloadFile(options);
|
|
101
102
|
log(`SUCCESS downloading ${options.title}`);
|
|
103
|
+
log(`removing existing browser directory if any`);
|
|
104
|
+
await (0, import_fileUtils.removeFolders)([options.browserDirectory]);
|
|
102
105
|
log(`extracting archive`);
|
|
103
106
|
await (0, import_zipBundle.extract)(options.zipPath, { dir: options.browserDirectory });
|
|
104
107
|
if (options.executablePath) {
|
|
@@ -0,0 +1,137 @@
|
|
|
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 screencast_exports = {};
|
|
20
|
+
__export(screencast_exports, {
|
|
21
|
+
Screencast: () => Screencast
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(screencast_exports);
|
|
24
|
+
var import_utils = require("../utils");
|
|
25
|
+
var import_utils2 = require("../utils");
|
|
26
|
+
class Screencast {
|
|
27
|
+
constructor(page) {
|
|
28
|
+
this._clients = /* @__PURE__ */ new Set();
|
|
29
|
+
this.page = page;
|
|
30
|
+
this.page.instrumentation.addListener(this, page.browserContext);
|
|
31
|
+
}
|
|
32
|
+
async handlePageOrContextClose() {
|
|
33
|
+
const clients = [...this._clients];
|
|
34
|
+
this._clients.clear();
|
|
35
|
+
for (const client of clients) {
|
|
36
|
+
if (client.gracefulClose)
|
|
37
|
+
await client.gracefulClose();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
dispose() {
|
|
41
|
+
for (const client of this._clients)
|
|
42
|
+
client.dispose();
|
|
43
|
+
this._clients.clear();
|
|
44
|
+
this.page.instrumentation.removeListener(this);
|
|
45
|
+
}
|
|
46
|
+
showActions(options) {
|
|
47
|
+
this._actions = options;
|
|
48
|
+
}
|
|
49
|
+
hideActions() {
|
|
50
|
+
this._actions = void 0;
|
|
51
|
+
}
|
|
52
|
+
addClient(client) {
|
|
53
|
+
this._clients.add(client);
|
|
54
|
+
if (this._clients.size === 1)
|
|
55
|
+
this._startScreencast(client.size, client.quality);
|
|
56
|
+
return { size: this._size };
|
|
57
|
+
}
|
|
58
|
+
removeClient(client) {
|
|
59
|
+
if (!this._clients.has(client))
|
|
60
|
+
return;
|
|
61
|
+
this._clients.delete(client);
|
|
62
|
+
if (!this._clients.size)
|
|
63
|
+
this._stopScreencast();
|
|
64
|
+
}
|
|
65
|
+
size() {
|
|
66
|
+
return this._size;
|
|
67
|
+
}
|
|
68
|
+
_startScreencast(size, quality) {
|
|
69
|
+
this._size = size;
|
|
70
|
+
if (!this._size) {
|
|
71
|
+
const viewport = this.page.browserContext._options.viewport || { width: 800, height: 600 };
|
|
72
|
+
const scale = Math.min(1, 800 / Math.max(viewport.width, viewport.height));
|
|
73
|
+
this._size = {
|
|
74
|
+
width: Math.floor(viewport.width * scale),
|
|
75
|
+
height: Math.floor(viewport.height * scale)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
this._size = {
|
|
79
|
+
width: this._size.width & ~1,
|
|
80
|
+
height: this._size.height & ~1
|
|
81
|
+
};
|
|
82
|
+
this.page.delegate.startScreencast({
|
|
83
|
+
width: this._size.width,
|
|
84
|
+
height: this._size.height,
|
|
85
|
+
quality: quality ?? 90
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
_stopScreencast() {
|
|
89
|
+
this.page.delegate.stopScreencast();
|
|
90
|
+
}
|
|
91
|
+
onScreencastFrame(frame, ack) {
|
|
92
|
+
const asyncResults = [];
|
|
93
|
+
for (const client of this._clients) {
|
|
94
|
+
const result = client.onFrame(frame);
|
|
95
|
+
if (result)
|
|
96
|
+
asyncResults.push(result);
|
|
97
|
+
}
|
|
98
|
+
if (ack) {
|
|
99
|
+
if (!asyncResults.length)
|
|
100
|
+
ack();
|
|
101
|
+
else
|
|
102
|
+
Promise.race(asyncResults).then(ack);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async onBeforeCall(sdkObject, metadata, parentId) {
|
|
106
|
+
if (!this._actions)
|
|
107
|
+
return;
|
|
108
|
+
metadata.annotate = true;
|
|
109
|
+
}
|
|
110
|
+
async onBeforeInputAction(sdkObject, metadata) {
|
|
111
|
+
if (!this._actions)
|
|
112
|
+
return;
|
|
113
|
+
const page = sdkObject.attribution.page;
|
|
114
|
+
if (!page)
|
|
115
|
+
return;
|
|
116
|
+
const actionTitle = (0, import_utils.renderTitleForCall)(metadata);
|
|
117
|
+
const utility = await page.mainFrame()._utilityContext();
|
|
118
|
+
await utility.evaluate(async (options) => {
|
|
119
|
+
const { injected, duration } = options;
|
|
120
|
+
injected.setScreencastAnnotation(options);
|
|
121
|
+
await new Promise((f) => injected.utils.builtins.setTimeout(f, duration));
|
|
122
|
+
injected.setScreencastAnnotation(null);
|
|
123
|
+
}, {
|
|
124
|
+
injected: await utility.injectedScript(),
|
|
125
|
+
duration: this._actions?.duration ?? 500,
|
|
126
|
+
point: metadata.point,
|
|
127
|
+
box: metadata.box,
|
|
128
|
+
actionTitle,
|
|
129
|
+
position: this._actions?.position,
|
|
130
|
+
fontSize: this._actions?.fontSize
|
|
131
|
+
}).catch((e) => import_utils2.debugLogger.log("error", e));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
135
|
+
0 && (module.exports = {
|
|
136
|
+
Screencast
|
|
137
|
+
});
|
|
@@ -57,7 +57,7 @@ class Snapshotter {
|
|
|
57
57
|
async resetForReuse() {
|
|
58
58
|
if (this._initScript) {
|
|
59
59
|
import_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
60
|
-
await this.
|
|
60
|
+
await this._initScript.dispose();
|
|
61
61
|
this._initScript = void 0;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -69,7 +69,7 @@ class Snapshotter {
|
|
|
69
69
|
];
|
|
70
70
|
const { javaScriptEnabled } = this._context._options;
|
|
71
71
|
const initScriptSource = `(${import_snapshotterInjected.frameSnapshotStreamer})("${this._snapshotStreamer}", ${javaScriptEnabled || javaScriptEnabled === void 0})`;
|
|
72
|
-
this._initScript = await this._context.addInitScript(
|
|
72
|
+
this._initScript = await this._context.addInitScript(initScriptSource);
|
|
73
73
|
await this._context.safeNonStallingEvaluateInAllFrames(initScriptSource, "main");
|
|
74
74
|
}
|
|
75
75
|
dispose() {
|
|
@@ -61,6 +61,7 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
61
61
|
constructor() {
|
|
62
62
|
this._lastSnapshotNumber = 0;
|
|
63
63
|
this._staleStyleSheets = /* @__PURE__ */ new Set();
|
|
64
|
+
this._modifiedStyleSheets = /* @__PURE__ */ new Set();
|
|
64
65
|
this._readingStyleSheet = false;
|
|
65
66
|
const invalidateCSSGroupingRule = (rule) => {
|
|
66
67
|
if (rule.parentStyleSheet)
|
|
@@ -76,6 +77,10 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
76
77
|
this._interceptNativeMethod(window.CSSGroupingRule.prototype, "insertRule", invalidateCSSGroupingRule);
|
|
77
78
|
this._interceptNativeMethod(window.CSSGroupingRule.prototype, "deleteRule", invalidateCSSGroupingRule);
|
|
78
79
|
this._interceptNativeGetter(window.CSSGroupingRule.prototype, "cssRules", invalidateCSSGroupingRule);
|
|
80
|
+
this._interceptNativeSetter(window.StyleSheet.prototype, "disabled", (sheet) => {
|
|
81
|
+
if (sheet instanceof CSSStyleSheet)
|
|
82
|
+
this._invalidateStyleSheet(sheet);
|
|
83
|
+
});
|
|
79
84
|
this._interceptNativeAsyncMethod(window.CSSStyleSheet.prototype, "replace", (sheet) => this._invalidateStyleSheet(sheet));
|
|
80
85
|
this._fakeBase = document.createElement("base");
|
|
81
86
|
this._observer = new MutationObserver((list) => this._handleMutations(list));
|
|
@@ -148,6 +153,17 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
148
153
|
}
|
|
149
154
|
});
|
|
150
155
|
}
|
|
156
|
+
_interceptNativeSetter(obj, prop, cb) {
|
|
157
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
158
|
+
Object.defineProperty(obj, prop, {
|
|
159
|
+
...descriptor,
|
|
160
|
+
set: function(value) {
|
|
161
|
+
const result = descriptor.set.call(this, value);
|
|
162
|
+
cb(this, value);
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
151
167
|
_handleMutations(list) {
|
|
152
168
|
for (const mutation of list)
|
|
153
169
|
ensureCachedData(mutation.target).attributesCached = void 0;
|
|
@@ -156,6 +172,8 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
156
172
|
if (this._readingStyleSheet)
|
|
157
173
|
return;
|
|
158
174
|
this._staleStyleSheets.add(sheet);
|
|
175
|
+
if (sheet.href !== null)
|
|
176
|
+
this._modifiedStyleSheets.add(sheet);
|
|
159
177
|
}
|
|
160
178
|
_updateStyleElementStyleSheetTextIfNeeded(sheet, forceText) {
|
|
161
179
|
const data = ensureCachedData(sheet);
|
|
@@ -248,6 +266,8 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
248
266
|
_getSheetText(sheet) {
|
|
249
267
|
this._readingStyleSheet = true;
|
|
250
268
|
try {
|
|
269
|
+
if (sheet.disabled)
|
|
270
|
+
return "";
|
|
251
271
|
const rules = [];
|
|
252
272
|
for (const rule of sheet.cssRules)
|
|
253
273
|
rules.push(rule.cssText);
|
|
@@ -518,7 +538,7 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
518
538
|
wallTime: Date.now(),
|
|
519
539
|
collectionTime: 0
|
|
520
540
|
};
|
|
521
|
-
for (const sheet of this.
|
|
541
|
+
for (const sheet of this._modifiedStyleSheets) {
|
|
522
542
|
if (sheet.href === null)
|
|
523
543
|
continue;
|
|
524
544
|
const content = this._updateLinkStyleSheetTextIfNeeded(sheet, snapshotNumber);
|
|
@@ -38,6 +38,7 @@ var import_snapshotter = require("./snapshotter");
|
|
|
38
38
|
var import_protocolMetainfo = require("../../../utils/isomorphic/protocolMetainfo");
|
|
39
39
|
var import_assert = require("../../../utils/isomorphic/assert");
|
|
40
40
|
var import_time = require("../../../utils/isomorphic/time");
|
|
41
|
+
var import_manualPromise = require("../../../utils/isomorphic/manualPromise");
|
|
41
42
|
var import_eventsHelper = require("../../utils/eventsHelper");
|
|
42
43
|
var import_crypto = require("../../utils/crypto");
|
|
43
44
|
var import_userAgent = require("../../utils/userAgent");
|
|
@@ -48,15 +49,14 @@ var import_errors = require("../../errors");
|
|
|
48
49
|
var import_fileUtils = require("../../utils/fileUtils");
|
|
49
50
|
var import_harTracer = require("../../har/harTracer");
|
|
50
51
|
var import_instrumentation = require("../../instrumentation");
|
|
51
|
-
var import_page = require("../../page");
|
|
52
52
|
var import_progress = require("../../progress");
|
|
53
53
|
const version = 8;
|
|
54
|
-
const kScreencastOptions = { width: 800, height: 600, quality: 90 };
|
|
55
54
|
class Tracing extends import_instrumentation.SdkObject {
|
|
56
55
|
constructor(context, tracesDir) {
|
|
57
56
|
super(context, "tracing");
|
|
58
57
|
this._fs = new import_fileUtils.SerializedFS();
|
|
59
58
|
this._screencastListeners = [];
|
|
59
|
+
this._pageTracingRecorders = /* @__PURE__ */ new Map();
|
|
60
60
|
this._eventListeners = [];
|
|
61
61
|
this._isStopping = false;
|
|
62
62
|
this._allResources = /* @__PURE__ */ new Set();
|
|
@@ -219,10 +219,9 @@ class Tracing extends import_instrumentation.SdkObject {
|
|
|
219
219
|
}
|
|
220
220
|
_stopScreencast() {
|
|
221
221
|
import_eventsHelper.eventsHelper.removeEventListeners(this._screencastListeners);
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
page.setScreencastOptions(null);
|
|
222
|
+
for (const recorder of this._pageTracingRecorders.values())
|
|
223
|
+
recorder.dispose();
|
|
224
|
+
this._pageTracingRecorders.clear();
|
|
226
225
|
}
|
|
227
226
|
_allocateNewTraceFile(state) {
|
|
228
227
|
const suffix = state.chunkOrdinal ? `-chunk${state.chunkOrdinal}` : ``;
|
|
@@ -326,23 +325,33 @@ class Tracing extends import_instrumentation.SdkObject {
|
|
|
326
325
|
return { artifact };
|
|
327
326
|
}
|
|
328
327
|
async _captureSnapshot(snapshotName, sdkObject, metadata) {
|
|
329
|
-
if (!
|
|
330
|
-
return;
|
|
331
|
-
if (!sdkObject.attribution.page)
|
|
332
|
-
return;
|
|
333
|
-
if (!this._snapshotter.started())
|
|
334
|
-
return;
|
|
335
|
-
if (!shouldCaptureSnapshot(metadata))
|
|
328
|
+
if (!snapshotName || !sdkObject.attribution.page)
|
|
336
329
|
return;
|
|
337
|
-
await this._snapshotter
|
|
330
|
+
await this._snapshotter?.captureSnapshot(sdkObject.attribution.page, metadata.id, snapshotName).catch(() => {
|
|
338
331
|
});
|
|
339
332
|
}
|
|
340
|
-
|
|
341
|
-
|
|
333
|
+
_shouldCaptureSnapshot(sdkObject, metadata, phase) {
|
|
334
|
+
if (!sdkObject.attribution.page || !this._snapshotter?.started())
|
|
335
|
+
return;
|
|
336
|
+
const metainfo = (0, import_protocolMetainfo.getMetainfo)(metadata);
|
|
337
|
+
if (!metainfo?.snapshot)
|
|
338
|
+
return false;
|
|
339
|
+
switch (phase) {
|
|
340
|
+
case "before":
|
|
341
|
+
return !metainfo.input || !!metainfo.isAutoWaiting;
|
|
342
|
+
case "input":
|
|
343
|
+
return !!metainfo.input;
|
|
344
|
+
case "after":
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
onBeforeCall(sdkObject, metadata, parentId) {
|
|
349
|
+
const event = createBeforeActionTraceEvent(metadata, parentId ?? this._currentGroupId());
|
|
342
350
|
if (!event)
|
|
343
351
|
return Promise.resolve();
|
|
344
|
-
sdkObject.attribution.page
|
|
345
|
-
|
|
352
|
+
this._temporarilyDisableThrottling(sdkObject.attribution.page);
|
|
353
|
+
if (this._shouldCaptureSnapshot(sdkObject, metadata, "before"))
|
|
354
|
+
event.beforeSnapshot = `before@${metadata.id}`;
|
|
346
355
|
this._state?.callIds.add(metadata.id);
|
|
347
356
|
this._appendTraceEvent(event);
|
|
348
357
|
return this._captureSnapshot(event.beforeSnapshot, sdkObject, metadata);
|
|
@@ -353,8 +362,9 @@ class Tracing extends import_instrumentation.SdkObject {
|
|
|
353
362
|
const event = createInputActionTraceEvent(metadata);
|
|
354
363
|
if (!event)
|
|
355
364
|
return Promise.resolve();
|
|
356
|
-
sdkObject.attribution.page
|
|
357
|
-
|
|
365
|
+
this._temporarilyDisableThrottling(sdkObject.attribution.page);
|
|
366
|
+
if (this._shouldCaptureSnapshot(sdkObject, metadata, "input"))
|
|
367
|
+
event.inputSnapshot = `input@${metadata.id}`;
|
|
358
368
|
this._appendTraceEvent(event);
|
|
359
369
|
return this._captureSnapshot(event.inputSnapshot, sdkObject, metadata);
|
|
360
370
|
}
|
|
@@ -369,15 +379,16 @@ class Tracing extends import_instrumentation.SdkObject {
|
|
|
369
379
|
if (event)
|
|
370
380
|
this._appendTraceEvent(event);
|
|
371
381
|
}
|
|
372
|
-
|
|
382
|
+
onAfterCall(sdkObject, metadata) {
|
|
373
383
|
if (!this._state?.callIds.has(metadata.id))
|
|
374
|
-
return;
|
|
384
|
+
return Promise.resolve();
|
|
375
385
|
this._state?.callIds.delete(metadata.id);
|
|
376
386
|
const event = createAfterActionTraceEvent(metadata);
|
|
377
387
|
if (!event)
|
|
378
|
-
return;
|
|
379
|
-
sdkObject.attribution.page
|
|
380
|
-
|
|
388
|
+
return Promise.resolve();
|
|
389
|
+
this._temporarilyDisableThrottling(sdkObject.attribution.page);
|
|
390
|
+
if (this._shouldCaptureSnapshot(sdkObject, metadata, "after"))
|
|
391
|
+
event.afterSnapshot = `after@${metadata.id}`;
|
|
381
392
|
this._appendTraceEvent(event);
|
|
382
393
|
return this._captureSnapshot(event.afterSnapshot, sdkObject, metadata);
|
|
383
394
|
}
|
|
@@ -483,26 +494,28 @@ class Tracing extends import_instrumentation.SdkObject {
|
|
|
483
494
|
};
|
|
484
495
|
this._appendTraceEvent(event);
|
|
485
496
|
}
|
|
497
|
+
_temporarilyDisableThrottling(page) {
|
|
498
|
+
if (page)
|
|
499
|
+
this._pageTracingRecorders.get(page)?.temporarilyDisableThrottling();
|
|
500
|
+
}
|
|
486
501
|
_startScreencastInPage(page) {
|
|
487
|
-
page.setScreencastOptions(kScreencastOptions);
|
|
488
502
|
const prefix = page.guid;
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
);
|
|
503
|
+
const onFrame = (params) => {
|
|
504
|
+
const suffix = Date.now();
|
|
505
|
+
const sha1 = `${prefix}-${suffix}.jpeg`;
|
|
506
|
+
const event = {
|
|
507
|
+
type: "screencast-frame",
|
|
508
|
+
pageId: page.guid,
|
|
509
|
+
sha1,
|
|
510
|
+
width: params.viewportWidth,
|
|
511
|
+
height: params.viewportHeight,
|
|
512
|
+
timestamp: (0, import_time.monotonicTime)(),
|
|
513
|
+
frameSwapWallTime: params.frameSwapWallTime
|
|
514
|
+
};
|
|
515
|
+
this._appendResource(sha1, params.buffer);
|
|
516
|
+
this._appendTraceEvent(event);
|
|
517
|
+
};
|
|
518
|
+
this._pageTracingRecorders.set(page, new ScreencastTracingRecorder(page.screencast, onFrame));
|
|
506
519
|
}
|
|
507
520
|
_appendTraceEvent(event) {
|
|
508
521
|
const visited = visitTraceEvent(event, this._state.traceSha1s);
|
|
@@ -545,10 +558,6 @@ function visitTraceEvent(object, sha1s) {
|
|
|
545
558
|
}
|
|
546
559
|
return object;
|
|
547
560
|
}
|
|
548
|
-
function shouldCaptureSnapshot(metadata) {
|
|
549
|
-
const metainfo = import_protocolMetainfo.methodMetainfo.get(metadata.type + "." + metadata.method);
|
|
550
|
-
return !!metainfo?.snapshot;
|
|
551
|
-
}
|
|
552
561
|
function createBeforeActionTraceEvent(metadata, parentId) {
|
|
553
562
|
if (metadata.internal || metadata.method.startsWith("tracing"))
|
|
554
563
|
return null;
|
|
@@ -598,6 +607,48 @@ function createAfterActionTraceEvent(metadata) {
|
|
|
598
607
|
point: metadata.point
|
|
599
608
|
};
|
|
600
609
|
}
|
|
610
|
+
const throttledRate = 200;
|
|
611
|
+
const unthrottleDuration = 500;
|
|
612
|
+
class ScreencastTracingRecorder {
|
|
613
|
+
constructor(screencast, onFrame) {
|
|
614
|
+
this._unthrottledUntil = 0;
|
|
615
|
+
this._screencast = screencast;
|
|
616
|
+
this._client = {
|
|
617
|
+
onFrame: (frame) => {
|
|
618
|
+
const time = (0, import_time.monotonicTime)();
|
|
619
|
+
if (time < this._unthrottledUntil) {
|
|
620
|
+
onFrame(frame);
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
if (this._pendingAck)
|
|
624
|
+
return;
|
|
625
|
+
onFrame(frame);
|
|
626
|
+
this._pendingAck = new import_manualPromise.ManualPromise();
|
|
627
|
+
this._timer = setTimeout(() => this._clearPendingAck(), throttledRate);
|
|
628
|
+
return this._pendingAck;
|
|
629
|
+
},
|
|
630
|
+
gracefulClose: () => this.dispose(),
|
|
631
|
+
dispose: () => this.dispose()
|
|
632
|
+
};
|
|
633
|
+
this._screencast.addClient(this._client);
|
|
634
|
+
}
|
|
635
|
+
dispose() {
|
|
636
|
+
this._screencast.removeClient(this._client);
|
|
637
|
+
this._clearPendingAck();
|
|
638
|
+
}
|
|
639
|
+
temporarilyDisableThrottling() {
|
|
640
|
+
this._unthrottledUntil = (0, import_time.monotonicTime)() + unthrottleDuration;
|
|
641
|
+
this._clearPendingAck();
|
|
642
|
+
}
|
|
643
|
+
_clearPendingAck() {
|
|
644
|
+
this._pendingAck?.resolve();
|
|
645
|
+
this._pendingAck = void 0;
|
|
646
|
+
if (this._timer) {
|
|
647
|
+
clearTimeout(this._timer);
|
|
648
|
+
this._timer = void 0;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
601
652
|
// Annotate the CommonJS export names for ESM import in node:
|
|
602
653
|
0 && (module.exports = {
|
|
603
654
|
Tracing
|
|
@@ -47,20 +47,21 @@ var import_launchApp2 = require("../../launchApp");
|
|
|
47
47
|
var import_playwright = require("../../playwright");
|
|
48
48
|
var import_progress = require("../../progress");
|
|
49
49
|
const tracesDirMarker = "traces.dir";
|
|
50
|
-
function
|
|
51
|
-
if (!
|
|
52
|
-
return
|
|
53
|
-
if (
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
function validateTraceUrlOrPath(traceFileOrUrl) {
|
|
51
|
+
if (!traceFileOrUrl)
|
|
52
|
+
return traceFileOrUrl;
|
|
53
|
+
if (traceFileOrUrl.startsWith("http://") || traceFileOrUrl.startsWith("https://"))
|
|
54
|
+
return traceFileOrUrl;
|
|
55
|
+
let traceFile = traceFileOrUrl;
|
|
56
|
+
if (traceFile.endsWith(".json"))
|
|
57
|
+
return toFilePathUrl(traceFile);
|
|
57
58
|
try {
|
|
58
|
-
const stat = import_fs.default.statSync(
|
|
59
|
+
const stat = import_fs.default.statSync(traceFile);
|
|
59
60
|
if (stat.isDirectory())
|
|
60
|
-
|
|
61
|
-
return
|
|
61
|
+
traceFile = import_path.default.join(traceFile, tracesDirMarker);
|
|
62
|
+
return toFilePathUrl(traceFile);
|
|
62
63
|
} catch {
|
|
63
|
-
throw new Error(`Trace file ${
|
|
64
|
+
throw new Error(`Trace file ${traceFileOrUrl} does not exist!`);
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
async function startTraceViewerServer(options) {
|
|
@@ -90,7 +91,7 @@ async function startTraceViewerServer(options) {
|
|
|
90
91
|
});
|
|
91
92
|
const transport = options?.transport || (options?.isServer ? new StdinServer() : void 0);
|
|
92
93
|
if (transport)
|
|
93
|
-
server.createWebSocket(transport);
|
|
94
|
+
server.createWebSocket(() => transport);
|
|
94
95
|
const { host, port } = options || {};
|
|
95
96
|
await server.start({ preferredPort: port, host });
|
|
96
97
|
return server;
|
|
@@ -125,17 +126,16 @@ async function installRootRedirect(server, traceUrl, options) {
|
|
|
125
126
|
return true;
|
|
126
127
|
});
|
|
127
128
|
}
|
|
128
|
-
async function runTraceViewerApp(traceUrl, browserName, options
|
|
129
|
-
traceUrl =
|
|
129
|
+
async function runTraceViewerApp(traceUrl, browserName, options) {
|
|
130
|
+
traceUrl = validateTraceUrlOrPath(traceUrl);
|
|
130
131
|
const server = await startTraceViewerServer(options);
|
|
131
132
|
await installRootRedirect(server, traceUrl, options);
|
|
132
133
|
const page = await openTraceViewerApp(server.urlPrefix("precise"), browserName, options);
|
|
133
|
-
|
|
134
|
-
page.on("close", () => (0, import_utils.gracefullyProcessExitDoNotHang)(0));
|
|
134
|
+
page.on("close", () => (0, import_utils.gracefullyProcessExitDoNotHang)(0));
|
|
135
135
|
return page;
|
|
136
136
|
}
|
|
137
137
|
async function runTraceInBrowser(traceUrl, options) {
|
|
138
|
-
traceUrl =
|
|
138
|
+
traceUrl = validateTraceUrlOrPath(traceUrl);
|
|
139
139
|
const server = await startTraceViewerServer(options);
|
|
140
140
|
await installRootRedirect(server, traceUrl, options);
|
|
141
141
|
await openTraceInBrowser(server.urlPrefix("human-readable"));
|
|
@@ -177,8 +177,8 @@ async function openTraceInBrowser(url) {
|
|
|
177
177
|
class StdinServer {
|
|
178
178
|
constructor() {
|
|
179
179
|
process.stdin.on("data", (data) => {
|
|
180
|
-
const url = data.toString().trim();
|
|
181
|
-
if (url === this._traceUrl)
|
|
180
|
+
const url = validateTraceUrlOrPath(data.toString().trim());
|
|
181
|
+
if (!url || url === this._traceUrl)
|
|
182
182
|
return;
|
|
183
183
|
if (url.endsWith(".json"))
|
|
184
184
|
this._pollLoadTrace(url);
|
|
@@ -221,15 +221,18 @@ function traceDescriptor(traceDir, tracePrefix) {
|
|
|
221
221
|
};
|
|
222
222
|
for (const name of import_fs.default.readdirSync(traceDir)) {
|
|
223
223
|
if (!tracePrefix || name.startsWith(tracePrefix))
|
|
224
|
-
result.entries.push({ name, path: import_path.default.join(traceDir, name) });
|
|
224
|
+
result.entries.push({ name, path: toFilePathUrl(import_path.default.join(traceDir, name)) });
|
|
225
225
|
}
|
|
226
226
|
const resourcesDir = import_path.default.join(traceDir, "resources");
|
|
227
227
|
if (import_fs.default.existsSync(resourcesDir)) {
|
|
228
228
|
for (const name of import_fs.default.readdirSync(resourcesDir))
|
|
229
|
-
result.entries.push({ name: "resources/" + name, path: import_path.default.join(resourcesDir, name) });
|
|
229
|
+
result.entries.push({ name: "resources/" + name, path: toFilePathUrl(import_path.default.join(resourcesDir, name)) });
|
|
230
230
|
}
|
|
231
231
|
return result;
|
|
232
232
|
}
|
|
233
|
+
function toFilePathUrl(filePath) {
|
|
234
|
+
return `file?path=${encodeURIComponent(filePath)}`;
|
|
235
|
+
}
|
|
233
236
|
// Annotate the CommonJS export names for ESM import in node:
|
|
234
237
|
0 && (module.exports = {
|
|
235
238
|
installRootRedirect,
|
|
@@ -119,6 +119,13 @@ const USKeyboardLayout = {
|
|
|
119
119
|
"ArrowUp": { "keyCode": 38, "key": "ArrowUp" },
|
|
120
120
|
"ArrowRight": { "keyCode": 39, "key": "ArrowRight" },
|
|
121
121
|
"ArrowDown": { "keyCode": 40, "key": "ArrowDown" },
|
|
122
|
+
// Media keys
|
|
123
|
+
"AudioVolumeMute": { "keyCode": 173, "key": "AudioVolumeMute" },
|
|
124
|
+
"AudioVolumeDown": { "keyCode": 174, "key": "AudioVolumeDown" },
|
|
125
|
+
"AudioVolumeUp": { "keyCode": 175, "key": "AudioVolumeUp" },
|
|
126
|
+
"MediaTrackNext": { "keyCode": 176, "key": "MediaTrackNext" },
|
|
127
|
+
"MediaTrackPrevious": { "keyCode": 177, "key": "MediaTrackPrevious" },
|
|
128
|
+
"MediaPlayPause": { "keyCode": 179, "key": "MediaPlayPause" },
|
|
122
129
|
// Numpad
|
|
123
130
|
"NumLock": { "keyCode": 144, "key": "NumLock" },
|
|
124
131
|
"NumpadDivide": { "keyCode": 111, "key": "/", "location": 3 },
|
|
@@ -37,7 +37,7 @@ var import_pixelmatch = __toESM(require("../../third_party/pixelmatch"));
|
|
|
37
37
|
var import_utilsBundle = require("../../utilsBundle");
|
|
38
38
|
var import_utilsBundle2 = require("../../utilsBundle");
|
|
39
39
|
var import_utilsBundle3 = require("../../utilsBundle");
|
|
40
|
-
var import_imageUtils = require("
|
|
40
|
+
var import_imageUtils = require("../../utils/isomorphic/imageUtils");
|
|
41
41
|
function getComparator(mimeType) {
|
|
42
42
|
if (mimeType === "image/png")
|
|
43
43
|
return compareImages.bind(null, "image/png");
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var disposable_exports = {};
|
|
20
|
+
__export(disposable_exports, {
|
|
21
|
+
disposeAll: () => disposeAll
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(disposable_exports);
|
|
24
|
+
async function disposeAll(disposables) {
|
|
25
|
+
const copy = [...disposables];
|
|
26
|
+
disposables.length = 0;
|
|
27
|
+
await Promise.all(copy.map((d) => d.dispose()));
|
|
28
|
+
}
|
|
29
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
30
|
+
0 && (module.exports = {
|
|
31
|
+
disposeAll
|
|
32
|
+
});
|
|
@@ -24,7 +24,9 @@ module.exports = __toCommonJS(eventsHelper_exports);
|
|
|
24
24
|
class EventsHelper {
|
|
25
25
|
static addEventListener(emitter, eventName, handler) {
|
|
26
26
|
emitter.on(eventName, handler);
|
|
27
|
-
return { emitter, eventName, handler
|
|
27
|
+
return { emitter, eventName, handler, dispose: async () => {
|
|
28
|
+
emitter.removeListener(eventName, handler);
|
|
29
|
+
} };
|
|
28
30
|
}
|
|
29
31
|
static removeEventListeners(listeners) {
|
|
30
32
|
for (const listener of listeners)
|