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
|
@@ -51,12 +51,10 @@ class WebKit extends import_browserType.BrowserType {
|
|
|
51
51
|
CURL_COOKIE_JAR_PATH: process.platform === "win32" && isPersistent ? import_path.default.join(userDataDir, "cookiejar.db") : void 0
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
-
doRewriteStartupLog(
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
error.logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
|
|
59
|
-
return error;
|
|
54
|
+
doRewriteStartupLog(logs) {
|
|
55
|
+
if (logs.includes("Failed to open display") || logs.includes("cannot open display"))
|
|
56
|
+
logs = "\n" + (0, import_ascii.wrapInASCIIBox)(import_browserType.kNoXServerRunningError, 1);
|
|
57
|
+
return logs;
|
|
60
58
|
}
|
|
61
59
|
attemptToGracefullyCloseBrowser(transport) {
|
|
62
60
|
transport.send({ method: "Playwright.close", params: {}, id: import_wkConnection.kBrowserCloseMessageId });
|
|
@@ -38,9 +38,8 @@ var import_browserContext = require("../browserContext");
|
|
|
38
38
|
var network = __toESM(require("../network"));
|
|
39
39
|
var import_wkConnection = require("./wkConnection");
|
|
40
40
|
var import_wkPage = require("./wkPage");
|
|
41
|
-
var import_errors = require("../errors");
|
|
42
41
|
var import_webkit = require("./webkit");
|
|
43
|
-
const BROWSER_VERSION = "26.
|
|
42
|
+
const BROWSER_VERSION = "26.4";
|
|
44
43
|
const DEFAULT_USER_AGENT = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${BROWSER_VERSION} Safari/605.1.15`;
|
|
45
44
|
class WKBrowser extends import_browser.Browser {
|
|
46
45
|
constructor(parent, transport, options) {
|
|
@@ -56,7 +55,6 @@ class WKBrowser extends import_browser.Browser {
|
|
|
56
55
|
this._browserSession.on("Playwright.downloadCreated", this._onDownloadCreated.bind(this));
|
|
57
56
|
this._browserSession.on("Playwright.downloadFilenameSuggested", this._onDownloadFilenameSuggested.bind(this));
|
|
58
57
|
this._browserSession.on("Playwright.downloadFinished", this._onDownloadFinished.bind(this));
|
|
59
|
-
this._browserSession.on("Playwright.screencastFinished", this._onScreencastFinished.bind(this));
|
|
60
58
|
this._browserSession.on(import_wkConnection.kPageProxyMessageReceived, this._onPageProxyMessageReceived.bind(this));
|
|
61
59
|
}
|
|
62
60
|
static async connect(parent, transport, options) {
|
|
@@ -78,9 +76,6 @@ class WKBrowser extends import_browser.Browser {
|
|
|
78
76
|
for (const wkPage of this._wkPages.values())
|
|
79
77
|
wkPage.didClose();
|
|
80
78
|
this._wkPages.clear();
|
|
81
|
-
for (const video of this._idToVideo.values())
|
|
82
|
-
video.artifact.reportFinished(new import_errors.TargetClosedError());
|
|
83
|
-
this._idToVideo.clear();
|
|
84
79
|
this._didClose();
|
|
85
80
|
}
|
|
86
81
|
async doCreateNewContext(options) {
|
|
@@ -131,9 +126,6 @@ class WKBrowser extends import_browser.Browser {
|
|
|
131
126
|
_onDownloadFinished(payload) {
|
|
132
127
|
this._downloadFinished(payload.uuid, payload.error);
|
|
133
128
|
}
|
|
134
|
-
_onScreencastFinished(payload) {
|
|
135
|
-
this._takeVideo(payload.screencastId)?.reportFinished();
|
|
136
|
-
}
|
|
137
129
|
_onPageProxyCreated(event) {
|
|
138
130
|
const pageProxyId = event.pageProxyId;
|
|
139
131
|
let context = null;
|
|
@@ -315,7 +307,6 @@ class WKBrowserContext extends import_browserContext.BrowserContext {
|
|
|
315
307
|
}
|
|
316
308
|
async doClose(reason) {
|
|
317
309
|
if (!this._browserContextId) {
|
|
318
|
-
await Promise.all(this._wkPages().map((wkPage) => wkPage._stopVideo()));
|
|
319
310
|
await this._browser.close({ reason });
|
|
320
311
|
} else {
|
|
321
312
|
await this._browser._browserSession.send("Playwright.deleteContext", { browserContextId: this._browserContextId });
|
|
@@ -89,11 +89,6 @@ class WKSession extends import_events.EventEmitter {
|
|
|
89
89
|
this.connection = connection;
|
|
90
90
|
this.sessionId = sessionId;
|
|
91
91
|
this._rawSend = rawSend;
|
|
92
|
-
this.on = super.on;
|
|
93
|
-
this.off = super.removeListener;
|
|
94
|
-
this.addListener = super.addListener;
|
|
95
|
-
this.removeListener = super.removeListener;
|
|
96
|
-
this.once = super.once;
|
|
97
92
|
}
|
|
98
93
|
async send(method, params) {
|
|
99
94
|
if (this._crashed || this._disposed || this.connection._browserDisconnectedLogs)
|
|
@@ -134,7 +129,7 @@ class WKSession extends import_events.EventEmitter {
|
|
|
134
129
|
callback.resolve(object.result);
|
|
135
130
|
}
|
|
136
131
|
} else if (object.id && !object.error) {
|
|
137
|
-
(0, import_utils.assert)(this.isDisposed());
|
|
132
|
+
(0, import_utils.assert)(this.isDisposed(), JSON.stringify(object));
|
|
138
133
|
} else {
|
|
139
134
|
Promise.resolve().then(() => this.emit(object.method, object.params));
|
|
140
135
|
}
|
|
@@ -54,7 +54,7 @@ class WKInterceptableRequest {
|
|
|
54
54
|
constructor(session, frame, event, redirectedFrom, documentId) {
|
|
55
55
|
this._session = session;
|
|
56
56
|
this._requestId = event.requestId;
|
|
57
|
-
const resourceType = event.type ? event.type
|
|
57
|
+
const resourceType = event.type ? toResourceType(event.type) : redirectedFrom ? redirectedFrom.request.resourceType() : "other";
|
|
58
58
|
let postDataBuffer = null;
|
|
59
59
|
this._timestamp = event.timestamp;
|
|
60
60
|
this._wallTime = event.walltime * 1e3;
|
|
@@ -162,6 +162,34 @@ function wkMillisToRoundishMillis(value) {
|
|
|
162
162
|
}
|
|
163
163
|
return (value * 1e3 | 0) / 1e3;
|
|
164
164
|
}
|
|
165
|
+
function toResourceType(type) {
|
|
166
|
+
switch (type) {
|
|
167
|
+
case "Document":
|
|
168
|
+
return "document";
|
|
169
|
+
case "StyleSheet":
|
|
170
|
+
return "stylesheet";
|
|
171
|
+
case "Image":
|
|
172
|
+
return "image";
|
|
173
|
+
case "Font":
|
|
174
|
+
return "font";
|
|
175
|
+
case "Script":
|
|
176
|
+
return "script";
|
|
177
|
+
case "XHR":
|
|
178
|
+
return "xhr";
|
|
179
|
+
case "Fetch":
|
|
180
|
+
return "fetch";
|
|
181
|
+
case "Ping":
|
|
182
|
+
return "ping";
|
|
183
|
+
case "Beacon":
|
|
184
|
+
return "beacon";
|
|
185
|
+
case "WebSocket":
|
|
186
|
+
return "websocket";
|
|
187
|
+
case "EventSource":
|
|
188
|
+
return "eventsource";
|
|
189
|
+
default:
|
|
190
|
+
return "other";
|
|
191
|
+
}
|
|
192
|
+
}
|
|
165
193
|
// Annotate the CommonJS export names for ESM import in node:
|
|
166
194
|
0 && (module.exports = {
|
|
167
195
|
WKInterceptableRequest,
|
|
@@ -31,14 +31,13 @@ __export(wkPage_exports, {
|
|
|
31
31
|
WKPage: () => WKPage
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(wkPage_exports);
|
|
34
|
-
var import_path = __toESM(require("path"));
|
|
35
34
|
var import_utils = require("../../utils");
|
|
36
35
|
var import_headers = require("../../utils/isomorphic/headers");
|
|
37
|
-
var import_crypto = require("../utils/crypto");
|
|
38
36
|
var import_eventsHelper = require("../utils/eventsHelper");
|
|
39
37
|
var import_hostPlatform = require("../utils/hostPlatform");
|
|
40
38
|
var import_stackTrace = require("../../utils/isomorphic/stackTrace");
|
|
41
39
|
var import_utilsBundle = require("../../utilsBundle");
|
|
40
|
+
var import_browserContext = require("../browserContext");
|
|
42
41
|
var dialog = __toESM(require("../dialog"));
|
|
43
42
|
var dom = __toESM(require("../dom"));
|
|
44
43
|
var import_errors = require("../errors");
|
|
@@ -51,12 +50,15 @@ var import_wkInput = require("./wkInput");
|
|
|
51
50
|
var import_wkInterceptableRequest = require("./wkInterceptableRequest");
|
|
52
51
|
var import_wkProvisionalPage = require("./wkProvisionalPage");
|
|
53
52
|
var import_wkWorkers = require("./wkWorkers");
|
|
54
|
-
var import_debugLogger = require("../utils/debugLogger");
|
|
55
53
|
var import_webkit = require("./webkit");
|
|
54
|
+
var import_registry = require("../registry");
|
|
55
|
+
var import_videoRecorder = require("../videoRecorder");
|
|
56
56
|
const UTILITY_WORLD_NAME = "__playwright_utility_world__";
|
|
57
|
+
const enableFrameSessions = !process.env.WK_DISABLE_FRAME_SESSIONS && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) >= 2245 && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) <= 2255;
|
|
57
58
|
class WKPage {
|
|
58
59
|
constructor(browserContext, pageProxySession, opener) {
|
|
59
60
|
this._provisionalPage = null;
|
|
61
|
+
this._targetIdToFrameSession = /* @__PURE__ */ new Map();
|
|
60
62
|
this._requestIdToRequest = /* @__PURE__ */ new Map();
|
|
61
63
|
this._requestIdToRequestWillBeSentEvent = /* @__PURE__ */ new Map();
|
|
62
64
|
this._sessionListeners = [];
|
|
@@ -66,7 +68,6 @@ class WKPage {
|
|
|
66
68
|
};
|
|
67
69
|
this._lastConsoleMessage = null;
|
|
68
70
|
this._requestIdToResponseReceivedPayloadEvent = /* @__PURE__ */ new Map();
|
|
69
|
-
this._recordingVideoFile = null;
|
|
70
71
|
this._screencastGeneration = 0;
|
|
71
72
|
this._pageProxySession = pageProxySession;
|
|
72
73
|
this._opener = opener;
|
|
@@ -116,16 +117,7 @@ class WKPage {
|
|
|
116
117
|
for (const [key, value] of this._browserContext._permissions)
|
|
117
118
|
promises.push(this._grantPermissions(key, value));
|
|
118
119
|
}
|
|
119
|
-
|
|
120
|
-
const outputFile = import_path.default.join(this._browserContext._options.recordVideo.dir, (0, import_crypto.createGuid)() + ".webm");
|
|
121
|
-
promises.push(this._browserContext._ensureVideosPath().then(() => {
|
|
122
|
-
return this._startVideo({
|
|
123
|
-
// validateBrowserContextOptions ensures correct video size.
|
|
124
|
-
...this._browserContext._options.recordVideo.size,
|
|
125
|
-
outputFile
|
|
126
|
-
});
|
|
127
|
-
}));
|
|
128
|
-
}
|
|
120
|
+
(0, import_videoRecorder.startAutomaticVideoRecording)(this._page);
|
|
129
121
|
await Promise.all(promises);
|
|
130
122
|
}
|
|
131
123
|
_setSession(session) {
|
|
@@ -159,10 +151,13 @@ class WKPage {
|
|
|
159
151
|
session.send("Page.createUserWorld", { name: UTILITY_WORLD_NAME }).catch((_) => {
|
|
160
152
|
}),
|
|
161
153
|
// Worlds are per-process
|
|
162
|
-
session.send("Console.enable"),
|
|
163
154
|
session.send("Network.enable"),
|
|
164
155
|
this._workers.initializeSession(session)
|
|
165
156
|
];
|
|
157
|
+
if (enableFrameSessions)
|
|
158
|
+
this._initializeFrameSessions(frameTree.frameTree, promises);
|
|
159
|
+
else
|
|
160
|
+
promises.push(session.send("Console.enable"));
|
|
166
161
|
if (this._page.browserContext.needsPlaywrightBinding())
|
|
167
162
|
promises.push(session.send("Runtime.addBinding", { name: import_page.PageBinding.kBindingName }));
|
|
168
163
|
if (this._page.needsRequestInterception()) {
|
|
@@ -219,6 +214,13 @@ class WKPage {
|
|
|
219
214
|
promises.push(session.send("Page.overrideSetting", { setting: "FixedBackgroundsPaintRelativeToDocument", value: contextOptions.isMobile }));
|
|
220
215
|
await Promise.all(promises);
|
|
221
216
|
}
|
|
217
|
+
_initializeFrameSessions(frame, promises) {
|
|
218
|
+
const session = this._targetIdToFrameSession.get(`frame-${frame.frame.id}`);
|
|
219
|
+
if (session)
|
|
220
|
+
promises.push(session.initialize());
|
|
221
|
+
for (const childFrame of frame.childFrames || [])
|
|
222
|
+
this._initializeFrameSessions(childFrame, promises);
|
|
223
|
+
}
|
|
222
224
|
_onDidCommitProvisionalTarget(event) {
|
|
223
225
|
const { oldTargetId, newTargetId } = event;
|
|
224
226
|
(0, import_utils.assert)(this._provisionalPage);
|
|
@@ -244,6 +246,9 @@ class WKPage {
|
|
|
244
246
|
this._session.markAsCrashed();
|
|
245
247
|
this._page._didCrash();
|
|
246
248
|
}
|
|
249
|
+
} else if (this._targetIdToFrameSession.has(targetId)) {
|
|
250
|
+
this._targetIdToFrameSession.get(targetId).dispose();
|
|
251
|
+
this._targetIdToFrameSession.delete(targetId);
|
|
247
252
|
}
|
|
248
253
|
}
|
|
249
254
|
didClose() {
|
|
@@ -257,7 +262,7 @@ class WKPage {
|
|
|
257
262
|
this._provisionalPage.dispose();
|
|
258
263
|
this._provisionalPage = null;
|
|
259
264
|
}
|
|
260
|
-
this._firstNonInitialNavigationCommittedReject(new import_errors.TargetClosedError());
|
|
265
|
+
this._firstNonInitialNavigationCommittedReject(new import_errors.TargetClosedError(this._page.closeReason()));
|
|
261
266
|
this._page._didClose();
|
|
262
267
|
}
|
|
263
268
|
dispatchMessageToSession(message) {
|
|
@@ -288,8 +293,15 @@ class WKPage {
|
|
|
288
293
|
session.dispatchMessage({ id: message.id, error: { message: e.message } });
|
|
289
294
|
});
|
|
290
295
|
});
|
|
291
|
-
if (targetInfo.type === "frame")
|
|
296
|
+
if (targetInfo.type === "frame") {
|
|
297
|
+
if (enableFrameSessions) {
|
|
298
|
+
const wkFrame = new WKFrame(this, session);
|
|
299
|
+
this._targetIdToFrameSession.set(targetInfo.targetId, wkFrame);
|
|
300
|
+
await wkFrame.initialize().catch((e) => {
|
|
301
|
+
});
|
|
302
|
+
}
|
|
292
303
|
return;
|
|
304
|
+
}
|
|
293
305
|
(0, import_utils.assert)(targetInfo.type === "page", "Only page targets are expected in WebKit, received: " + targetInfo.type);
|
|
294
306
|
if (!targetInfo.isProvisional) {
|
|
295
307
|
(0, import_utils.assert)(!this._page.initializedOrUndefined());
|
|
@@ -331,6 +343,8 @@ class WKPage {
|
|
|
331
343
|
this._provisionalPage._session.dispatchMessage(JSON.parse(message));
|
|
332
344
|
else if (this._session.sessionId === targetId)
|
|
333
345
|
this._session.dispatchMessage(JSON.parse(message));
|
|
346
|
+
else if (this._targetIdToFrameSession.has(targetId))
|
|
347
|
+
this._targetIdToFrameSession.get(targetId)._session.dispatchMessage(JSON.parse(message));
|
|
334
348
|
else
|
|
335
349
|
throw new Error("Unknown target: " + targetId);
|
|
336
350
|
}
|
|
@@ -453,7 +467,7 @@ class WKPage {
|
|
|
453
467
|
}
|
|
454
468
|
async navigateFrame(frame, url, referrer) {
|
|
455
469
|
if (this._pageProxySession.isDisposed())
|
|
456
|
-
throw new import_errors.TargetClosedError();
|
|
470
|
+
throw new import_errors.TargetClosedError(this._page.closeReason());
|
|
457
471
|
const pageProxyId = this._pageProxySession.sessionId;
|
|
458
472
|
const result = await this._pageProxySession.connection.browserSession.send("Playwright.navigate", { url, pageProxyId, frameId: frame._id, referrer });
|
|
459
473
|
return { newDocumentId: result.loaderId };
|
|
@@ -506,7 +520,7 @@ class WKPage {
|
|
|
506
520
|
columnNumber: (columnNumber || 1) - 1
|
|
507
521
|
}
|
|
508
522
|
};
|
|
509
|
-
this._onConsoleRepeatCountUpdated({ count: 1 });
|
|
523
|
+
this._onConsoleRepeatCountUpdated({ count: 1, timestamp: event.message.timestamp });
|
|
510
524
|
}
|
|
511
525
|
_onConsoleRepeatCountUpdated(event) {
|
|
512
526
|
if (this._lastConsoleMessage) {
|
|
@@ -517,8 +531,9 @@ class WKPage {
|
|
|
517
531
|
count,
|
|
518
532
|
location
|
|
519
533
|
} = this._lastConsoleMessage;
|
|
534
|
+
const timestamp = event.timestamp ? event.timestamp * 1e3 : Date.now();
|
|
520
535
|
for (let i = count; i < event.count; ++i)
|
|
521
|
-
this._page.addConsoleMessage(null, derivedType, handles, location, handles.length ? void 0 : text);
|
|
536
|
+
this._page.addConsoleMessage(null, derivedType, handles, location, handles.length ? void 0 : text, timestamp);
|
|
522
537
|
this._lastConsoleMessage.count = event.count;
|
|
523
538
|
}
|
|
524
539
|
}
|
|
@@ -633,9 +648,11 @@ class WKPage {
|
|
|
633
648
|
async updateUserAgent() {
|
|
634
649
|
const contextOptions = this._browserContext._options;
|
|
635
650
|
this._updateState("Page.overrideUserAgent", { value: contextOptions.userAgent });
|
|
651
|
+
const { navigatorPlatform } = (0, import_browserContext.calculateUserAgentEmulation)(contextOptions);
|
|
652
|
+
this._updateState("Page.overridePlatform", navigatorPlatform ? { value: navigatorPlatform } : {});
|
|
636
653
|
}
|
|
637
654
|
async bringToFront() {
|
|
638
|
-
this._pageProxySession.send("Target.activate", {
|
|
655
|
+
await this._pageProxySession.send("Target.activate", {
|
|
639
656
|
targetId: this._session.sessionId
|
|
640
657
|
});
|
|
641
658
|
}
|
|
@@ -748,7 +765,6 @@ class WKPage {
|
|
|
748
765
|
await this._updateState("Page.setBootstrapScript", { source: this._calculateBootstrapScript() });
|
|
749
766
|
}
|
|
750
767
|
async closePage(runBeforeUnload) {
|
|
751
|
-
await this._stopVideo();
|
|
752
768
|
await this._pageProxySession.sendMayFail("Target.close", {
|
|
753
769
|
targetId: this._session.sessionId,
|
|
754
770
|
runBeforeUnload
|
|
@@ -762,23 +778,6 @@ class WKPage {
|
|
|
762
778
|
return import_hostPlatform.hostPlatform === "mac10.15" ? 55 : 59;
|
|
763
779
|
return 0;
|
|
764
780
|
}
|
|
765
|
-
async _startVideo(options) {
|
|
766
|
-
(0, import_utils.assert)(!this._recordingVideoFile);
|
|
767
|
-
const { screencastId } = await this._pageProxySession.send("Screencast.startVideo", {
|
|
768
|
-
file: this._browserContext._browser.options.channel === "webkit-wsl" ? await (0, import_webkit.translatePathToWSL)(options.outputFile) : options.outputFile,
|
|
769
|
-
width: options.width,
|
|
770
|
-
height: options.height,
|
|
771
|
-
toolbarHeight: this._toolbarHeight()
|
|
772
|
-
});
|
|
773
|
-
this._recordingVideoFile = options.outputFile;
|
|
774
|
-
this._browserContext._browser._videoStarted(this._browserContext, screencastId, options.outputFile, this._page.waitForInitializedOrError());
|
|
775
|
-
}
|
|
776
|
-
async _stopVideo() {
|
|
777
|
-
if (!this._recordingVideoFile)
|
|
778
|
-
return;
|
|
779
|
-
await this._pageProxySession.sendMayFail("Screencast.stopVideo");
|
|
780
|
-
this._recordingVideoFile = null;
|
|
781
|
-
}
|
|
782
781
|
validateScreenshotDimension(side, omitDeviceScaleFactor) {
|
|
783
782
|
if (process.platform === "darwin")
|
|
784
783
|
return;
|
|
@@ -845,25 +844,28 @@ class WKPage {
|
|
|
845
844
|
throw e;
|
|
846
845
|
});
|
|
847
846
|
}
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
}
|
|
847
|
+
startScreencast(options) {
|
|
848
|
+
this._pageProxySession.send("Screencast.startScreencast", {
|
|
849
|
+
quality: options.quality,
|
|
850
|
+
width: options.width,
|
|
851
|
+
height: options.height,
|
|
852
|
+
toolbarHeight: this._toolbarHeight()
|
|
853
|
+
}).then(({ generation }) => this._screencastGeneration = generation).catch(() => {
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
stopScreencast() {
|
|
857
|
+
this._pageProxySession.sendMayFail("Screencast.stopScreencast");
|
|
856
858
|
}
|
|
857
859
|
_onScreencastFrame(event) {
|
|
858
860
|
const generation = this._screencastGeneration;
|
|
859
|
-
this._page.throttleScreencastFrameAck(() => {
|
|
860
|
-
this._pageProxySession.send("Screencast.screencastFrameAck", { generation }).catch((e) => import_debugLogger.debugLogger.log("error", e));
|
|
861
|
-
});
|
|
862
861
|
const buffer = Buffer.from(event.data, "base64");
|
|
863
|
-
this._page.
|
|
862
|
+
this._page.screencast.onScreencastFrame({
|
|
864
863
|
buffer,
|
|
865
|
-
|
|
866
|
-
|
|
864
|
+
frameSwapWallTime: event.timestamp ? event.timestamp * 1e3 : Date.now(),
|
|
865
|
+
viewportWidth: event.deviceWidth,
|
|
866
|
+
viewportHeight: event.deviceHeight
|
|
867
|
+
}, () => {
|
|
868
|
+
this._pageProxySession.sendMayFail("Screencast.screencastFrameAck", { generation });
|
|
867
869
|
});
|
|
868
870
|
}
|
|
869
871
|
rafCountForStablePosition() {
|
|
@@ -886,7 +888,7 @@ class WKPage {
|
|
|
886
888
|
const pageProxyId = this._pageProxySession.sessionId;
|
|
887
889
|
const objectId = handle._objectId;
|
|
888
890
|
if (this._browserContext._browser?.options.channel === "webkit-wsl")
|
|
889
|
-
paths = await Promise.all(paths.map((
|
|
891
|
+
paths = await Promise.all(paths.map((path) => (0, import_webkit.translatePathToWSL)(path)));
|
|
890
892
|
await Promise.all([
|
|
891
893
|
this._pageProxySession.connection.browserSession.send("Playwright.grantFileReadAccess", { pageProxyId, paths }),
|
|
892
894
|
this._session.send("DOM.setInputFiles", { objectId, paths })
|
|
@@ -977,6 +979,7 @@ class WKPage {
|
|
|
977
979
|
}
|
|
978
980
|
_handleRequestRedirect(request, requestId, responsePayload, timestamp) {
|
|
979
981
|
const response = request.createResponse(responsePayload);
|
|
982
|
+
response._setHttpVersion(null);
|
|
980
983
|
response._securityDetailsFinished();
|
|
981
984
|
response._serverAddrFinished();
|
|
982
985
|
response.setResponseHeadersSize(null);
|
|
@@ -1029,8 +1032,7 @@ class WKPage {
|
|
|
1029
1032
|
validFrom: responseReceivedPayload?.response.security?.certificate?.validFrom,
|
|
1030
1033
|
validTo: responseReceivedPayload?.response.security?.certificate?.validUntil
|
|
1031
1034
|
});
|
|
1032
|
-
|
|
1033
|
-
response._setHttpVersion(event.metrics.protocol);
|
|
1035
|
+
response._setHttpVersion(event.metrics?.protocol ?? null);
|
|
1034
1036
|
response.setEncodedBodySize(event.metrics?.responseBodyBytesReceived ?? null);
|
|
1035
1037
|
response.setResponseHeadersSize(event.metrics?.responseHeaderBytesReceived ?? null);
|
|
1036
1038
|
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
@@ -1054,6 +1056,7 @@ class WKPage {
|
|
|
1054
1056
|
if (response) {
|
|
1055
1057
|
response._serverAddrFinished();
|
|
1056
1058
|
response._securityDetailsFinished();
|
|
1059
|
+
response._setHttpVersion(null);
|
|
1057
1060
|
response.setResponseHeadersSize(null);
|
|
1058
1061
|
response.setEncodedBodySize(null);
|
|
1059
1062
|
response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
|
|
@@ -1068,7 +1071,8 @@ class WKPage {
|
|
|
1068
1071
|
const webPermissionToProtocol = /* @__PURE__ */ new Map([
|
|
1069
1072
|
["geolocation", "geolocation"],
|
|
1070
1073
|
["notifications", "notifications"],
|
|
1071
|
-
["clipboard-read", "clipboard-read"]
|
|
1074
|
+
["clipboard-read", "clipboard-read"],
|
|
1075
|
+
["screen-wake-lock", "screen-wake-lock"]
|
|
1072
1076
|
]);
|
|
1073
1077
|
const filtered = permissions.map((permission) => {
|
|
1074
1078
|
const protocolPermission = webPermissionToProtocol.get(permission);
|
|
@@ -1084,6 +1088,33 @@ class WKPage {
|
|
|
1084
1088
|
shouldToggleStyleSheetToSyncAnimations() {
|
|
1085
1089
|
return true;
|
|
1086
1090
|
}
|
|
1091
|
+
async setDockTile(image) {
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
class WKFrame {
|
|
1095
|
+
constructor(page, session) {
|
|
1096
|
+
this._sessionListeners = [];
|
|
1097
|
+
this._initializePromise = null;
|
|
1098
|
+
this._page = page;
|
|
1099
|
+
this._session = session;
|
|
1100
|
+
}
|
|
1101
|
+
async initialize() {
|
|
1102
|
+
if (this._initializePromise)
|
|
1103
|
+
return this._initializePromise;
|
|
1104
|
+
this._initializePromise = this._initializeImpl();
|
|
1105
|
+
return this._initializePromise;
|
|
1106
|
+
}
|
|
1107
|
+
async _initializeImpl() {
|
|
1108
|
+
this._sessionListeners = [
|
|
1109
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageAdded", (event) => this._page._onConsoleMessage(event)),
|
|
1110
|
+
import_eventsHelper.eventsHelper.addEventListener(this._session, "Console.messageRepeatCountUpdated", (event) => this._page._onConsoleRepeatCountUpdated(event))
|
|
1111
|
+
];
|
|
1112
|
+
await this._session.send("Console.enable");
|
|
1113
|
+
}
|
|
1114
|
+
dispose() {
|
|
1115
|
+
import_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
|
|
1116
|
+
this._session.dispose();
|
|
1117
|
+
}
|
|
1087
1118
|
}
|
|
1088
1119
|
function parseRemoteAddress(value) {
|
|
1089
1120
|
if (!value)
|
|
@@ -96,7 +96,8 @@ class WKWorkers {
|
|
|
96
96
|
lineNumber: (lineNumber || 1) - 1,
|
|
97
97
|
columnNumber: (columnNumber || 1) - 1
|
|
98
98
|
};
|
|
99
|
-
|
|
99
|
+
const timestamp = event.message.timestamp ? event.message.timestamp * 1e3 : Date.now();
|
|
100
|
+
this._page.addConsoleMessage(worker, derivedType, handles, location, handles.length ? void 0 : text, timestamp);
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
103
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var serverRegistry_exports = {};
|
|
30
|
+
__export(serverRegistry_exports, {
|
|
31
|
+
serverRegistry: () => serverRegistry
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(serverRegistry_exports);
|
|
34
|
+
var import_fs = __toESM(require("fs"));
|
|
35
|
+
var import_net = __toESM(require("net"));
|
|
36
|
+
var import_path = __toESM(require("path"));
|
|
37
|
+
var import_os = __toESM(require("os"));
|
|
38
|
+
const packageVersion = require("../package.json").version;
|
|
39
|
+
class ServerRegistry {
|
|
40
|
+
async list() {
|
|
41
|
+
const files = await import_fs.default.promises.readdir(this._browsersDir()).catch(() => []);
|
|
42
|
+
const result = /* @__PURE__ */ new Map();
|
|
43
|
+
for (const file of files) {
|
|
44
|
+
try {
|
|
45
|
+
const filePath = import_path.default.join(this._browsersDir(), file);
|
|
46
|
+
const content = await import_fs.default.promises.readFile(filePath, "utf-8");
|
|
47
|
+
const descriptor = JSON.parse(content);
|
|
48
|
+
const key = descriptor.workspaceDir ?? "";
|
|
49
|
+
let list = result.get(key);
|
|
50
|
+
if (!list) {
|
|
51
|
+
list = [];
|
|
52
|
+
result.set(key, list);
|
|
53
|
+
}
|
|
54
|
+
list.push(canConnect(descriptor).then((connectable) => ({ ...descriptor, canConnect: connectable, file: filePath })));
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const resolvedResult = /* @__PURE__ */ new Map();
|
|
59
|
+
for (const [key, promises] of result) {
|
|
60
|
+
const entries = await Promise.all(promises);
|
|
61
|
+
const descriptors = [];
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
if (!entry.canConnect && !entry.browser.userDataDir) {
|
|
64
|
+
await import_fs.default.promises.unlink(entry.file).catch(() => {
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
descriptors.push(entry);
|
|
69
|
+
}
|
|
70
|
+
if (descriptors.length)
|
|
71
|
+
resolvedResult.set(key, descriptors);
|
|
72
|
+
}
|
|
73
|
+
return resolvedResult;
|
|
74
|
+
}
|
|
75
|
+
async create(browser, endpoint) {
|
|
76
|
+
const file = import_path.default.join(this._browsersDir(), browser.guid);
|
|
77
|
+
await import_fs.default.promises.mkdir(this._browsersDir(), { recursive: true });
|
|
78
|
+
const descriptor = {
|
|
79
|
+
playwrightVersion: packageVersion,
|
|
80
|
+
playwrightLib: require.resolve(".."),
|
|
81
|
+
title: endpoint.title,
|
|
82
|
+
browser,
|
|
83
|
+
endpoint: endpoint.endpoint,
|
|
84
|
+
workspaceDir: endpoint.workspaceDir
|
|
85
|
+
};
|
|
86
|
+
await import_fs.default.promises.writeFile(file, JSON.stringify(descriptor), "utf-8");
|
|
87
|
+
}
|
|
88
|
+
async delete(guid) {
|
|
89
|
+
const file = import_path.default.join(this._browsersDir(), guid);
|
|
90
|
+
await import_fs.default.promises.unlink(file).catch(() => {
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async deleteUserData(guid) {
|
|
94
|
+
const filePath = import_path.default.join(this._browsersDir(), guid);
|
|
95
|
+
const content = await import_fs.default.promises.readFile(filePath, "utf-8");
|
|
96
|
+
const descriptor = JSON.parse(content);
|
|
97
|
+
if (descriptor.browser.userDataDir)
|
|
98
|
+
await import_fs.default.promises.rm(descriptor.browser.userDataDir, { recursive: true, force: true });
|
|
99
|
+
await import_fs.default.promises.unlink(filePath);
|
|
100
|
+
}
|
|
101
|
+
readDescriptor(guid) {
|
|
102
|
+
const filePath = import_path.default.join(this._browsersDir(), guid);
|
|
103
|
+
const content = import_fs.default.readFileSync(filePath, "utf-8");
|
|
104
|
+
const descriptor = JSON.parse(content);
|
|
105
|
+
return descriptor;
|
|
106
|
+
}
|
|
107
|
+
async find(name) {
|
|
108
|
+
const entries = await this.list();
|
|
109
|
+
for (const [, browsers] of entries) {
|
|
110
|
+
for (const browser of browsers) {
|
|
111
|
+
if (browser.title === name)
|
|
112
|
+
return browser;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
_browsersDir() {
|
|
118
|
+
return process.env.PLAYWRIGHT_SERVER_REGISTRY || registryDirectory;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function canConnect(descriptor) {
|
|
122
|
+
if (!descriptor.endpoint)
|
|
123
|
+
return false;
|
|
124
|
+
if (descriptor.endpoint.startsWith("ws://") || descriptor.endpoint.startsWith("wss://")) {
|
|
125
|
+
return await new Promise((resolve) => {
|
|
126
|
+
const url = new URL(descriptor.endpoint);
|
|
127
|
+
const socket = import_net.default.createConnection(Number(url.port), url.hostname, () => {
|
|
128
|
+
socket.destroy();
|
|
129
|
+
resolve(true);
|
|
130
|
+
});
|
|
131
|
+
socket.on("error", () => resolve(false));
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return await new Promise((resolve) => {
|
|
135
|
+
const socket = import_net.default.createConnection(descriptor.endpoint ?? descriptor.pipeName, () => {
|
|
136
|
+
socket.destroy();
|
|
137
|
+
resolve(true);
|
|
138
|
+
});
|
|
139
|
+
socket.on("error", () => resolve(false));
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const defaultCacheDirectory = (() => {
|
|
143
|
+
if (process.platform === "linux")
|
|
144
|
+
return process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
|
|
145
|
+
if (process.platform === "darwin")
|
|
146
|
+
return import_path.default.join(import_os.default.homedir(), "Library", "Caches");
|
|
147
|
+
if (process.platform === "win32")
|
|
148
|
+
return process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
|
|
149
|
+
throw new Error("Unsupported platform: " + process.platform);
|
|
150
|
+
})();
|
|
151
|
+
const registryDirectory = import_path.default.join(defaultCacheDirectory, "ms-playwright", "b");
|
|
152
|
+
const serverRegistry = new ServerRegistry();
|
|
153
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
154
|
+
0 && (module.exports = {
|
|
155
|
+
serverRegistry
|
|
156
|
+
});
|