patchright-core 1.51.3 → 1.52.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/browsers.json +15 -13
- package/lib/androidServerImpl.js +42 -48
- package/lib/browserServerImpl.js +54 -67
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +312 -328
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +141 -228
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +57 -61
- package/lib/client/browserContext.js +297 -326
- package/lib/client/browserType.js +92 -106
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +82 -95
- package/lib/client/clientHelper.js +46 -38
- package/lib/client/clientInstrumentation.js +40 -37
- package/lib/client/clientStackTrace.js +41 -37
- package/lib/client/clock.js +36 -36
- package/lib/client/connection.js +190 -212
- package/lib/client/consoleMessage.js +31 -28
- package/lib/client/coverage.js +25 -22
- package/lib/client/dialog.js +30 -31
- package/lib/client/download.js +25 -25
- package/lib/client/electron.js +73 -75
- package/lib/client/elementHandle.js +111 -147
- package/lib/client/errors.js +53 -53
- package/lib/client/eventEmitter.js +124 -121
- package/lib/client/events.js +72 -68
- package/lib/client/fetch.js +135 -158
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +187 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +40 -69
- package/lib/client/jsHandle.js +54 -69
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -28
- package/lib/client/locator.js +161 -245
- package/lib/client/network.js +277 -295
- package/lib/client/page.js +270 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -66
- package/lib/client/selectors.js +48 -46
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +49 -39
- package/lib/client/tracing.js +48 -84
- package/lib/client/types.js +26 -22
- package/lib/client/video.js +35 -27
- package/lib/client/waiter.js +69 -88
- package/lib/client/webError.js +25 -23
- package/lib/client/webSocket.js +61 -56
- package/lib/client/worker.js +48 -58
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/clockSource.js +26 -5
- package/lib/generated/consoleApiSource.js +26 -5
- package/lib/generated/injectedScriptSource.js +26 -5
- package/lib/generated/pollingRecorderSource.js +26 -5
- package/lib/generated/utilityScriptSource.js +26 -5
- package/lib/generated/webSocketMockSource.js +375 -4
- package/lib/inProcessFactory.js +53 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +53 -46
- package/lib/protocol/debug.js +209 -25
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2714 -2714
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +140 -157
- package/lib/remote/playwrightServer.js +99 -84
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +216 -209
- package/lib/server/android/backendAdb.js +89 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +221 -155
- package/lib/server/bidi/bidiChromium.js +106 -79
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +128 -113
- package/lib/server/bidi/bidiFirefox.js +76 -69
- package/lib/server/bidi/bidiInput.js +86 -97
- package/lib/server/bidi/bidiNetworkManager.js +137 -154
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +247 -219
- package/lib/server/bidi/bidiPdf.js +52 -86
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
- package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
- package/lib/server/bidi/third_party/bidiProtocol.js +144 -131
- package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
- package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
- package/lib/server/browser.js +76 -84
- package/lib/server/browserContext.js +321 -346
- package/lib/server/browserType.js +169 -182
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +212 -190
- package/lib/server/chromium/chromiumSwitches.js +86 -64
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +253 -273
- package/lib/server/chromium/crConnection.js +91 -116
- package/lib/server/chromium/crCoverage.js +113 -127
- package/lib/server/chromium/crDevTools.js +59 -51
- package/lib/server/chromium/crDragDrop.js +62 -79
- package/lib/server/chromium/crExecutionContext.js +88 -83
- package/lib/server/chromium/crInput.js +97 -95
- package/lib/server/chromium/crNetworkManager.js +284 -404
- package/lib/server/chromium/crPage.js +522 -608
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +82 -67
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +65 -99
- package/lib/server/clock.js +62 -50
- package/lib/server/codegen/csharp.js +185 -160
- package/lib/server/codegen/java.js +155 -128
- package/lib/server/codegen/javascript.js +163 -148
- package/lib/server/codegen/jsonl.js +32 -28
- package/lib/server/codegen/language.js +75 -52
- package/lib/server/codegen/languages.js +65 -27
- package/lib/server/codegen/python.js +140 -125
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +105 -86
- package/lib/server/debugController.js +97 -124
- package/lib/server/debugger.js +82 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dialog.js +36 -35
- package/lib/server/dispatchers/androidDispatcher.js +196 -107
- package/lib/server/dispatchers/artifactDispatcher.js +62 -62
- package/lib/server/dispatchers/browserContextDispatcher.js +176 -205
- package/lib/server/dispatchers/browserDispatcher.js +78 -97
- package/lib/server/dispatchers/browserTypeDispatcher.js +35 -35
- package/lib/server/dispatchers/cdpSessionDispatcher.js +32 -36
- package/lib/server/dispatchers/debugControllerDispatcher.js +48 -66
- package/lib/server/dispatchers/dialogDispatcher.js +30 -27
- package/lib/server/dispatchers/dispatcher.js +169 -220
- package/lib/server/dispatchers/electronDispatcher.js +54 -57
- package/lib/server/dispatchers/elementHandlerDispatcher.js +77 -119
- package/lib/server/dispatchers/frameDispatcher.js +99 -163
- package/lib/server/dispatchers/jsHandleDispatcher.js +49 -66
- package/lib/server/dispatchers/jsonPipeDispatcher.js +35 -36
- package/lib/server/dispatchers/localUtilsDispatcher.js +95 -80
- package/lib/server/dispatchers/networkDispatchers.js +90 -107
- package/lib/server/dispatchers/pageDispatcher.js +128 -169
- package/lib/server/dispatchers/playwrightDispatcher.js +69 -76
- package/lib/server/dispatchers/selectorsDispatcher.js +28 -24
- package/lib/server/dispatchers/streamDispatcher.js +42 -45
- package/lib/server/dispatchers/tracingDispatcher.js +36 -41
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +96 -131
- package/lib/server/dispatchers/writableStreamDispatcher.js +54 -38
- package/lib/server/dom.js +413 -443
- package/lib/server/download.js +45 -35
- package/lib/server/electron/electron.js +156 -176
- package/lib/server/electron/loader.js +8 -36
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +289 -323
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +65 -59
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +213 -277
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +91 -73
- package/lib/server/firefox/ffInput.js +67 -69
- package/lib/server/firefox/ffNetworkManager.js +131 -110
- package/lib/server/firefox/ffPage.js +236 -273
- package/lib/server/firefox/firefox.js +76 -67
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +77 -111
- package/lib/server/frames.js +730 -894
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +287 -222
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +56 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +134 -163
- package/lib/server/instrumentation.js +49 -44
- package/lib/server/javascript.js +143 -134
- package/lib/server/launchApp.js +92 -73
- package/lib/server/localUtils.js +130 -122
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +262 -296
- package/lib/server/page.js +329 -426
- package/lib/server/pageBinding.js +88 -0
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +60 -67
- package/lib/server/progress.js +56 -51
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/contextRecorder.js +134 -138
- package/lib/server/recorder/recorderApp.js +127 -136
- package/lib/server/recorder/recorderCollection.js +56 -44
- package/lib/server/recorder/recorderFrontend.js +15 -4
- package/lib/server/recorder/recorderRunner.js +79 -103
- package/lib/server/recorder/recorderUtils.js +56 -45
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +177 -186
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +904 -792
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +166 -182
- package/lib/server/selectors.js +85 -46
- package/lib/server/socksClientCertificatesInterceptor.js +166 -185
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/storageScript.js +94 -100
- package/lib/server/timeoutSettings.js +58 -43
- package/lib/server/trace/recorder/snapshotter.js +70 -89
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +321 -333
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +168 -146
- package/lib/server/transport.js +124 -133
- package/lib/server/types.js +26 -22
- package/lib/server/usKeyboardLayout.js +135 -545
- package/lib/server/utils/ascii.js +39 -26
- package/lib/server/utils/comparators.js +105 -103
- package/lib/server/utils/crypto.js +157 -112
- package/lib/server/utils/debug.js +37 -28
- package/lib/server/utils/debugLogger.js +69 -48
- package/lib/server/utils/env.js +52 -37
- package/lib/server/utils/eventsHelper.js +29 -28
- package/lib/server/utils/expectUtils.js +31 -26
- package/lib/server/utils/fileUtils.js +123 -136
- package/lib/server/utils/happyEyeballs.js +138 -123
- package/lib/server/utils/hostPlatform.js +84 -120
- package/lib/server/utils/httpServer.js +106 -121
- package/lib/server/utils/image_tools/colorUtils.js +42 -51
- package/lib/server/utils/image_tools/compare.js +44 -43
- package/lib/server/utils/image_tools/imageChannel.js +38 -30
- package/lib/server/utils/image_tools/stats.js +40 -40
- package/lib/server/utils/linuxUtils.js +50 -37
- package/lib/server/utils/network.js +143 -86
- package/lib/server/utils/nodePlatform.js +87 -79
- package/lib/server/utils/pipeTransport.js +44 -42
- package/lib/server/utils/processLauncher.js +111 -121
- package/lib/server/utils/profiler.js +52 -39
- package/lib/server/utils/socksProxy.js +280 -339
- package/lib/server/utils/spawnAsync.js +37 -41
- package/lib/server/utils/task.js +31 -38
- package/lib/server/utils/userAgent.js +73 -66
- package/lib/server/utils/wsServer.js +73 -69
- package/lib/server/utils/zipFile.js +36 -37
- package/lib/server/utils/zones.js +37 -34
- package/lib/server/webkit/protocol.d.js +16 -0
- package/lib/server/webkit/webkit.js +76 -63
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +159 -176
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +84 -70
- package/lib/server/webkit/wkInput.js +82 -80
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +525 -619
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +77 -77
- package/lib/utils/isomorphic/ariaSnapshot.js +144 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/builtins.js +90 -0
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +121 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +340 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +47 -39
- package/lib/utils/isomorphic/mimeType.js +448 -25
- package/lib/utils/isomorphic/multimap.js +35 -27
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +183 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +113 -106
- package/lib/utils/isomorphic/time.js +41 -22
- package/lib/utils/isomorphic/timeoutRunner.js +55 -54
- package/lib/utils/isomorphic/traceUtils.js +38 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +112 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
- package/lib/utils.js +97 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/vite/htmlReport/index.html +21 -15
- package/lib/vite/recorder/assets/{codeMirrorModule-B9YMkrwa.js → codeMirrorModule-DVQi6prl.js} +1 -1
- package/lib/vite/recorder/assets/index-97EUAAbk.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-1DiydmYA.js → codeMirrorModule-dvXVzLxY.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-BjymbO6M.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.ChIUCJnj.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/vite/traceViewer/uiMode.jUCiCtdp.js +5 -0
- package/lib/zipBundle.js +32 -23
- package/package.json +1 -1
- package/types/protocol.d.ts +436 -17
- package/types/types.d.ts +35 -16
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-l0TyP_G8.js +0 -259
- package/lib/vite/traceViewer/index.BqUZLSro.js +0 -2
- package/lib/vite/traceViewer/uiMode.C1d2m5sF.js +0 -5
package/lib/server/clock.js
CHANGED
|
@@ -1,31 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty
|
|
4
|
-
|
|
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 clock_exports = {};
|
|
30
|
+
__export(clock_exports, {
|
|
31
|
+
Clock: () => Clock
|
|
5
32
|
});
|
|
6
|
-
exports
|
|
7
|
-
var clockSource =
|
|
8
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
9
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
10
|
-
/**
|
|
11
|
-
* Copyright (c) Microsoft Corporation.
|
|
12
|
-
*
|
|
13
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
-
* you may not use this file except in compliance with the License.
|
|
15
|
-
* You may obtain a copy of the License at
|
|
16
|
-
*
|
|
17
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
-
*
|
|
19
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
20
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
-
* See the License for the specific language governing permissions and
|
|
23
|
-
* limitations under the License.
|
|
24
|
-
*/
|
|
25
|
-
|
|
33
|
+
module.exports = __toCommonJS(clock_exports);
|
|
34
|
+
var clockSource = __toESM(require("../generated/clockSource"));
|
|
26
35
|
class Clock {
|
|
27
36
|
constructor(browserContext) {
|
|
28
|
-
this._browserContext = void 0;
|
|
29
37
|
this._scriptInstalled = false;
|
|
30
38
|
this._browserContext = browserContext;
|
|
31
39
|
}
|
|
@@ -40,7 +48,7 @@ class Clock {
|
|
|
40
48
|
}
|
|
41
49
|
async install(time) {
|
|
42
50
|
await this._installIfNeeded();
|
|
43
|
-
const timeMillis = time !==
|
|
51
|
+
const timeMillis = time !== void 0 ? parseTime(time) : Date.now();
|
|
44
52
|
await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('install', ${Date.now()}, ${timeMillis})`);
|
|
45
53
|
await this._evaluateInFrames(`globalThis.__pwClock.controller.install(${timeMillis})`);
|
|
46
54
|
}
|
|
@@ -74,7 +82,8 @@ class Clock {
|
|
|
74
82
|
await this._evaluateInFrames(`globalThis.__pwClock.controller.runFor(${ticksMillis})`);
|
|
75
83
|
}
|
|
76
84
|
async _installIfNeeded() {
|
|
77
|
-
if (this._scriptInstalled)
|
|
85
|
+
if (this._scriptInstalled)
|
|
86
|
+
return;
|
|
78
87
|
this._scriptInstalled = true;
|
|
79
88
|
const script = `(() => {
|
|
80
89
|
const module = {};
|
|
@@ -85,49 +94,52 @@ class Clock {
|
|
|
85
94
|
await this._evaluateInFrames(script);
|
|
86
95
|
}
|
|
87
96
|
async _evaluateInFrames(script) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
await Promise.all(page.frames().map(async frame => {
|
|
97
|
+
await Promise.all(this._browserContext.pages().map(async (page) => {
|
|
98
|
+
await Promise.all(page.frames().map(async (frame) => {
|
|
91
99
|
try {
|
|
92
100
|
await frame.evaluateExpression("");
|
|
93
|
-
} catch (e) {
|
|
101
|
+
} catch (e) {
|
|
102
|
+
}
|
|
94
103
|
}));
|
|
95
104
|
}));
|
|
96
|
-
await this._browserContext.safeNonStallingEvaluateInAllFrames(script,
|
|
97
|
-
throwOnJSErrors: true
|
|
98
|
-
});
|
|
105
|
+
await this._browserContext.safeNonStallingEvaluateInAllFrames(script, "main", { throwOnJSErrors: true });
|
|
99
106
|
}
|
|
100
107
|
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Parse strings like '01:10:00' (meaning 1 hour, 10 minutes, 0 seconds) into
|
|
104
|
-
* number of milliseconds. This is used to support human-readable strings passed
|
|
105
|
-
* to clock.tick()
|
|
106
|
-
*/
|
|
107
|
-
exports.Clock = Clock;
|
|
108
108
|
function parseTicks(value) {
|
|
109
|
-
if (typeof value ===
|
|
110
|
-
|
|
109
|
+
if (typeof value === "number")
|
|
110
|
+
return value;
|
|
111
|
+
if (!value)
|
|
112
|
+
return 0;
|
|
111
113
|
const str = value;
|
|
112
|
-
const strings = str.split(
|
|
114
|
+
const strings = str.split(":");
|
|
113
115
|
const l = strings.length;
|
|
114
116
|
let i = l;
|
|
115
117
|
let ms = 0;
|
|
116
118
|
let parsed;
|
|
117
119
|
if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
|
|
118
|
-
throw new Error(
|
|
120
|
+
throw new Error(
|
|
121
|
+
`Clock only understands numbers, 'mm:ss' and 'hh:mm:ss'`
|
|
122
|
+
);
|
|
119
123
|
}
|
|
120
124
|
while (i--) {
|
|
121
125
|
parsed = parseInt(strings[i], 10);
|
|
122
|
-
if (parsed >= 60)
|
|
126
|
+
if (parsed >= 60)
|
|
127
|
+
throw new Error(`Invalid time ${str}`);
|
|
123
128
|
ms += parsed * Math.pow(60, l - i - 1);
|
|
124
129
|
}
|
|
125
|
-
return ms *
|
|
130
|
+
return ms * 1e3;
|
|
126
131
|
}
|
|
127
132
|
function parseTime(epoch) {
|
|
128
|
-
if (!epoch)
|
|
129
|
-
|
|
133
|
+
if (!epoch)
|
|
134
|
+
return 0;
|
|
135
|
+
if (typeof epoch === "number")
|
|
136
|
+
return epoch;
|
|
130
137
|
const parsed = new Date(epoch);
|
|
131
|
-
if (!isFinite(parsed.getTime()))
|
|
138
|
+
if (!isFinite(parsed.getTime()))
|
|
139
|
+
throw new Error(`Invalid date: ${epoch}`);
|
|
132
140
|
return parsed.getTime();
|
|
133
|
-
}
|
|
141
|
+
}
|
|
142
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
143
|
+
0 && (module.exports = {
|
|
144
|
+
Clock
|
|
145
|
+
});
|
|
@@ -1,44 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.
|
|
4
|
-
|
|
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 csharp_exports = {};
|
|
20
|
+
__export(csharp_exports, {
|
|
21
|
+
CSharpLanguageGenerator: () => CSharpLanguageGenerator
|
|
5
22
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
/**
|
|
11
|
-
* Copyright (c) Microsoft Corporation.
|
|
12
|
-
*
|
|
13
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
-
* you may not use this file except in compliance with the License.
|
|
15
|
-
* You may obtain a copy of the License at
|
|
16
|
-
*
|
|
17
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
-
*
|
|
19
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
20
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
-
* See the License for the specific language governing permissions and
|
|
23
|
-
* limitations under the License.
|
|
24
|
-
*/
|
|
25
|
-
|
|
23
|
+
module.exports = __toCommonJS(csharp_exports);
|
|
24
|
+
var import_language = require("./language");
|
|
25
|
+
var import_utils = require("../../utils");
|
|
26
|
+
var import_deviceDescriptors = require("../deviceDescriptors");
|
|
26
27
|
class CSharpLanguageGenerator {
|
|
27
28
|
constructor(mode) {
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (mode ===
|
|
34
|
-
this.name =
|
|
35
|
-
this.id =
|
|
36
|
-
} else if (mode ===
|
|
37
|
-
this.name =
|
|
38
|
-
this.id =
|
|
39
|
-
} else if (mode === 'nunit') {
|
|
40
|
-
this.name = 'NUnit';
|
|
41
|
-
this.id = 'csharp-nunit';
|
|
29
|
+
this.groupName = ".NET C#";
|
|
30
|
+
this.highlighter = "csharp";
|
|
31
|
+
if (mode === "library") {
|
|
32
|
+
this.name = "Library";
|
|
33
|
+
this.id = "csharp";
|
|
34
|
+
} else if (mode === "mstest") {
|
|
35
|
+
this.name = "MSTest";
|
|
36
|
+
this.id = "csharp-mstest";
|
|
37
|
+
} else if (mode === "nunit") {
|
|
38
|
+
this.name = "NUnit";
|
|
39
|
+
this.id = "csharp-nunit";
|
|
42
40
|
} else {
|
|
43
41
|
throw new Error(`Unknown C# language mode: ${mode}`);
|
|
44
42
|
}
|
|
@@ -46,23 +44,27 @@ class CSharpLanguageGenerator {
|
|
|
46
44
|
}
|
|
47
45
|
generateAction(actionInContext) {
|
|
48
46
|
const action = this._generateActionInner(actionInContext);
|
|
49
|
-
if (action)
|
|
50
|
-
|
|
47
|
+
if (action)
|
|
48
|
+
return action;
|
|
49
|
+
return "";
|
|
51
50
|
}
|
|
52
51
|
_generateActionInner(actionInContext) {
|
|
53
52
|
const action = actionInContext.action;
|
|
54
|
-
if (this._mode !==
|
|
53
|
+
if (this._mode !== "library" && (action.name === "openPage" || action.name === "closePage"))
|
|
54
|
+
return "";
|
|
55
55
|
let pageAlias = actionInContext.frame.pageAlias;
|
|
56
|
-
if (this._mode !==
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
if (this._mode !== "library")
|
|
57
|
+
pageAlias = pageAlias.replace("page", "Page");
|
|
58
|
+
const formatter = new CSharpFormatter(this._mode === "library" ? 0 : 8);
|
|
59
|
+
if (action.name === "openPage") {
|
|
59
60
|
formatter.add(`var ${pageAlias} = await context.NewPageAsync();`);
|
|
60
|
-
if (action.url && action.url !==
|
|
61
|
+
if (action.url && action.url !== "about:blank" && action.url !== "chrome://newtab/")
|
|
62
|
+
formatter.add(`await ${pageAlias}.GotoAsync(${quote(action.url)});`);
|
|
61
63
|
return formatter.format();
|
|
62
64
|
}
|
|
63
|
-
const locators = actionInContext.frame.framePath.map(selector => `.${this._asLocator(selector)}.ContentFrame`);
|
|
64
|
-
const subject = `${pageAlias}${locators.join(
|
|
65
|
-
const signals = (0,
|
|
65
|
+
const locators = actionInContext.frame.framePath.map((selector) => `.${this._asLocator(selector)}.ContentFrame`);
|
|
66
|
+
const subject = `${pageAlias}${locators.join("")}`;
|
|
67
|
+
const signals = (0, import_language.toSignalMap)(action);
|
|
66
68
|
if (signals.dialog) {
|
|
67
69
|
formatter.add(` void ${pageAlias}_Dialog${signals.dialog.dialogAlias}_EventHandler(object sender, IDialog dialog)
|
|
68
70
|
{
|
|
@@ -75,70 +77,73 @@ class CSharpLanguageGenerator {
|
|
|
75
77
|
const lines = [];
|
|
76
78
|
lines.push(this._generateActionCall(subject, actionInContext));
|
|
77
79
|
if (signals.download) {
|
|
78
|
-
lines.unshift(`var download${signals.download.downloadAlias} = await ${pageAlias}.RunAndWaitForDownloadAsync(async ()
|
|
80
|
+
lines.unshift(`var download${signals.download.downloadAlias} = await ${pageAlias}.RunAndWaitForDownloadAsync(async () =>
|
|
81
|
+
{`);
|
|
79
82
|
lines.push(`});`);
|
|
80
83
|
}
|
|
81
84
|
if (signals.popup) {
|
|
82
|
-
lines.unshift(`var ${signals.popup.popupAlias} = await ${pageAlias}.RunAndWaitForPopupAsync(async ()
|
|
85
|
+
lines.unshift(`var ${signals.popup.popupAlias} = await ${pageAlias}.RunAndWaitForPopupAsync(async () =>
|
|
86
|
+
{`);
|
|
83
87
|
lines.push(`});`);
|
|
84
88
|
}
|
|
85
|
-
for (const line of lines)
|
|
89
|
+
for (const line of lines)
|
|
90
|
+
formatter.add(line);
|
|
86
91
|
return formatter.format();
|
|
87
92
|
}
|
|
88
93
|
_generateActionCall(subject, actionInContext) {
|
|
89
94
|
const action = actionInContext.action;
|
|
90
95
|
switch (action.name) {
|
|
91
|
-
case
|
|
92
|
-
throw Error(
|
|
93
|
-
case
|
|
96
|
+
case "openPage":
|
|
97
|
+
throw Error("Not reached");
|
|
98
|
+
case "closePage":
|
|
94
99
|
return `await ${subject}.CloseAsync();`;
|
|
95
|
-
case
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
|
|
100
|
+
case "click": {
|
|
101
|
+
let method = "Click";
|
|
102
|
+
if (action.clickCount === 2)
|
|
103
|
+
method = "DblClick";
|
|
104
|
+
const options = (0, import_language.toClickOptionsForSourceCode)(action);
|
|
105
|
+
if (!Object.entries(options).length)
|
|
106
|
+
return `await ${subject}.${this._asLocator(action.selector)}.${method}Async();`;
|
|
107
|
+
const optionsString = formatObject(options, " ", "Locator" + method + "Options");
|
|
108
|
+
return `await ${subject}.${this._asLocator(action.selector)}.${method}Async(${optionsString});`;
|
|
109
|
+
}
|
|
110
|
+
case "check":
|
|
105
111
|
return `await ${subject}.${this._asLocator(action.selector)}.CheckAsync();`;
|
|
106
|
-
case
|
|
112
|
+
case "uncheck":
|
|
107
113
|
return `await ${subject}.${this._asLocator(action.selector)}.UncheckAsync();`;
|
|
108
|
-
case
|
|
114
|
+
case "fill":
|
|
109
115
|
return `await ${subject}.${this._asLocator(action.selector)}.FillAsync(${quote(action.text)});`;
|
|
110
|
-
case
|
|
116
|
+
case "setInputFiles":
|
|
111
117
|
return `await ${subject}.${this._asLocator(action.selector)}.SetInputFilesAsync(${formatObject(action.files)});`;
|
|
112
|
-
case
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
case 'navigate':
|
|
118
|
+
case "press": {
|
|
119
|
+
const modifiers = (0, import_language.toKeyboardModifiers)(action.modifiers);
|
|
120
|
+
const shortcut = [...modifiers, action.key].join("+");
|
|
121
|
+
return `await ${subject}.${this._asLocator(action.selector)}.PressAsync(${quote(shortcut)});`;
|
|
122
|
+
}
|
|
123
|
+
case "navigate":
|
|
119
124
|
return `await ${subject}.GotoAsync(${quote(action.url)});`;
|
|
120
|
-
case
|
|
125
|
+
case "select":
|
|
121
126
|
return `await ${subject}.${this._asLocator(action.selector)}.SelectOptionAsync(${formatObject(action.options)});`;
|
|
122
|
-
case
|
|
123
|
-
return `await Expect(${subject}.${this._asLocator(action.selector)}).${action.substring ?
|
|
124
|
-
case
|
|
125
|
-
return `await Expect(${subject}.${this._asLocator(action.selector)})${action.checked ?
|
|
126
|
-
case
|
|
127
|
+
case "assertText":
|
|
128
|
+
return `await Expect(${subject}.${this._asLocator(action.selector)}).${action.substring ? "ToContainTextAsync" : "ToHaveTextAsync"}(${quote(action.text)});`;
|
|
129
|
+
case "assertChecked":
|
|
130
|
+
return `await Expect(${subject}.${this._asLocator(action.selector)})${action.checked ? "" : ".Not"}.ToBeCheckedAsync();`;
|
|
131
|
+
case "assertVisible":
|
|
127
132
|
return `await Expect(${subject}.${this._asLocator(action.selector)}).ToBeVisibleAsync();`;
|
|
128
|
-
case
|
|
129
|
-
{
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
case 'assertSnapshot':
|
|
133
|
+
case "assertValue": {
|
|
134
|
+
const assertion = action.value ? `ToHaveValueAsync(${quote(action.value)})` : `ToBeEmptyAsync()`;
|
|
135
|
+
return `await Expect(${subject}.${this._asLocator(action.selector)}).${assertion};`;
|
|
136
|
+
}
|
|
137
|
+
case "assertSnapshot":
|
|
134
138
|
return `await Expect(${subject}.${this._asLocator(action.selector)}).ToMatchAriaSnapshotAsync(${quote(action.snapshot)});`;
|
|
135
139
|
}
|
|
136
140
|
}
|
|
137
141
|
_asLocator(selector) {
|
|
138
|
-
return (0,
|
|
142
|
+
return (0, import_utils.asLocator)("csharp", selector);
|
|
139
143
|
}
|
|
140
144
|
generateHeader(options) {
|
|
141
|
-
if (this._mode ===
|
|
145
|
+
if (this._mode === "library")
|
|
146
|
+
return this.generateStandaloneHeader(options);
|
|
142
147
|
return this.generateTestRunnerHeader(options);
|
|
143
148
|
}
|
|
144
149
|
generateStandaloneHeader(options) {
|
|
@@ -149,13 +154,11 @@ class CSharpLanguageGenerator {
|
|
|
149
154
|
using System.Threading.Tasks;
|
|
150
155
|
|
|
151
156
|
using var playwright = await Playwright.CreateAsync();
|
|
152
|
-
await using var browser = await playwright.${toPascal(options.browserName)}.LaunchAsync(${formatObject(options.launchOptions,
|
|
157
|
+
await using var browser = await playwright.${toPascal(options.browserName)}.LaunchAsync(${formatObject(options.launchOptions, " ", "BrowserTypeLaunchOptions")});
|
|
153
158
|
var context = await browser.NewContextAsync(${formatContextOptions(options.contextOptions, options.deviceName)});`);
|
|
154
159
|
if (options.contextOptions.recordHar) {
|
|
155
160
|
const url = options.contextOptions.recordHar.urlFilter;
|
|
156
|
-
formatter.add(` await context.RouteFromHARAsync(${quote(options.contextOptions.recordHar.path)}${url ? `, ${formatObject({
|
|
157
|
-
url
|
|
158
|
-
}, ' ', 'BrowserContextRouteFromHAROptions')}` : ''});`);
|
|
161
|
+
formatter.add(` await context.RouteFromHARAsync(${quote(options.contextOptions.recordHar.path)}${url ? `, ${formatObject({ url }, " ", "BrowserContextRouteFromHAROptions")}` : ""});`);
|
|
159
162
|
}
|
|
160
163
|
formatter.newLine();
|
|
161
164
|
return formatter.format();
|
|
@@ -163,11 +166,11 @@ class CSharpLanguageGenerator {
|
|
|
163
166
|
generateTestRunnerHeader(options) {
|
|
164
167
|
const formatter = new CSharpFormatter(0);
|
|
165
168
|
formatter.add(`
|
|
166
|
-
using Microsoft.Playwright.${this._mode ===
|
|
169
|
+
using Microsoft.Playwright.${this._mode === "nunit" ? "NUnit" : "MSTest"};
|
|
167
170
|
using Microsoft.Playwright;
|
|
168
171
|
|
|
169
|
-
${this._mode ===
|
|
170
|
-
[TestFixture]` :
|
|
172
|
+
${this._mode === "nunit" ? `[Parallelizable(ParallelScope.Self)]
|
|
173
|
+
[TestFixture]` : "[TestClass]"}
|
|
171
174
|
public class Tests : PageTest
|
|
172
175
|
{`);
|
|
173
176
|
const formattedContextOptions = formatContextOptions(options.contextOptions, options.deviceName);
|
|
@@ -178,73 +181,90 @@ class CSharpLanguageGenerator {
|
|
|
178
181
|
}`);
|
|
179
182
|
formatter.newLine();
|
|
180
183
|
}
|
|
181
|
-
formatter.add(` [${this._mode ===
|
|
184
|
+
formatter.add(` [${this._mode === "nunit" ? "Test" : "TestMethod"}]
|
|
182
185
|
public async Task MyTest()
|
|
183
186
|
{`);
|
|
184
187
|
if (options.contextOptions.recordHar) {
|
|
185
188
|
const url = options.contextOptions.recordHar.urlFilter;
|
|
186
|
-
formatter.add(` await Context.RouteFromHARAsync(${quote(options.contextOptions.recordHar.path)}${url ? `, ${formatObject({
|
|
187
|
-
url
|
|
188
|
-
}, ' ', 'BrowserContextRouteFromHAROptions')}` : ''});`);
|
|
189
|
+
formatter.add(` await Context.RouteFromHARAsync(${quote(options.contextOptions.recordHar.path)}${url ? `, ${formatObject({ url }, " ", "BrowserContextRouteFromHAROptions")}` : ""});`);
|
|
189
190
|
}
|
|
190
191
|
return formatter.format();
|
|
191
192
|
}
|
|
192
193
|
generateFooter(saveStorage) {
|
|
193
|
-
const offset = this._mode ===
|
|
194
|
-
let storageStateLine = saveStorage ?
|
|
195
|
-
|
|
194
|
+
const offset = this._mode === "library" ? "" : " ";
|
|
195
|
+
let storageStateLine = saveStorage ? `
|
|
196
|
+
${offset}await context.StorageStateAsync(new BrowserContextStorageStateOptions
|
|
197
|
+
${offset}{
|
|
198
|
+
${offset} Path = ${quote(saveStorage)}
|
|
199
|
+
${offset}});
|
|
200
|
+
` : "";
|
|
201
|
+
if (this._mode !== "library")
|
|
202
|
+
storageStateLine += ` }
|
|
203
|
+
}
|
|
204
|
+
`;
|
|
196
205
|
return storageStateLine;
|
|
197
206
|
}
|
|
198
207
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
208
|
+
function formatObject(value, indent = " ", name = "") {
|
|
209
|
+
if (typeof value === "string") {
|
|
210
|
+
if (["permissions", "colorScheme", "modifiers", "button", "recordHarContent", "recordHarMode", "serviceWorkers"].includes(name))
|
|
211
|
+
return `${getClassName(name)}.${toPascal(value)}`;
|
|
203
212
|
return quote(value);
|
|
204
213
|
}
|
|
205
|
-
if (Array.isArray(value))
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
214
|
+
if (Array.isArray(value))
|
|
215
|
+
return `new[] { ${value.map((o) => formatObject(o, indent, name)).join(", ")} }`;
|
|
216
|
+
if (typeof value === "object") {
|
|
217
|
+
const keys = Object.keys(value).filter((key) => value[key] !== void 0).sort();
|
|
218
|
+
if (!keys.length)
|
|
219
|
+
return name ? `new ${getClassName(name)}` : "";
|
|
209
220
|
const tokens = [];
|
|
210
221
|
for (const key of keys) {
|
|
211
222
|
const property = getPropertyName(key);
|
|
212
223
|
tokens.push(`${property} = ${formatObject(value[key], indent, key)},`);
|
|
213
224
|
}
|
|
214
|
-
if (name)
|
|
215
|
-
|
|
225
|
+
if (name)
|
|
226
|
+
return `new ${getClassName(name)}
|
|
227
|
+
{
|
|
228
|
+
${indent}${tokens.join(`
|
|
229
|
+
${indent}`)}
|
|
230
|
+
${indent}}`;
|
|
231
|
+
return `{
|
|
232
|
+
${indent}${tokens.join(`
|
|
233
|
+
${indent}`)}
|
|
234
|
+
${indent}}`;
|
|
216
235
|
}
|
|
217
|
-
if (name ===
|
|
236
|
+
if (name === "latitude" || name === "longitude")
|
|
237
|
+
return String(value) + "m";
|
|
218
238
|
return String(value);
|
|
219
239
|
}
|
|
220
240
|
function getClassName(value) {
|
|
221
241
|
switch (value) {
|
|
222
|
-
case
|
|
223
|
-
return
|
|
224
|
-
case
|
|
225
|
-
return
|
|
226
|
-
case
|
|
227
|
-
return
|
|
228
|
-
case
|
|
229
|
-
return
|
|
230
|
-
case
|
|
231
|
-
return
|
|
232
|
-
case
|
|
233
|
-
return
|
|
234
|
-
case
|
|
235
|
-
return
|
|
236
|
-
case
|
|
237
|
-
return
|
|
242
|
+
case "viewport":
|
|
243
|
+
return "ViewportSize";
|
|
244
|
+
case "proxy":
|
|
245
|
+
return "ProxySettings";
|
|
246
|
+
case "permissions":
|
|
247
|
+
return "ContextPermission";
|
|
248
|
+
case "modifiers":
|
|
249
|
+
return "KeyboardModifier";
|
|
250
|
+
case "button":
|
|
251
|
+
return "MouseButton";
|
|
252
|
+
case "recordHarMode":
|
|
253
|
+
return "HarMode";
|
|
254
|
+
case "recordHarContent":
|
|
255
|
+
return "HarContentPolicy";
|
|
256
|
+
case "serviceWorkers":
|
|
257
|
+
return "ServiceWorkerPolicy";
|
|
238
258
|
default:
|
|
239
259
|
return toPascal(value);
|
|
240
260
|
}
|
|
241
261
|
}
|
|
242
262
|
function getPropertyName(key) {
|
|
243
263
|
switch (key) {
|
|
244
|
-
case
|
|
245
|
-
return
|
|
246
|
-
case
|
|
247
|
-
return
|
|
264
|
+
case "storageState":
|
|
265
|
+
return "StorageStatePath";
|
|
266
|
+
case "viewport":
|
|
267
|
+
return "ViewportSize";
|
|
248
268
|
default:
|
|
249
269
|
return toPascal(key);
|
|
250
270
|
}
|
|
@@ -253,52 +273,57 @@ function toPascal(value) {
|
|
|
253
273
|
return value[0].toUpperCase() + value.slice(1);
|
|
254
274
|
}
|
|
255
275
|
function formatContextOptions(contextOptions, deviceName) {
|
|
256
|
-
let options = {
|
|
257
|
-
...contextOptions
|
|
258
|
-
};
|
|
259
|
-
// recordHAR is replaced with routeFromHAR in the generated code.
|
|
276
|
+
let options = { ...contextOptions };
|
|
260
277
|
delete options.recordHar;
|
|
261
|
-
const device = deviceName &&
|
|
278
|
+
const device = deviceName && import_deviceDescriptors.deviceDescriptors[deviceName];
|
|
262
279
|
if (!device) {
|
|
263
|
-
if (!Object.entries(options).length)
|
|
264
|
-
|
|
280
|
+
if (!Object.entries(options).length)
|
|
281
|
+
return "";
|
|
282
|
+
return formatObject(options, " ", "BrowserNewContextOptions");
|
|
265
283
|
}
|
|
266
|
-
options = (0,
|
|
267
|
-
if (!Object.entries(options).length)
|
|
268
|
-
|
|
284
|
+
options = (0, import_language.sanitizeDeviceOptions)(device, options);
|
|
285
|
+
if (!Object.entries(options).length)
|
|
286
|
+
return `playwright.Devices[${quote(deviceName)}]`;
|
|
287
|
+
return formatObject(options, " ", `BrowserNewContextOptions(playwright.Devices[${quote(deviceName)}])`);
|
|
269
288
|
}
|
|
270
289
|
class CSharpFormatter {
|
|
271
290
|
constructor(offset = 0) {
|
|
272
|
-
this._baseIndent = void 0;
|
|
273
|
-
this._baseOffset = void 0;
|
|
274
291
|
this._lines = [];
|
|
275
|
-
this._baseIndent =
|
|
276
|
-
this._baseOffset =
|
|
292
|
+
this._baseIndent = " ".repeat(4);
|
|
293
|
+
this._baseOffset = " ".repeat(offset);
|
|
277
294
|
}
|
|
278
295
|
prepend(text) {
|
|
279
|
-
this._lines = text.trim().split(
|
|
296
|
+
this._lines = text.trim().split("\n").map((line) => line.trim()).concat(this._lines);
|
|
280
297
|
}
|
|
281
298
|
add(text) {
|
|
282
|
-
this._lines.push(...text.trim().split(
|
|
299
|
+
this._lines.push(...text.trim().split("\n").map((line) => line.trim()));
|
|
283
300
|
}
|
|
284
301
|
newLine() {
|
|
285
|
-
this._lines.push(
|
|
302
|
+
this._lines.push("");
|
|
286
303
|
}
|
|
287
304
|
format() {
|
|
288
|
-
let spaces =
|
|
289
|
-
let previousLine =
|
|
290
|
-
return this._lines.map(line => {
|
|
291
|
-
if (line ===
|
|
292
|
-
|
|
293
|
-
|
|
305
|
+
let spaces = "";
|
|
306
|
+
let previousLine = "";
|
|
307
|
+
return this._lines.map((line) => {
|
|
308
|
+
if (line === "")
|
|
309
|
+
return line;
|
|
310
|
+
if (line.startsWith("}") || line.startsWith("]") || line.includes("});") || line === ");")
|
|
311
|
+
spaces = spaces.substring(this._baseIndent.length);
|
|
312
|
+
const extraSpaces = /^(for|while|if).*\(.*\)$/.test(previousLine) ? this._baseIndent : "";
|
|
294
313
|
previousLine = line;
|
|
295
314
|
line = spaces + extraSpaces + line;
|
|
296
|
-
if (line.endsWith(
|
|
297
|
-
|
|
315
|
+
if (line.endsWith("{") || line.endsWith("[") || line.endsWith("("))
|
|
316
|
+
spaces += this._baseIndent;
|
|
317
|
+
if (line.endsWith("));"))
|
|
318
|
+
spaces = spaces.substring(this._baseIndent.length);
|
|
298
319
|
return this._baseOffset + line;
|
|
299
|
-
}).join(
|
|
320
|
+
}).join("\n");
|
|
300
321
|
}
|
|
301
322
|
}
|
|
302
323
|
function quote(text) {
|
|
303
|
-
return (0,
|
|
304
|
-
}
|
|
324
|
+
return (0, import_utils.escapeWithQuotes)(text, '"');
|
|
325
|
+
}
|
|
326
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
327
|
+
0 && (module.exports = {
|
|
328
|
+
CSharpLanguageGenerator
|
|
329
|
+
});
|