patchright-core 1.58.2 → 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 +126 -650
- package/browsers.json +16 -14
- 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 +47 -411
- package/lib/client/android.js +4 -4
- package/lib/client/api.js +3 -3
- package/lib/client/browser.js +8 -0
- package/lib/client/browserContext.js +22 -61
- package/lib/client/browserType.js +19 -51
- 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 -4
- 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 -4
- package/lib/client/events.js +3 -3
- package/lib/client/fetch.js +0 -1
- package/lib/client/frame.js +10 -23
- package/lib/client/harRouter.js +13 -1
- package/lib/client/jsHandle.js +4 -8
- package/lib/client/locator.js +13 -44
- package/lib/client/network.js +15 -16
- package/lib/client/page.js +41 -75
- package/lib/client/platform.js +0 -3
- 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 +0 -6
- package/lib/mcpBundleImpl.js +91 -0
- package/lib/protocol/validator.js +224 -138
- 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 +13 -8
- 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/bidi/bidiBrowser.js +30 -8
- package/lib/server/bidi/bidiChromium.js +18 -5
- package/lib/server/bidi/bidiNetworkManager.js +39 -11
- package/lib/server/bidi/bidiPage.js +31 -15
- package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
- package/lib/server/browser.js +84 -21
- package/lib/server/browserContext.js +110 -58
- package/lib/server/browserType.js +14 -12
- package/lib/server/chromium/chromium.js +15 -12
- package/lib/server/chromium/chromiumSwitches.js +14 -2
- package/lib/server/chromium/crBrowser.js +20 -17
- package/lib/server/chromium/crCoverage.js +1 -13
- package/lib/server/chromium/crDevTools.js +1 -0
- package/lib/server/chromium/crNetworkManager.js +12 -267
- package/lib/server/chromium/crPage.js +67 -199
- package/lib/server/chromium/crServiceWorker.js +7 -14
- package/lib/server/clock.js +33 -41
- 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 +29 -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 +1 -1
- package/lib/server/dispatchers/disposableDispatcher.js +39 -0
- package/lib/server/dispatchers/electronDispatcher.js +2 -1
- package/lib/server/dispatchers/frameDispatcher.js +6 -6
- package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
- package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
- package/lib/server/dispatchers/networkDispatchers.js +6 -5
- package/lib/server/dispatchers/pageDispatcher.js +101 -38
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
- package/lib/server/disposable.js +41 -0
- package/lib/server/dom.js +44 -26
- package/lib/server/download.js +3 -2
- package/lib/server/electron/electron.js +12 -7
- package/lib/server/firefox/ffBrowser.js +9 -19
- package/lib/server/firefox/ffInput.js +21 -5
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +24 -27
- package/lib/server/frameSelectors.js +5 -172
- package/lib/server/frames.js +234 -687
- 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 +5 -0
- package/lib/server/javascript.js +6 -26
- package/lib/server/launchApp.js +1 -3
- package/lib/server/localUtils.js +6 -6
- package/lib/server/network.js +9 -8
- package/lib/server/overlay.js +138 -0
- package/lib/server/page.js +157 -105
- package/lib/server/progress.js +6 -0
- package/lib/server/recorder/recorderApp.js +9 -8
- package/lib/server/recorder.js +76 -40
- package/lib/server/registry/index.js +55 -82
- package/lib/server/registry/nativeDeps.js +1 -0
- package/lib/server/screencast.js +90 -143
- package/lib/server/screenshotter.js +0 -6
- package/lib/server/trace/recorder/snapshotter.js +8 -17
- package/lib/server/trace/recorder/snapshotterInjected.js +82 -20
- package/lib/server/trace/recorder/tracing.js +87 -44
- package/lib/server/trace/viewer/traceViewer.js +3 -4
- 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/fileUtils.js +16 -2
- package/lib/server/utils/happyEyeballs.js +15 -12
- package/lib/server/utils/hostPlatform.js +0 -15
- package/lib/server/utils/httpServer.js +5 -3
- package/lib/server/utils/network.js +2 -1
- package/lib/server/utils/nodePlatform.js +0 -6
- package/lib/server/utils/processLauncher.js +8 -6
- package/lib/server/utils/zipFile.js +2 -2
- package/lib/server/videoRecorder.js +82 -12
- package/lib/server/webkit/wkBrowser.js +1 -6
- package/lib/server/webkit/wkPage.js +27 -25
- 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/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
- 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/formatUtils.js +64 -0
- package/lib/utils/isomorphic/jsonSchema.js +89 -0
- package/lib/utils/isomorphic/mimeType.js +7 -2
- package/lib/utils/isomorphic/protocolFormatter.js +2 -2
- package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
- package/lib/utils/isomorphic/stringUtils.js +3 -3
- package/lib/utils/isomorphic/timeoutRunner.js +3 -3
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
- package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
- package/lib/utils/isomorphic/trace/traceModel.js +3 -2
- package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
- package/lib/utils/isomorphic/urlMatch.js +54 -1
- package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
- package/lib/utils.js +6 -2
- package/lib/utilsBundle.js +3 -21
- package/lib/utilsBundleImpl/index.js +132 -133
- 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-CFUTFUO7.js → codeMirrorModule-C8KMvO9L.js} +20 -20
- package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-BVA4h_ZY.js → codeMirrorModule-DS0FLvoc.js} +20 -20
- package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
- package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
- package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
- package/lib/vite/traceViewer/{index.BtyWtaE-.js → index.Dtstcb7U.js} +1 -1
- package/lib/vite/traceViewer/index.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +4 -4
- 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 +6 -1
- package/types/protocol.d.ts +947 -51
- package/types/types.d.ts +854 -74
- package/lib/client/pageAgent.js +0 -64
- package/lib/mcpBundleImpl/index.js +0 -147
- package/lib/server/agent/actionRunner.js +0 -335
- package/lib/server/agent/actions.js +0 -128
- package/lib/server/agent/codegen.js +0 -111
- package/lib/server/agent/context.js +0 -150
- package/lib/server/agent/expectTools.js +0 -156
- package/lib/server/agent/pageAgent.js +0 -204
- package/lib/server/agent/performTools.js +0 -262
- package/lib/server/agent/tool.js +0 -109
- package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
- package/lib/server/pageBinding.js +0 -87
- package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
- package/lib/vite/recorder/assets/index-CVkBxsGf.js +0 -193
- package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +0 -266
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
- package/lib/vite/traceViewer/uiMode.fyrXARf2.js +0 -5
- /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
- /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
package/lib/server/recorder.js
CHANGED
|
@@ -41,6 +41,7 @@ var import_recorderUtils = require("./recorder/recorderUtils");
|
|
|
41
41
|
var import_locatorParser = require("../utils/isomorphic/locatorParser");
|
|
42
42
|
var import_selectorParser = require("../utils/isomorphic/selectorParser");
|
|
43
43
|
var import_progress = require("./progress");
|
|
44
|
+
var import_manualPromise = require("../utils/isomorphic/manualPromise");
|
|
44
45
|
var import_recorderSignalProcessor = require("./recorder/recorderSignalProcessor");
|
|
45
46
|
var rawRecorderSource = __toESM(require("./../generated/pollingRecorderSource"));
|
|
46
47
|
var import_utils2 = require("./../utils");
|
|
@@ -144,8 +145,11 @@ class Recorder extends import_events.default {
|
|
|
144
145
|
}
|
|
145
146
|
}
|
|
146
147
|
}
|
|
148
|
+
let mode = this._mode;
|
|
149
|
+
if (this._pickLocatorPage && source.page !== this._pickLocatorPage)
|
|
150
|
+
mode = "none";
|
|
147
151
|
const uiState = {
|
|
148
|
-
mode
|
|
152
|
+
mode,
|
|
149
153
|
actionPoint,
|
|
150
154
|
actionSelector,
|
|
151
155
|
ariaTemplate: this._highlightedElement.ariaTemplate,
|
|
@@ -162,7 +166,7 @@ class Recorder extends import_events.default {
|
|
|
162
166
|
await this._context.exposeBinding(progress, "__pw_recorderSetMode", false, async ({ frame }, mode) => {
|
|
163
167
|
if (frame.parentFrame())
|
|
164
168
|
return;
|
|
165
|
-
this.setMode(mode);
|
|
169
|
+
await this.setMode(mode);
|
|
166
170
|
});
|
|
167
171
|
await this._context.exposeBinding(progress, "__pw_recorderSetOverlayState", false, async ({ frame }, state) => {
|
|
168
172
|
if (frame.parentFrame())
|
|
@@ -170,7 +174,7 @@ class Recorder extends import_events.default {
|
|
|
170
174
|
this._overlayState = state;
|
|
171
175
|
});
|
|
172
176
|
await this._context.exposeBinding(progress, "__pw_resume", false, () => {
|
|
173
|
-
this._debugger.resume(
|
|
177
|
+
this._debugger.resume();
|
|
174
178
|
});
|
|
175
179
|
this._context.on(import_browserContext.BrowserContext.Events.Page, (page) => this._onPage(page));
|
|
176
180
|
for (const page of this._context.pages())
|
|
@@ -191,17 +195,16 @@ class Recorder extends import_events.default {
|
|
|
191
195
|
false,
|
|
192
196
|
(source, action) => this._recordAction(source.frame, action)
|
|
193
197
|
);
|
|
194
|
-
await this._context.extendInjectedScript(rawRecorderSource.source, { recorderMode: this._recorderMode });
|
|
198
|
+
await this._context.extendInjectedScript(rawRecorderSource.source, { recorderMode: this._recorderMode, hideToolbar: !!this._params.hideToolbar });
|
|
195
199
|
});
|
|
196
200
|
if (this._debugger.isPaused())
|
|
197
201
|
this._pausedStateChanged();
|
|
198
202
|
this._debugger.on(import_debugger.Debugger.Events.PausedStateChanged, () => this._pausedStateChanged());
|
|
199
203
|
}
|
|
200
204
|
_pausedStateChanged() {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
}
|
|
205
|
+
const pausedDetails = this._debugger.pausedDetails();
|
|
206
|
+
if (pausedDetails && !this._currentCallsMetadata.has(pausedDetails.metadata))
|
|
207
|
+
this.onBeforeCall(pausedDetails.sdkObject, pausedDetails.metadata);
|
|
205
208
|
this.emit(RecorderEvent.PausedStateChanged, this._debugger.isPaused());
|
|
206
209
|
this._updateUserSources();
|
|
207
210
|
this.updateCallLog([...this._currentCallsMetadata.keys()]);
|
|
@@ -209,7 +212,7 @@ class Recorder extends import_events.default {
|
|
|
209
212
|
mode() {
|
|
210
213
|
return this._mode;
|
|
211
214
|
}
|
|
212
|
-
setMode(mode) {
|
|
215
|
+
async setMode(mode) {
|
|
213
216
|
if (this._mode === mode)
|
|
214
217
|
return;
|
|
215
218
|
this._highlightedElement = {};
|
|
@@ -217,54 +220,91 @@ class Recorder extends import_events.default {
|
|
|
217
220
|
this.emit(RecorderEvent.ModeChanged, this._mode);
|
|
218
221
|
this._setEnabled(this._isRecording());
|
|
219
222
|
this._debugger.setMuted(this._isRecording());
|
|
220
|
-
if (this._mode !== "none" && this._mode !== "standby"
|
|
221
|
-
this.
|
|
223
|
+
if (this._mode !== "none" && this._mode !== "standby") {
|
|
224
|
+
let pageToFocus = this._pickLocatorPage;
|
|
225
|
+
if (!pageToFocus && this._context.pages().length === 1)
|
|
226
|
+
pageToFocus = this._context.pages()[0];
|
|
227
|
+
pageToFocus?.bringToFront().catch(() => {
|
|
222
228
|
});
|
|
223
|
-
|
|
229
|
+
}
|
|
230
|
+
await this._refreshOverlay();
|
|
231
|
+
}
|
|
232
|
+
async pickLocator(progress, page) {
|
|
233
|
+
if (this._mode !== "none")
|
|
234
|
+
await this.setMode("none");
|
|
235
|
+
const selectorPromise = new import_manualPromise.ManualPromise();
|
|
236
|
+
let recorderChangedState = false;
|
|
237
|
+
const onElementPicked = (elementInfo) => {
|
|
238
|
+
selectorPromise.resolve(elementInfo.selector);
|
|
239
|
+
};
|
|
240
|
+
const onModeChanged = () => {
|
|
241
|
+
if (this._mode === "inspecting")
|
|
242
|
+
return;
|
|
243
|
+
recorderChangedState = true;
|
|
244
|
+
selectorPromise.reject(new Error("Locator picking was cancelled"));
|
|
245
|
+
};
|
|
246
|
+
const listeners = [
|
|
247
|
+
import_utils2.eventsHelper.addEventListener(this, RecorderEvent.ElementPicked, onElementPicked),
|
|
248
|
+
import_utils2.eventsHelper.addEventListener(this, RecorderEvent.ModeChanged, onModeChanged)
|
|
249
|
+
];
|
|
250
|
+
try {
|
|
251
|
+
const doPickLocator = async () => {
|
|
252
|
+
selectorPromise.catch(() => {
|
|
253
|
+
});
|
|
254
|
+
this._pickLocatorPage = page;
|
|
255
|
+
await this.setMode("inspecting");
|
|
256
|
+
return await selectorPromise;
|
|
257
|
+
};
|
|
258
|
+
return await progress.race(doPickLocator());
|
|
259
|
+
} finally {
|
|
260
|
+
import_utils2.eventsHelper.removeEventListeners(listeners);
|
|
261
|
+
this._pickLocatorPage = void 0;
|
|
262
|
+
if (!recorderChangedState)
|
|
263
|
+
await this.setMode("none");
|
|
264
|
+
}
|
|
224
265
|
}
|
|
225
266
|
url() {
|
|
226
267
|
const page = this._context.pages()[0];
|
|
227
268
|
return page?.mainFrame().url();
|
|
228
269
|
}
|
|
229
|
-
setHighlightedSelector(selector) {
|
|
270
|
+
async setHighlightedSelector(selector) {
|
|
230
271
|
this._highlightedElement = { selector: (0, import_locatorParser.locatorOrSelectorAsSelector)(this._currentLanguage, selector, this._context.selectors().testIdAttributeName()) };
|
|
231
|
-
this._refreshOverlay();
|
|
272
|
+
await this._refreshOverlay();
|
|
232
273
|
}
|
|
233
|
-
setHighlightedAriaTemplate(ariaTemplate) {
|
|
274
|
+
async setHighlightedAriaTemplate(ariaTemplate) {
|
|
234
275
|
this._highlightedElement = { ariaTemplate };
|
|
235
|
-
this._refreshOverlay();
|
|
276
|
+
await this._refreshOverlay();
|
|
236
277
|
}
|
|
237
278
|
step() {
|
|
238
|
-
this._debugger.
|
|
279
|
+
this._debugger.setPauseAt({ next: true });
|
|
280
|
+
this._debugger.resume();
|
|
239
281
|
}
|
|
240
|
-
setLanguage(language) {
|
|
282
|
+
async setLanguage(language) {
|
|
241
283
|
this._currentLanguage = language;
|
|
242
|
-
this._refreshOverlay();
|
|
284
|
+
await this._refreshOverlay();
|
|
243
285
|
}
|
|
244
286
|
resume() {
|
|
245
|
-
this._debugger.resume(
|
|
287
|
+
this._debugger.resume();
|
|
246
288
|
}
|
|
247
289
|
pause() {
|
|
248
|
-
this._debugger.
|
|
290
|
+
this._debugger.setPauseAt({ next: true });
|
|
249
291
|
}
|
|
250
292
|
paused() {
|
|
251
293
|
return this._debugger.isPaused();
|
|
252
294
|
}
|
|
253
295
|
close() {
|
|
254
|
-
this._debugger.resume(
|
|
296
|
+
this._debugger.resume();
|
|
255
297
|
}
|
|
256
|
-
hideHighlightedSelector() {
|
|
298
|
+
async hideHighlightedSelector() {
|
|
257
299
|
this._highlightedElement = {};
|
|
258
|
-
this._refreshOverlay();
|
|
300
|
+
await this._refreshOverlay();
|
|
259
301
|
}
|
|
260
302
|
pausedSourceId() {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
continue;
|
|
267
|
-
return source.id;
|
|
303
|
+
const pausedDetails = this._debugger.pausedDetails();
|
|
304
|
+
if (pausedDetails?.metadata.location) {
|
|
305
|
+
const source = this._userSources.get(pausedDetails.metadata.location.file);
|
|
306
|
+
if (source)
|
|
307
|
+
return source.id;
|
|
268
308
|
}
|
|
269
309
|
}
|
|
270
310
|
userSources() {
|
|
@@ -290,12 +330,10 @@ class Recorder extends import_events.default {
|
|
|
290
330
|
return "";
|
|
291
331
|
}
|
|
292
332
|
}
|
|
293
|
-
_refreshOverlay() {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
});
|
|
298
|
-
}
|
|
333
|
+
async _refreshOverlay() {
|
|
334
|
+
await Promise.all(this._context.pages().map(
|
|
335
|
+
(page) => page.safeNonStallingEvaluateInAllFrames("window.__pw_refreshOverlay()", "main")
|
|
336
|
+
));
|
|
299
337
|
}
|
|
300
338
|
async onBeforeCall(sdkObject, metadata) {
|
|
301
339
|
if (this._omitCallTracking || this._isRecording())
|
|
@@ -338,8 +376,6 @@ class Recorder extends import_events.default {
|
|
|
338
376
|
}
|
|
339
377
|
this.emit(RecorderEvent.UserSourcesChanged, this.userSources(), this.pausedSourceId());
|
|
340
378
|
}
|
|
341
|
-
async onBeforeInputAction(sdkObject, metadata) {
|
|
342
|
-
}
|
|
343
379
|
async onCallLog(sdkObject, metadata, logName, message) {
|
|
344
380
|
this.updateCallLog([metadata]);
|
|
345
381
|
}
|
|
@@ -388,7 +424,7 @@ class Recorder extends import_events.default {
|
|
|
388
424
|
this._filePrimaryURLChanged();
|
|
389
425
|
});
|
|
390
426
|
frame.on(import_frames.Frame.Events.InternalNavigation, (event) => {
|
|
391
|
-
if (event.isPublic) {
|
|
427
|
+
if (event.isPublic && !event.error) {
|
|
392
428
|
this._onFrameNavigated(frame, page);
|
|
393
429
|
this._filePrimaryURLChanged();
|
|
394
430
|
}
|
|
@@ -31,6 +31,8 @@ __export(registry_exports, {
|
|
|
31
31
|
Registry: () => Registry,
|
|
32
32
|
browserDirectoryToMarkerFilePath: () => browserDirectoryToMarkerFilePath,
|
|
33
33
|
buildPlaywrightCLICommand: () => buildPlaywrightCLICommand,
|
|
34
|
+
defaultCacheDirectory: () => defaultCacheDirectory,
|
|
35
|
+
defaultRegistryDirectory: () => defaultRegistryDirectory,
|
|
34
36
|
findChromiumChannelBestEffort: () => findChromiumChannelBestEffort,
|
|
35
37
|
installBrowsersForNpmInstall: () => installBrowsersForNpmInstall,
|
|
36
38
|
registry: () => registry,
|
|
@@ -467,25 +469,25 @@ const DOWNLOAD_PATHS = {
|
|
|
467
469
|
"win64": "builds/android/%s/android.zip"
|
|
468
470
|
}
|
|
469
471
|
};
|
|
472
|
+
const defaultCacheDirectory = (() => {
|
|
473
|
+
if (process.platform === "linux")
|
|
474
|
+
return process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
|
|
475
|
+
if (process.platform === "darwin")
|
|
476
|
+
return import_path.default.join(import_os.default.homedir(), "Library", "Caches");
|
|
477
|
+
if (process.platform === "win32")
|
|
478
|
+
return process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
|
|
479
|
+
throw new Error("Unsupported platform: " + process.platform);
|
|
480
|
+
})();
|
|
481
|
+
const defaultRegistryDirectory = import_path.default.join(defaultCacheDirectory, "ms-playwright");
|
|
470
482
|
const registryDirectory = (() => {
|
|
471
483
|
let result;
|
|
472
484
|
const envDefined = (0, import_utils.getFromENV)("PLAYWRIGHT_BROWSERS_PATH");
|
|
473
|
-
if (envDefined === "0")
|
|
485
|
+
if (envDefined === "0")
|
|
474
486
|
result = import_path.default.join(__dirname, "..", "..", "..", ".local-browsers");
|
|
475
|
-
|
|
487
|
+
else if (envDefined)
|
|
476
488
|
result = envDefined;
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
if (process.platform === "linux")
|
|
480
|
-
cacheDirectory = process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
|
|
481
|
-
else if (process.platform === "darwin")
|
|
482
|
-
cacheDirectory = import_path.default.join(import_os.default.homedir(), "Library", "Caches");
|
|
483
|
-
else if (process.platform === "win32")
|
|
484
|
-
cacheDirectory = process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
|
|
485
|
-
else
|
|
486
|
-
throw new Error("Unsupported platform: " + process.platform);
|
|
487
|
-
result = import_path.default.join(cacheDirectory, "ms-playwright");
|
|
488
|
-
}
|
|
489
|
+
else
|
|
490
|
+
result = defaultRegistryDirectory;
|
|
489
491
|
if (!import_path.default.isAbsolute(result)) {
|
|
490
492
|
result = import_path.default.resolve((0, import_utils.getFromENV)("INIT_CWD") || process.cwd(), result);
|
|
491
493
|
}
|
|
@@ -524,7 +526,7 @@ function readDescriptors(browsersJSON) {
|
|
|
524
526
|
});
|
|
525
527
|
}
|
|
526
528
|
const allDownloadableDirectoriesThatEverExisted = ["android", "chromium", "firefox", "webkit", "ffmpeg", "firefox-beta", "chromium-tip-of-tree", "chromium-headless-shell", "chromium-tip-of-tree-headless-shell", "winldd"];
|
|
527
|
-
const chromiumAliases = ["
|
|
529
|
+
const chromiumAliases = ["chrome-for-testing"];
|
|
528
530
|
class Registry {
|
|
529
531
|
constructor(browsersJSON) {
|
|
530
532
|
const descriptors = readDescriptors(browsersJSON);
|
|
@@ -540,21 +542,37 @@ class Registry {
|
|
|
540
542
|
const currentDockerVersion = (0, import_dependencies.readDockerVersionSync)();
|
|
541
543
|
const preferredDockerVersion = currentDockerVersion ? (0, import_dependencies.dockerVersion)(currentDockerVersion.dockerImageNameTemplate) : null;
|
|
542
544
|
const isOutdatedDockerImage = currentDockerVersion && preferredDockerVersion && currentDockerVersion.dockerImageName !== preferredDockerVersion.dockerImageName;
|
|
543
|
-
const
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
545
|
+
const isFfmpeg = name === "ffmpeg";
|
|
546
|
+
let prettyMessage;
|
|
547
|
+
if (isOutdatedDockerImage) {
|
|
548
|
+
prettyMessage = [
|
|
549
|
+
`Looks like Playwright was just updated to ${preferredDockerVersion.driverVersion}.`,
|
|
550
|
+
`Please update docker image as well.`,
|
|
551
|
+
`- current: ${currentDockerVersion.dockerImageName}`,
|
|
552
|
+
`- required: ${preferredDockerVersion.dockerImageName}`,
|
|
553
|
+
``,
|
|
554
|
+
`<3 Playwright Team`
|
|
555
|
+
].join("\n");
|
|
556
|
+
} else if (isFfmpeg) {
|
|
557
|
+
prettyMessage = [
|
|
558
|
+
`Video rendering requires ffmpeg binary.`,
|
|
559
|
+
`Downloading it will not affect any of the system-wide settings.`,
|
|
560
|
+
`Please run the following command:`,
|
|
561
|
+
``,
|
|
562
|
+
` ${buildPlaywrightCLICommand(sdkLanguage, "install ffmpeg")}`,
|
|
563
|
+
``,
|
|
564
|
+
`<3 Playwright Team`
|
|
565
|
+
].join("\n");
|
|
566
|
+
} else {
|
|
567
|
+
prettyMessage = [
|
|
568
|
+
`Looks like Playwright was just installed or updated.`,
|
|
569
|
+
`Please run the following command to download new browser${installByDefault ? "s" : ""}:`,
|
|
570
|
+
``,
|
|
571
|
+
` ${installCommand}`,
|
|
572
|
+
``,
|
|
573
|
+
`<3 Playwright Team`
|
|
574
|
+
].join("\n");
|
|
575
|
+
}
|
|
558
576
|
throw new Error(`Executable doesn't exist at ${e}
|
|
559
577
|
${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
|
|
560
578
|
}
|
|
@@ -708,16 +726,6 @@ ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
|
|
|
708
726
|
"darwin": "/Applications/Firefox Nightly.app/Contents/MacOS/firefox",
|
|
709
727
|
"win32": "\\Mozilla Firefox\\firefox.exe"
|
|
710
728
|
}));
|
|
711
|
-
this._executables.push(this._createBidiChromiumChannel("bidi-chrome-stable", {
|
|
712
|
-
"linux": "/opt/google/chrome/chrome",
|
|
713
|
-
"darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
714
|
-
"win32": `\\Google\\Chrome\\Application\\chrome.exe`
|
|
715
|
-
}));
|
|
716
|
-
this._executables.push(this._createBidiChromiumChannel("bidi-chrome-canary", {
|
|
717
|
-
"linux": "/opt/google/chrome-canary/chrome",
|
|
718
|
-
"darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
|
|
719
|
-
"win32": `\\Google\\Chrome SxS\\Application\\chrome.exe`
|
|
720
|
-
}));
|
|
721
729
|
const firefox = descriptors.find((d) => d.name === "firefox");
|
|
722
730
|
const firefoxExecutable = findExecutablePath(firefox.dir, "firefox");
|
|
723
731
|
this._executables.push({
|
|
@@ -891,7 +899,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
|
|
|
891
899
|
name,
|
|
892
900
|
browserName: "chromium",
|
|
893
901
|
directory: void 0,
|
|
894
|
-
executablePath: (
|
|
902
|
+
executablePath: () => executablePath("", false),
|
|
895
903
|
executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
|
|
896
904
|
installType: install ? "install-script" : "none",
|
|
897
905
|
_validateHostRequirements: () => Promise.resolve(),
|
|
@@ -929,7 +937,7 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
|
|
|
929
937
|
name,
|
|
930
938
|
browserName: "firefox",
|
|
931
939
|
directory: void 0,
|
|
932
|
-
executablePath: (
|
|
940
|
+
executablePath: () => executablePath("", false),
|
|
933
941
|
executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
|
|
934
942
|
installType: "none",
|
|
935
943
|
_validateHostRequirements: () => Promise.resolve(),
|
|
@@ -937,43 +945,6 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
|
|
|
937
945
|
_install: install
|
|
938
946
|
};
|
|
939
947
|
}
|
|
940
|
-
_createBidiChromiumChannel(name, lookAt) {
|
|
941
|
-
const executablePath = (sdkLanguage, shouldThrow) => {
|
|
942
|
-
const suffix = lookAt[process.platform];
|
|
943
|
-
if (!suffix) {
|
|
944
|
-
if (shouldThrow)
|
|
945
|
-
throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`);
|
|
946
|
-
return void 0;
|
|
947
|
-
}
|
|
948
|
-
const prefixes = process.platform === "win32" ? [
|
|
949
|
-
process.env.LOCALAPPDATA,
|
|
950
|
-
process.env.PROGRAMFILES,
|
|
951
|
-
process.env["PROGRAMFILES(X86)"],
|
|
952
|
-
// In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set.
|
|
953
|
-
process.env.HOMEDRIVE + "\\Program Files",
|
|
954
|
-
process.env.HOMEDRIVE + "\\Program Files (x86)"
|
|
955
|
-
].filter(Boolean) : [""];
|
|
956
|
-
for (const prefix of prefixes) {
|
|
957
|
-
const executablePath2 = import_path.default.join(prefix, suffix);
|
|
958
|
-
if ((0, import_fileUtils.canAccessFile)(executablePath2))
|
|
959
|
-
return executablePath2;
|
|
960
|
-
}
|
|
961
|
-
if (!shouldThrow)
|
|
962
|
-
return void 0;
|
|
963
|
-
const location = prefixes.length ? ` at ${import_path.default.join(prefixes[0], suffix)}` : ``;
|
|
964
|
-
throw new Error(`Chromium distribution '${name}' is not found${location}`);
|
|
965
|
-
};
|
|
966
|
-
return {
|
|
967
|
-
name,
|
|
968
|
-
browserName: "chromium",
|
|
969
|
-
directory: void 0,
|
|
970
|
-
executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
|
|
971
|
-
executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
|
|
972
|
-
installType: "none",
|
|
973
|
-
_validateHostRequirements: () => Promise.resolve(),
|
|
974
|
-
_isHermeticInstallation: false
|
|
975
|
-
};
|
|
976
|
-
}
|
|
977
948
|
executables() {
|
|
978
949
|
return this._executables;
|
|
979
950
|
}
|
|
@@ -1032,8 +1003,8 @@ Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
|
|
|
1032
1003
|
for (const executable of executables) {
|
|
1033
1004
|
if (!executable._install)
|
|
1034
1005
|
throw new Error(`ERROR: Playwright does not support installing ${executable.name}`);
|
|
1035
|
-
|
|
1036
|
-
|
|
1006
|
+
if (!(0, import_utils.getAsBooleanFromENV)("CI") && !executable._isHermeticInstallation && !options?.force && executable.executablePath()) {
|
|
1007
|
+
const { embedderName } = (0, import_userAgent.getEmbedderName)();
|
|
1037
1008
|
const command = buildPlaywrightCLICommand(embedderName, "install --force " + executable.name);
|
|
1038
1009
|
process.stderr.write("\n" + (0, import_ascii.wrapInASCIIBox)([
|
|
1039
1010
|
`ATTENTION: "${executable.name}" is already installed on the system!`,
|
|
@@ -1354,7 +1325,7 @@ function buildPlaywrightCLICommand(sdkLanguage, parameters) {
|
|
|
1354
1325
|
return `pwsh bin/Debug/netX/playwright.ps1 ${parameters}`;
|
|
1355
1326
|
default: {
|
|
1356
1327
|
const packageManagerCommand = (0, import_utils.getPackageManagerExecCommand)();
|
|
1357
|
-
return `${packageManagerCommand}
|
|
1328
|
+
return `${packageManagerCommand} playwright ${parameters}`;
|
|
1358
1329
|
}
|
|
1359
1330
|
}
|
|
1360
1331
|
}
|
|
@@ -1414,6 +1385,8 @@ const registry = new Registry(require("../../../browsers.json"));
|
|
|
1414
1385
|
Registry,
|
|
1415
1386
|
browserDirectoryToMarkerFilePath,
|
|
1416
1387
|
buildPlaywrightCLICommand,
|
|
1388
|
+
defaultCacheDirectory,
|
|
1389
|
+
defaultRegistryDirectory,
|
|
1417
1390
|
findChromiumChannelBestEffort,
|
|
1418
1391
|
installBrowsersForNpmInstall,
|
|
1419
1392
|
registry,
|