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
|
@@ -1,127 +1,128 @@
|
|
|
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 browserType_exports = {};
|
|
30
|
+
__export(browserType_exports, {
|
|
31
|
+
BrowserReadyState: () => BrowserReadyState,
|
|
32
|
+
BrowserType: () => BrowserType,
|
|
33
|
+
kNoXServerRunningError: () => kNoXServerRunningError
|
|
5
34
|
});
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Copyright (c) Microsoft Corporation.
|
|
29
|
-
*
|
|
30
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
31
|
-
* you may not use this file except in compliance with the License.
|
|
32
|
-
* You may obtain a copy of the License at
|
|
33
|
-
*
|
|
34
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
35
|
-
*
|
|
36
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
37
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
38
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
39
|
-
* See the License for the specific language governing permissions and
|
|
40
|
-
* limitations under the License.
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
const kNoXServerRunningError = exports.kNoXServerRunningError = 'Looks like you launched a headed browser without having a XServer running.\n' + 'Set either \'headless: true\' or use \'xvfb-run <your-playwright-app>\' before running Playwright.\n\n<3 Playwright Team';
|
|
35
|
+
module.exports = __toCommonJS(browserType_exports);
|
|
36
|
+
var import_fs = __toESM(require("fs"));
|
|
37
|
+
var import_os = __toESM(require("os"));
|
|
38
|
+
var import_path = __toESM(require("path"));
|
|
39
|
+
var import_browserContext = require("./browserContext");
|
|
40
|
+
var import_timeoutSettings = require("./timeoutSettings");
|
|
41
|
+
var import_debug = require("./utils/debug");
|
|
42
|
+
var import_assert = require("../utils/isomorphic/assert");
|
|
43
|
+
var import_manualPromise = require("../utils/isomorphic/manualPromise");
|
|
44
|
+
var import_fileUtils = require("./utils/fileUtils");
|
|
45
|
+
var import_helper = require("./helper");
|
|
46
|
+
var import_instrumentation = require("./instrumentation");
|
|
47
|
+
var import_pipeTransport = require("./pipeTransport");
|
|
48
|
+
var import_processLauncher = require("./utils/processLauncher");
|
|
49
|
+
var import_progress = require("./progress");
|
|
50
|
+
var import_protocolError = require("./protocolError");
|
|
51
|
+
var import_registry = require("./registry");
|
|
52
|
+
var import_socksClientCertificatesInterceptor = require("./socksClientCertificatesInterceptor");
|
|
53
|
+
var import_transport = require("./transport");
|
|
54
|
+
var import_debugLogger = require("./utils/debugLogger");
|
|
55
|
+
const kNoXServerRunningError = "Looks like you launched a headed browser without having a XServer running.\nSet either 'headless: true' or use 'xvfb-run <your-playwright-app>' before running Playwright.\n\n<3 Playwright Team";
|
|
44
56
|
class BrowserReadyState {
|
|
45
57
|
constructor() {
|
|
46
|
-
this._wsEndpoint = new
|
|
58
|
+
this._wsEndpoint = new import_manualPromise.ManualPromise();
|
|
47
59
|
}
|
|
48
60
|
onBrowserExit() {
|
|
49
|
-
|
|
50
|
-
this._wsEndpoint.resolve(undefined);
|
|
61
|
+
this._wsEndpoint.resolve(void 0);
|
|
51
62
|
}
|
|
52
63
|
async waitUntilReady() {
|
|
53
64
|
const wsEndpoint = await this._wsEndpoint;
|
|
54
|
-
return {
|
|
55
|
-
wsEndpoint
|
|
56
|
-
};
|
|
65
|
+
return { wsEndpoint };
|
|
57
66
|
}
|
|
58
67
|
}
|
|
59
|
-
|
|
60
|
-
class BrowserType extends _instrumentation.SdkObject {
|
|
68
|
+
class BrowserType extends import_instrumentation.SdkObject {
|
|
61
69
|
constructor(parent, browserName) {
|
|
62
|
-
super(parent,
|
|
63
|
-
this._name = void 0;
|
|
70
|
+
super(parent, "browser-type");
|
|
64
71
|
this._useBidi = false;
|
|
65
72
|
this.attribution.browserType = this;
|
|
66
73
|
this._name = browserName;
|
|
67
74
|
}
|
|
68
75
|
executablePath() {
|
|
69
|
-
return
|
|
76
|
+
return import_registry.registry.findExecutable(this._name).executablePath(this.attribution.playwright.options.sdkLanguage) || "";
|
|
70
77
|
}
|
|
71
78
|
name() {
|
|
72
79
|
return this._name;
|
|
73
80
|
}
|
|
74
81
|
async launch(metadata, options, protocolLogger) {
|
|
75
82
|
options = this._validateLaunchOptions(options);
|
|
76
|
-
if (this._useBidi)
|
|
77
|
-
|
|
78
|
-
controller.
|
|
79
|
-
|
|
83
|
+
if (this._useBidi)
|
|
84
|
+
options.useWebSocket = true;
|
|
85
|
+
const controller = new import_progress.ProgressController(metadata, this);
|
|
86
|
+
controller.setLogName("browser");
|
|
87
|
+
const browser = await controller.run((progress) => {
|
|
80
88
|
const seleniumHubUrl = options.__testHookSeleniumRemoteURL || process.env.SELENIUM_REMOTE_URL;
|
|
81
|
-
if (seleniumHubUrl)
|
|
82
|
-
|
|
89
|
+
if (seleniumHubUrl)
|
|
90
|
+
return this._launchWithSeleniumHub(progress, seleniumHubUrl, options);
|
|
91
|
+
return this._innerLaunchWithRetries(progress, options, void 0, import_helper.helper.debugProtocolLogger(protocolLogger)).catch((e) => {
|
|
83
92
|
throw this._rewriteStartupLog(e);
|
|
84
93
|
});
|
|
85
|
-
},
|
|
94
|
+
}, import_timeoutSettings.TimeoutSettings.launchTimeout(options));
|
|
86
95
|
return browser;
|
|
87
96
|
}
|
|
88
97
|
async launchPersistentContext(metadata, userDataDir, options) {
|
|
89
98
|
const launchOptions = this._validateLaunchOptions(options);
|
|
90
|
-
if (this._useBidi)
|
|
91
|
-
|
|
92
|
-
controller.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
// Note: Any initial TLS requests will fail since we rely on the Page/Frames initialize which sets ignoreHTTPSErrors.
|
|
99
|
+
if (this._useBidi)
|
|
100
|
+
launchOptions.useWebSocket = true;
|
|
101
|
+
const controller = new import_progress.ProgressController(metadata, this);
|
|
102
|
+
controller.setLogName("browser");
|
|
103
|
+
const browser = await controller.run(async (progress) => {
|
|
96
104
|
let clientCertificatesProxy;
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
options = {
|
|
102
|
-
...options
|
|
103
|
-
};
|
|
105
|
+
if (options.clientCertificates?.length) {
|
|
106
|
+
clientCertificatesProxy = new import_socksClientCertificatesInterceptor.ClientCertificatesProxy(options);
|
|
107
|
+
launchOptions.proxyOverride = await clientCertificatesProxy?.listen();
|
|
108
|
+
options = { ...options };
|
|
104
109
|
options.internalIgnoreHTTPSErrors = true;
|
|
105
110
|
}
|
|
106
|
-
progress.cleanupWhenAborted(() =>
|
|
107
|
-
|
|
108
|
-
return (_clientCertificatesPr2 = clientCertificatesProxy) === null || _clientCertificatesPr2 === void 0 ? void 0 : _clientCertificatesPr2.close();
|
|
109
|
-
});
|
|
110
|
-
const browser = await this._innerLaunchWithRetries(progress, launchOptions, options, _helper.helper.debugProtocolLogger(), userDataDir).catch(e => {
|
|
111
|
+
progress.cleanupWhenAborted(() => clientCertificatesProxy?.close());
|
|
112
|
+
const browser2 = await this._innerLaunchWithRetries(progress, launchOptions, options, import_helper.helper.debugProtocolLogger(), userDataDir).catch((e) => {
|
|
111
113
|
throw this._rewriteStartupLog(e);
|
|
112
114
|
});
|
|
113
|
-
|
|
114
|
-
return
|
|
115
|
-
},
|
|
115
|
+
browser2._defaultContext._clientCertificatesProxy = clientCertificatesProxy;
|
|
116
|
+
return browser2;
|
|
117
|
+
}, import_timeoutSettings.TimeoutSettings.launchTimeout(launchOptions));
|
|
116
118
|
return browser._defaultContext;
|
|
117
119
|
}
|
|
118
120
|
async _innerLaunchWithRetries(progress, options, persistent, protocolLogger, userDataDir) {
|
|
119
121
|
try {
|
|
120
122
|
return await this._innerLaunch(progress, options, persistent, protocolLogger, userDataDir);
|
|
121
123
|
} catch (error) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (errorMessage.includes('Inconsistency detected by ld.so')) {
|
|
124
|
+
const errorMessage = typeof error === "object" && typeof error.message === "string" ? error.message : "";
|
|
125
|
+
if (errorMessage.includes("Inconsistency detected by ld.so")) {
|
|
125
126
|
progress.log(`<restarting browser due to hitting race condition in glibc>`);
|
|
126
127
|
return this._innerLaunch(progress, options, persistent, protocolLogger, userDataDir);
|
|
127
128
|
}
|
|
@@ -129,18 +130,14 @@ class BrowserType extends _instrumentation.SdkObject {
|
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
132
|
async _innerLaunch(progress, options, persistent, protocolLogger, maybeUserDataDir) {
|
|
132
|
-
options.proxy = options.proxy ? (0,
|
|
133
|
-
const browserLogsCollector = new
|
|
134
|
-
const {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
artifactsDir,
|
|
138
|
-
transport
|
|
139
|
-
} = await this._launchProcess(progress, options, !!persistent, browserLogsCollector, maybeUserDataDir);
|
|
140
|
-
if (options.__testHookBeforeCreateBrowser) await options.__testHookBeforeCreateBrowser();
|
|
133
|
+
options.proxy = options.proxy ? (0, import_browserContext.normalizeProxySettings)(options.proxy) : void 0;
|
|
134
|
+
const browserLogsCollector = new import_debugLogger.RecentLogsCollector();
|
|
135
|
+
const { browserProcess, userDataDir, artifactsDir, transport } = await this._launchProcess(progress, options, !!persistent, browserLogsCollector, maybeUserDataDir);
|
|
136
|
+
if (options.__testHookBeforeCreateBrowser)
|
|
137
|
+
await options.__testHookBeforeCreateBrowser();
|
|
141
138
|
const browserOptions = {
|
|
142
139
|
name: this._name,
|
|
143
|
-
isChromium: this._name ===
|
|
140
|
+
isChromium: this._name === "chromium",
|
|
144
141
|
channel: options.channel,
|
|
145
142
|
slowMo: options.slowMo,
|
|
146
143
|
persistent,
|
|
@@ -153,19 +150,19 @@ class BrowserType extends _instrumentation.SdkObject {
|
|
|
153
150
|
proxy: options.proxy,
|
|
154
151
|
protocolLogger,
|
|
155
152
|
browserLogsCollector,
|
|
156
|
-
wsEndpoint: options.useWebSocket ? transport.wsEndpoint :
|
|
153
|
+
wsEndpoint: options.useWebSocket ? transport.wsEndpoint : void 0,
|
|
157
154
|
originalLaunchOptions: options
|
|
158
155
|
};
|
|
159
|
-
if (persistent)
|
|
156
|
+
if (persistent)
|
|
157
|
+
(0, import_browserContext.validateBrowserContextOptions)(persistent, browserOptions);
|
|
160
158
|
copyTestHooks(options, browserOptions);
|
|
161
159
|
const browser = await this.connectToTransport(transport, browserOptions);
|
|
162
160
|
browser._userDataDirForTest = userDataDir;
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
if (persistent && !options.ignoreAllDefaultArgs)
|
|
162
|
+
await browser._defaultContext._loadDefaultContext(progress);
|
|
165
163
|
return browser;
|
|
166
164
|
}
|
|
167
165
|
async _launchProcess(progress, options, isPersistent, browserLogsCollector, userDataDir) {
|
|
168
|
-
var _await$readyState$wai;
|
|
169
166
|
const {
|
|
170
167
|
ignoreDefaultArgs,
|
|
171
168
|
ignoreAllDefaultArgs,
|
|
@@ -175,165 +172,155 @@ class BrowserType extends _instrumentation.SdkObject {
|
|
|
175
172
|
handleSIGTERM = true,
|
|
176
173
|
handleSIGHUP = true
|
|
177
174
|
} = options;
|
|
178
|
-
const env = options.env ? (0,
|
|
175
|
+
const env = options.env ? (0, import_processLauncher.envArrayToObject)(options.env) : process.env;
|
|
179
176
|
await this._createArtifactDirs(options);
|
|
180
177
|
const tempDirectories = [];
|
|
181
|
-
const artifactsDir = await
|
|
178
|
+
const artifactsDir = await import_fs.default.promises.mkdtemp(import_path.default.join(import_os.default.tmpdir(), "playwright-artifacts-"));
|
|
182
179
|
tempDirectories.push(artifactsDir);
|
|
183
180
|
if (userDataDir) {
|
|
184
|
-
(0,
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
recursive: true,
|
|
188
|
-
mode: 0o700
|
|
189
|
-
});
|
|
181
|
+
(0, import_assert.assert)(import_path.default.isAbsolute(userDataDir), "userDataDir must be an absolute path");
|
|
182
|
+
if (!await (0, import_fileUtils.existsAsync)(userDataDir))
|
|
183
|
+
await import_fs.default.promises.mkdir(userDataDir, { recursive: true, mode: 448 });
|
|
190
184
|
} else {
|
|
191
|
-
userDataDir = await
|
|
185
|
+
userDataDir = await import_fs.default.promises.mkdtemp(import_path.default.join(import_os.default.tmpdir(), `playwright_${this._name}dev_profile-`));
|
|
192
186
|
tempDirectories.push(userDataDir);
|
|
193
187
|
}
|
|
194
188
|
await this.prepareUserDataDir(options, userDataDir);
|
|
195
189
|
const browserArguments = [];
|
|
196
|
-
if (ignoreAllDefaultArgs)
|
|
190
|
+
if (ignoreAllDefaultArgs)
|
|
191
|
+
browserArguments.push(...args);
|
|
192
|
+
else if (ignoreDefaultArgs)
|
|
193
|
+
browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir).filter((arg) => ignoreDefaultArgs.indexOf(arg) === -1));
|
|
194
|
+
else
|
|
195
|
+
browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir));
|
|
197
196
|
let executable;
|
|
198
197
|
if (executablePath) {
|
|
199
|
-
if (!
|
|
198
|
+
if (!await (0, import_fileUtils.existsAsync)(executablePath))
|
|
199
|
+
throw new Error(`Failed to launch ${this._name} because executable doesn't exist at ${executablePath}`);
|
|
200
200
|
executable = executablePath;
|
|
201
201
|
} else {
|
|
202
|
-
const registryExecutable =
|
|
203
|
-
if (!registryExecutable || registryExecutable.browserName !== this._name)
|
|
202
|
+
const registryExecutable = import_registry.registry.findExecutable(this.getExecutableName(options));
|
|
203
|
+
if (!registryExecutable || registryExecutable.browserName !== this._name)
|
|
204
|
+
throw new Error(`Unsupported ${this._name} channel "${options.channel}"`);
|
|
204
205
|
executable = registryExecutable.executablePathOrDie(this.attribution.playwright.options.sdkLanguage);
|
|
205
|
-
await
|
|
206
|
+
await import_registry.registry.validateHostRequirementsForExecutablesIfNeeded([registryExecutable], this.attribution.playwright.options.sdkLanguage);
|
|
206
207
|
}
|
|
207
208
|
const readyState = this.readyState(options);
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
let browserProcess = undefined;
|
|
212
|
-
const {
|
|
213
|
-
launchedProcess,
|
|
214
|
-
gracefullyClose,
|
|
215
|
-
kill
|
|
216
|
-
} = await (0, _processLauncher.launchProcess)({
|
|
209
|
+
let transport = void 0;
|
|
210
|
+
let browserProcess = void 0;
|
|
211
|
+
const { launchedProcess, gracefullyClose, kill } = await (0, import_processLauncher.launchProcess)({
|
|
217
212
|
command: executable,
|
|
218
213
|
args: browserArguments,
|
|
219
214
|
env: this.amendEnvironment(env, userDataDir, executable, browserArguments),
|
|
220
215
|
handleSIGINT,
|
|
221
216
|
handleSIGTERM,
|
|
222
217
|
handleSIGHUP,
|
|
223
|
-
log: message => {
|
|
224
|
-
readyState
|
|
218
|
+
log: (message) => {
|
|
219
|
+
readyState?.onBrowserOutput(message);
|
|
225
220
|
progress.log(message);
|
|
226
221
|
browserLogsCollector.log(message);
|
|
227
222
|
},
|
|
228
|
-
stdio:
|
|
223
|
+
stdio: "pipe",
|
|
229
224
|
tempDirectories,
|
|
230
225
|
attemptToGracefullyClose: async () => {
|
|
231
|
-
if (options.__testHookGracefullyClose)
|
|
232
|
-
|
|
233
|
-
// Note that it's fine to reuse the pipe transport, since
|
|
234
|
-
// our connection ignores kBrowserCloseMessageId.
|
|
226
|
+
if (options.__testHookGracefullyClose)
|
|
227
|
+
await options.__testHookGracefullyClose();
|
|
235
228
|
this.attemptToGracefullyCloseBrowser(transport);
|
|
236
229
|
},
|
|
237
230
|
onExit: (exitCode, signal) => {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
231
|
+
readyState?.onBrowserExit();
|
|
232
|
+
if (browserProcess && browserProcess.onclose)
|
|
233
|
+
browserProcess.onclose(exitCode, signal);
|
|
241
234
|
}
|
|
242
235
|
});
|
|
243
236
|
async function closeOrKill(timeout) {
|
|
244
237
|
let timer;
|
|
245
238
|
try {
|
|
246
|
-
await Promise.race([
|
|
239
|
+
await Promise.race([
|
|
240
|
+
gracefullyClose(),
|
|
241
|
+
new Promise((resolve, reject) => timer = setTimeout(reject, timeout))
|
|
242
|
+
]);
|
|
247
243
|
} catch (ignored) {
|
|
248
|
-
await kill().catch(
|
|
244
|
+
await kill().catch((ignored2) => {
|
|
245
|
+
});
|
|
249
246
|
} finally {
|
|
250
247
|
clearTimeout(timer);
|
|
251
248
|
}
|
|
252
249
|
}
|
|
253
250
|
browserProcess = {
|
|
254
|
-
onclose:
|
|
251
|
+
onclose: void 0,
|
|
255
252
|
process: launchedProcess,
|
|
256
|
-
close: () => closeOrKill(options.__testHookBrowserCloseTimeout ||
|
|
253
|
+
close: () => closeOrKill(options.__testHookBrowserCloseTimeout || import_timeoutSettings.DEFAULT_TIMEOUT),
|
|
257
254
|
kill
|
|
258
255
|
};
|
|
259
256
|
progress.cleanupWhenAborted(() => closeOrKill(progress.timeUntilDeadline()));
|
|
260
|
-
const wsEndpoint = (
|
|
257
|
+
const wsEndpoint = (await readyState?.waitUntilReady())?.wsEndpoint;
|
|
261
258
|
if (options.useWebSocket) {
|
|
262
|
-
transport = await
|
|
259
|
+
transport = await import_transport.WebSocketTransport.connect(progress, wsEndpoint);
|
|
263
260
|
} else {
|
|
264
261
|
const stdio = launchedProcess.stdio;
|
|
265
|
-
transport = new
|
|
262
|
+
transport = new import_pipeTransport.PipeTransport(stdio[3], stdio[4]);
|
|
266
263
|
}
|
|
267
|
-
return {
|
|
268
|
-
browserProcess,
|
|
269
|
-
artifactsDir,
|
|
270
|
-
userDataDir,
|
|
271
|
-
transport
|
|
272
|
-
};
|
|
264
|
+
return { browserProcess, artifactsDir, userDataDir, transport };
|
|
273
265
|
}
|
|
274
266
|
async _createArtifactDirs(options) {
|
|
275
|
-
if (options.downloadsPath)
|
|
276
|
-
recursive: true
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
recursive: true
|
|
280
|
-
});
|
|
267
|
+
if (options.downloadsPath)
|
|
268
|
+
await import_fs.default.promises.mkdir(options.downloadsPath, { recursive: true });
|
|
269
|
+
if (options.tracesDir)
|
|
270
|
+
await import_fs.default.promises.mkdir(options.tracesDir, { recursive: true });
|
|
281
271
|
}
|
|
282
|
-
async connectOverCDP(metadata, endpointURL, options
|
|
283
|
-
throw new Error(
|
|
272
|
+
async connectOverCDP(metadata, endpointURL, options) {
|
|
273
|
+
throw new Error("CDP connections are only supported by Chromium");
|
|
284
274
|
}
|
|
285
275
|
async _launchWithSeleniumHub(progress, hubUrl, options) {
|
|
286
|
-
throw new Error(
|
|
276
|
+
throw new Error("Connecting to SELENIUM_REMOTE_URL is only supported by Chromium");
|
|
287
277
|
}
|
|
288
278
|
_validateLaunchOptions(options) {
|
|
289
|
-
const {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
downloadsPath,
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (downloadsPath && !_path.default.isAbsolute(downloadsPath)) downloadsPath = _path.default.join(process.cwd(), downloadsPath);
|
|
299
|
-
if (this.attribution.playwright.options.socksProxyPort) proxy = {
|
|
300
|
-
server: `socks5://127.0.0.1:${this.attribution.playwright.options.socksProxyPort}`
|
|
301
|
-
};
|
|
302
|
-
return {
|
|
303
|
-
...options,
|
|
304
|
-
devtools,
|
|
305
|
-
headless,
|
|
306
|
-
downloadsPath,
|
|
307
|
-
proxy
|
|
308
|
-
};
|
|
279
|
+
const { devtools = false } = options;
|
|
280
|
+
let { headless = !devtools, downloadsPath, proxy } = options;
|
|
281
|
+
if ((0, import_debug.debugMode)())
|
|
282
|
+
headless = false;
|
|
283
|
+
if (downloadsPath && !import_path.default.isAbsolute(downloadsPath))
|
|
284
|
+
downloadsPath = import_path.default.join(process.cwd(), downloadsPath);
|
|
285
|
+
if (this.attribution.playwright.options.socksProxyPort)
|
|
286
|
+
proxy = { server: `socks5://127.0.0.1:${this.attribution.playwright.options.socksProxyPort}` };
|
|
287
|
+
return { ...options, devtools, headless, downloadsPath, proxy };
|
|
309
288
|
}
|
|
310
289
|
_createUserDataDirArgMisuseError(userDataDirArg) {
|
|
311
290
|
switch (this.attribution.playwright.options.sdkLanguage) {
|
|
312
|
-
case
|
|
291
|
+
case "java":
|
|
313
292
|
return new Error(`Pass userDataDir parameter to 'BrowserType.launchPersistentContext(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`);
|
|
314
|
-
case
|
|
293
|
+
case "python":
|
|
315
294
|
return new Error(`Pass user_data_dir parameter to 'browser_type.launch_persistent_context(user_data_dir, **kwargs)' instead of specifying '${userDataDirArg}' argument`);
|
|
316
|
-
case
|
|
295
|
+
case "csharp":
|
|
317
296
|
return new Error(`Pass userDataDir parameter to 'BrowserType.LaunchPersistentContextAsync(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`);
|
|
318
297
|
default:
|
|
319
298
|
return new Error(`Pass userDataDir parameter to 'browserType.launchPersistentContext(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`);
|
|
320
299
|
}
|
|
321
300
|
}
|
|
322
301
|
_rewriteStartupLog(error) {
|
|
323
|
-
if (!(0,
|
|
302
|
+
if (!(0, import_protocolError.isProtocolError)(error))
|
|
303
|
+
return error;
|
|
324
304
|
return this.doRewriteStartupLog(error);
|
|
325
305
|
}
|
|
326
306
|
readyState(options) {
|
|
327
|
-
return
|
|
307
|
+
return void 0;
|
|
308
|
+
}
|
|
309
|
+
async prepareUserDataDir(options, userDataDir) {
|
|
328
310
|
}
|
|
329
|
-
async prepareUserDataDir(options, userDataDir) {}
|
|
330
311
|
getExecutableName(options) {
|
|
331
312
|
return options.channel || this._name;
|
|
332
313
|
}
|
|
333
314
|
}
|
|
334
|
-
exports.BrowserType = BrowserType;
|
|
335
315
|
function copyTestHooks(from, to) {
|
|
336
316
|
for (const [key, value] of Object.entries(from)) {
|
|
337
|
-
if (key.startsWith(
|
|
317
|
+
if (key.startsWith("__testHook"))
|
|
318
|
+
to[key] = value;
|
|
338
319
|
}
|
|
339
|
-
}
|
|
320
|
+
}
|
|
321
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
322
|
+
0 && (module.exports = {
|
|
323
|
+
BrowserReadyState,
|
|
324
|
+
BrowserType,
|
|
325
|
+
kNoXServerRunningError
|
|
326
|
+
});
|
package/lib/server/callLog.js
CHANGED
|
@@ -1,35 +1,41 @@
|
|
|
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 callLog_exports = {};
|
|
20
|
+
__export(callLog_exports, {
|
|
21
|
+
compressCallLog: () => compressCallLog,
|
|
22
|
+
findRepeatedSubsequencesForTest: () => findRepeatedSubsequencesForTest
|
|
5
23
|
});
|
|
6
|
-
exports
|
|
7
|
-
exports.findRepeatedSubsequencesForTest = void 0;
|
|
8
|
-
/**
|
|
9
|
-
* Copyright (c) Microsoft Corporation.
|
|
10
|
-
*
|
|
11
|
-
* Licensed under the Apache License, Version 2.0 (the 'License");
|
|
12
|
-
* you may not use this file except in compliance with the License.
|
|
13
|
-
* You may obtain a copy of the License at
|
|
14
|
-
*
|
|
15
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
-
*
|
|
17
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
18
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
-
* See the License for the specific language governing permissions and
|
|
21
|
-
* limitations under the License.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
+
module.exports = __toCommonJS(callLog_exports);
|
|
24
25
|
function compressCallLog(log) {
|
|
25
26
|
const lines = [];
|
|
26
27
|
for (const block of findRepeatedSubsequences(log)) {
|
|
27
28
|
for (let i = 0; i < block.sequence.length; i++) {
|
|
28
29
|
const line = block.sequence[i];
|
|
29
30
|
const leadingWhitespace = line.match(/^\s*/);
|
|
30
|
-
const whitespacePrefix =
|
|
31
|
-
const countPrefix = `${block.count}
|
|
32
|
-
if (block.count > 1 && i === 0)
|
|
31
|
+
const whitespacePrefix = " " + leadingWhitespace?.[0] || "";
|
|
32
|
+
const countPrefix = `${block.count} \xD7 `;
|
|
33
|
+
if (block.count > 1 && i === 0)
|
|
34
|
+
lines.push(whitespacePrefix + countPrefix + line.trim());
|
|
35
|
+
else if (block.count > 1)
|
|
36
|
+
lines.push(whitespacePrefix + " ".repeat(countPrefix.length - 2) + "- " + line.trim());
|
|
37
|
+
else
|
|
38
|
+
lines.push(whitespacePrefix + "- " + line.trim());
|
|
33
39
|
}
|
|
34
40
|
}
|
|
35
41
|
return lines;
|
|
@@ -39,41 +45,38 @@ function findRepeatedSubsequences(s) {
|
|
|
39
45
|
const result = [];
|
|
40
46
|
let i = 0;
|
|
41
47
|
const arraysEqual = (a1, a2) => {
|
|
42
|
-
if (a1.length !== a2.length)
|
|
48
|
+
if (a1.length !== a2.length)
|
|
49
|
+
return false;
|
|
43
50
|
for (let j = 0; j < a1.length; j++) {
|
|
44
|
-
if (a1[j] !== a2[j])
|
|
51
|
+
if (a1[j] !== a2[j])
|
|
52
|
+
return false;
|
|
45
53
|
}
|
|
46
54
|
return true;
|
|
47
55
|
};
|
|
48
56
|
while (i < n) {
|
|
49
57
|
let maxRepeatCount = 1;
|
|
50
|
-
let maxRepeatSubstr = [s[i]];
|
|
58
|
+
let maxRepeatSubstr = [s[i]];
|
|
51
59
|
let maxRepeatLength = 1;
|
|
52
|
-
|
|
53
|
-
// Try substrings of length from 1 to the remaining length of the array
|
|
54
60
|
for (let p = 1; p <= n - i; p++) {
|
|
55
|
-
const substr = s.slice(i, i + p);
|
|
61
|
+
const substr = s.slice(i, i + p);
|
|
56
62
|
let k = 1;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
k -= 1; // Adjust k since it increments one extra time in the loop
|
|
61
|
-
|
|
62
|
-
// Update the maximal repeating substring if necessary
|
|
63
|
+
while (i + p * k <= n && arraysEqual(s.slice(i + p * (k - 1), i + p * k), substr))
|
|
64
|
+
k += 1;
|
|
65
|
+
k -= 1;
|
|
63
66
|
if (k > 1 && k * p > maxRepeatCount * maxRepeatLength) {
|
|
64
67
|
maxRepeatCount = k;
|
|
65
68
|
maxRepeatSubstr = substr;
|
|
66
69
|
maxRepeatLength = p;
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
result.push({
|
|
72
|
-
sequence: maxRepeatSubstr,
|
|
73
|
-
count: maxRepeatCount
|
|
74
|
-
});
|
|
75
|
-
i += maxRepeatLength * maxRepeatCount; // Move index forward
|
|
72
|
+
result.push({ sequence: maxRepeatSubstr, count: maxRepeatCount });
|
|
73
|
+
i += maxRepeatLength * maxRepeatCount;
|
|
76
74
|
}
|
|
77
75
|
return result;
|
|
78
76
|
}
|
|
79
|
-
const findRepeatedSubsequencesForTest =
|
|
77
|
+
const findRepeatedSubsequencesForTest = findRepeatedSubsequences;
|
|
78
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
79
|
+
0 && (module.exports = {
|
|
80
|
+
compressCallLog,
|
|
81
|
+
findRepeatedSubsequencesForTest
|
|
82
|
+
});
|