patchright-core 1.51.3 → 1.52.1
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 +56 -71
- 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 +371 -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 +221 -112
- package/lib/server/frames.js +731 -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 +326 -423
- 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 +86 -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-CXVeovup.js} +1 -1
- package/lib/vite/recorder/assets/index-BsWQsSGl.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-1DiydmYA.js → codeMirrorModule-_GLjJL-7.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.cFZzK9RN.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.XVPIqBeS.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- 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,230 +1,205 @@
|
|
|
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 playwrightConnection_exports = {};
|
|
20
|
+
__export(playwrightConnection_exports, {
|
|
21
|
+
PlaywrightConnection: () => PlaywrightConnection
|
|
5
22
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
/**
|
|
19
|
-
* Copyright (c) Microsoft Corporation.
|
|
20
|
-
*
|
|
21
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
22
|
-
* you may not use this file except in compliance with the License.
|
|
23
|
-
* You may obtain a copy of the License at
|
|
24
|
-
*
|
|
25
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
26
|
-
*
|
|
27
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
28
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
29
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
30
|
-
* See the License for the specific language governing permissions and
|
|
31
|
-
* limitations under the License.
|
|
32
|
-
*/
|
|
33
|
-
|
|
23
|
+
module.exports = __toCommonJS(playwrightConnection_exports);
|
|
24
|
+
var import_socksProxy = require("../server/utils/socksProxy");
|
|
25
|
+
var import_server = require("../server");
|
|
26
|
+
var import_android = require("../server/android/android");
|
|
27
|
+
var import_browser = require("../server/browser");
|
|
28
|
+
var import_debugControllerDispatcher = require("../server/dispatchers/debugControllerDispatcher");
|
|
29
|
+
var import_instrumentation = require("../server/instrumentation");
|
|
30
|
+
var import_assert = require("../utils/isomorphic/assert");
|
|
31
|
+
var import_debug = require("../server/utils/debug");
|
|
32
|
+
var import_profiler = require("../server/utils/profiler");
|
|
33
|
+
var import_utils = require("../utils");
|
|
34
|
+
var import_debugLogger = require("../server/utils/debugLogger");
|
|
34
35
|
class PlaywrightConnection {
|
|
35
36
|
constructor(lock, clientType, ws, options, preLaunched, id, onClose) {
|
|
36
|
-
this._ws = void 0;
|
|
37
|
-
this._onClose = void 0;
|
|
38
|
-
this._dispatcherConnection = void 0;
|
|
39
37
|
this._cleanups = [];
|
|
40
|
-
this._id = void 0;
|
|
41
38
|
this._disconnected = false;
|
|
42
|
-
this._preLaunched = void 0;
|
|
43
|
-
this._options = void 0;
|
|
44
|
-
this._root = void 0;
|
|
45
|
-
this._profileName = void 0;
|
|
46
39
|
this._ws = ws;
|
|
47
40
|
this._preLaunched = preLaunched;
|
|
48
41
|
this._options = options;
|
|
49
42
|
options.launchOptions = filterLaunchOptions(options.launchOptions, options.allowFSPaths);
|
|
50
|
-
if (clientType ===
|
|
51
|
-
|
|
43
|
+
if (clientType === "reuse-browser" || clientType === "pre-launched-browser-or-android")
|
|
44
|
+
(0, import_assert.assert)(preLaunched.playwright);
|
|
45
|
+
if (clientType === "pre-launched-browser-or-android")
|
|
46
|
+
(0, import_assert.assert)(preLaunched.browser || preLaunched.androidDevice);
|
|
52
47
|
this._onClose = onClose;
|
|
53
48
|
this._id = id;
|
|
54
|
-
this._profileName = `${new Date().toISOString()}-${clientType}`;
|
|
55
|
-
this._dispatcherConnection = new
|
|
56
|
-
this._dispatcherConnection.onmessage = async message => {
|
|
49
|
+
this._profileName = `${(/* @__PURE__ */ new Date()).toISOString()}-${clientType}`;
|
|
50
|
+
this._dispatcherConnection = new import_server.DispatcherConnection();
|
|
51
|
+
this._dispatcherConnection.onmessage = async (message) => {
|
|
57
52
|
await lock;
|
|
58
53
|
if (ws.readyState !== ws.CLOSING) {
|
|
59
54
|
const messageString = JSON.stringify(message);
|
|
60
|
-
if (
|
|
61
|
-
|
|
55
|
+
if (import_debugLogger.debugLogger.isEnabled("server:channel"))
|
|
56
|
+
import_debugLogger.debugLogger.log("server:channel", `[${this._id}] ${(0, import_utils.monotonicTime)() * 1e3} SEND \u25BA ${messageString}`);
|
|
57
|
+
if (import_debugLogger.debugLogger.isEnabled("server:metadata"))
|
|
58
|
+
this.logServerMetadata(message, messageString, "SEND");
|
|
62
59
|
ws.send(messageString);
|
|
63
60
|
}
|
|
64
61
|
};
|
|
65
|
-
ws.on(
|
|
62
|
+
ws.on("message", async (message) => {
|
|
66
63
|
await lock;
|
|
67
64
|
const messageString = Buffer.from(message).toString();
|
|
68
65
|
const jsonMessage = JSON.parse(messageString);
|
|
69
|
-
if (
|
|
70
|
-
|
|
66
|
+
if (import_debugLogger.debugLogger.isEnabled("server:channel"))
|
|
67
|
+
import_debugLogger.debugLogger.log("server:channel", `[${this._id}] ${(0, import_utils.monotonicTime)() * 1e3} \u25C0 RECV ${messageString}`);
|
|
68
|
+
if (import_debugLogger.debugLogger.isEnabled("server:metadata"))
|
|
69
|
+
this.logServerMetadata(jsonMessage, messageString, "RECV");
|
|
71
70
|
this._dispatcherConnection.dispatch(jsonMessage);
|
|
72
71
|
});
|
|
73
|
-
ws.on(
|
|
74
|
-
ws.on(
|
|
75
|
-
if (clientType ===
|
|
72
|
+
ws.on("close", () => this._onDisconnect());
|
|
73
|
+
ws.on("error", (error) => this._onDisconnect(error));
|
|
74
|
+
if (clientType === "controller") {
|
|
76
75
|
this._root = this._initDebugControllerMode();
|
|
77
76
|
return;
|
|
78
77
|
}
|
|
79
|
-
this._root = new
|
|
80
|
-
await (0,
|
|
81
|
-
if (clientType ===
|
|
82
|
-
|
|
83
|
-
if (clientType ===
|
|
84
|
-
|
|
78
|
+
this._root = new import_server.RootDispatcher(this._dispatcherConnection, async (scope, options2) => {
|
|
79
|
+
await (0, import_profiler.startProfiling)();
|
|
80
|
+
if (clientType === "reuse-browser")
|
|
81
|
+
return await this._initReuseBrowsersMode(scope);
|
|
82
|
+
if (clientType === "pre-launched-browser-or-android")
|
|
83
|
+
return this._preLaunched.browser ? await this._initPreLaunchedBrowserMode(scope) : await this._initPreLaunchedAndroidMode(scope);
|
|
84
|
+
if (clientType === "launch-browser")
|
|
85
|
+
return await this._initLaunchBrowserMode(scope, options2);
|
|
86
|
+
throw new Error("Unsupported client type: " + clientType);
|
|
85
87
|
});
|
|
86
88
|
}
|
|
87
89
|
async _initLaunchBrowserMode(scope, options) {
|
|
88
|
-
|
|
89
|
-
const playwright = (0,
|
|
90
|
-
sdkLanguage: options.sdkLanguage,
|
|
91
|
-
isServer: true
|
|
92
|
-
});
|
|
90
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] engaged launch mode for "${this._options.browserName}"`);
|
|
91
|
+
const playwright = (0, import_server.createPlaywright)({ sdkLanguage: options.sdkLanguage, isServer: true });
|
|
93
92
|
const ownedSocksProxy = await this._createOwnedSocksProxy(playwright);
|
|
94
93
|
let browserName = this._options.browserName;
|
|
95
|
-
if (
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
if ("bidi" === browserName) {
|
|
95
|
+
if (this._options.launchOptions?.channel?.toLocaleLowerCase().includes("firefox"))
|
|
96
|
+
browserName = "bidiFirefox";
|
|
97
|
+
else
|
|
98
|
+
browserName = "bidiChromium";
|
|
98
99
|
}
|
|
99
|
-
const browser = await playwright[browserName].launch((0,
|
|
100
|
+
const browser = await playwright[browserName].launch((0, import_instrumentation.serverSideCallMetadata)(), this._options.launchOptions);
|
|
100
101
|
this._cleanups.push(async () => {
|
|
101
|
-
for (const
|
|
102
|
-
reason:
|
|
103
|
-
});
|
|
102
|
+
for (const browser2 of playwright.allBrowsers())
|
|
103
|
+
await browser2.close({ reason: "Connection terminated" });
|
|
104
104
|
});
|
|
105
|
-
browser.on(
|
|
106
|
-
|
|
107
|
-
this.close({
|
|
108
|
-
code: 1001,
|
|
109
|
-
reason: 'Browser closed'
|
|
110
|
-
});
|
|
105
|
+
browser.on(import_browser.Browser.Events.Disconnected, () => {
|
|
106
|
+
this.close({ code: 1001, reason: "Browser closed" });
|
|
111
107
|
});
|
|
112
|
-
return new
|
|
108
|
+
return new import_server.PlaywrightDispatcher(scope, playwright, ownedSocksProxy, browser);
|
|
113
109
|
}
|
|
114
110
|
async _initPreLaunchedBrowserMode(scope) {
|
|
115
|
-
|
|
116
|
-
_debugLogger.debugLogger.log('server', `[${this._id}] engaged pre-launched (browser) mode`);
|
|
111
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] engaged pre-launched (browser) mode`);
|
|
117
112
|
const playwright = this._preLaunched.playwright;
|
|
118
|
-
|
|
119
|
-
// Note: connected client owns the socks proxy and configures the pattern.
|
|
120
|
-
(_this$_preLaunched$so = this._preLaunched.socksProxy) === null || _this$_preLaunched$so === void 0 || _this$_preLaunched$so.setPattern(this._options.socksProxyPattern);
|
|
113
|
+
this._preLaunched.socksProxy?.setPattern(this._options.socksProxyPattern);
|
|
121
114
|
const browser = this._preLaunched.browser;
|
|
122
|
-
browser.on(
|
|
123
|
-
|
|
124
|
-
this.close({
|
|
125
|
-
code: 1001,
|
|
126
|
-
reason: 'Browser closed'
|
|
127
|
-
});
|
|
115
|
+
browser.on(import_browser.Browser.Events.Disconnected, () => {
|
|
116
|
+
this.close({ code: 1001, reason: "Browser closed" });
|
|
128
117
|
});
|
|
129
|
-
const playwrightDispatcher = new
|
|
130
|
-
// In pre-launched mode, keep only the pre-launched browser.
|
|
118
|
+
const playwrightDispatcher = new import_server.PlaywrightDispatcher(scope, playwright, this._preLaunched.socksProxy, browser);
|
|
131
119
|
for (const b of playwright.allBrowsers()) {
|
|
132
|
-
if (b !== browser)
|
|
133
|
-
reason:
|
|
134
|
-
});
|
|
120
|
+
if (b !== browser)
|
|
121
|
+
await b.close({ reason: "Connection terminated" });
|
|
135
122
|
}
|
|
136
123
|
this._cleanups.push(() => playwrightDispatcher.cleanup());
|
|
137
124
|
return playwrightDispatcher;
|
|
138
125
|
}
|
|
139
126
|
async _initPreLaunchedAndroidMode(scope) {
|
|
140
|
-
|
|
127
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] engaged pre-launched (Android) mode`);
|
|
141
128
|
const playwright = this._preLaunched.playwright;
|
|
142
129
|
const androidDevice = this._preLaunched.androidDevice;
|
|
143
|
-
androidDevice.on(
|
|
144
|
-
|
|
145
|
-
this.close({
|
|
146
|
-
code: 1001,
|
|
147
|
-
reason: 'Android device disconnected'
|
|
148
|
-
});
|
|
130
|
+
androidDevice.on(import_android.AndroidDevice.Events.Close, () => {
|
|
131
|
+
this.close({ code: 1001, reason: "Android device disconnected" });
|
|
149
132
|
});
|
|
150
|
-
const playwrightDispatcher = new
|
|
133
|
+
const playwrightDispatcher = new import_server.PlaywrightDispatcher(scope, playwright, void 0, void 0, androidDevice);
|
|
151
134
|
this._cleanups.push(() => playwrightDispatcher.cleanup());
|
|
152
135
|
return playwrightDispatcher;
|
|
153
136
|
}
|
|
154
137
|
_initDebugControllerMode() {
|
|
155
|
-
|
|
138
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] engaged reuse controller mode`);
|
|
156
139
|
const playwright = this._preLaunched.playwright;
|
|
157
|
-
|
|
158
|
-
return new _debugControllerDispatcher.DebugControllerDispatcher(this._dispatcherConnection, playwright.debugController);
|
|
140
|
+
return new import_debugControllerDispatcher.DebugControllerDispatcher(this._dispatcherConnection, playwright.debugController);
|
|
159
141
|
}
|
|
160
142
|
async _initReuseBrowsersMode(scope) {
|
|
161
|
-
|
|
162
|
-
// clients come and go, while the browser stays the same.
|
|
163
|
-
|
|
164
|
-
_debugLogger.debugLogger.log('server', `[${this._id}] engaged reuse browsers mode for ${this._options.browserName}`);
|
|
143
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] engaged reuse browsers mode for ${this._options.browserName}`);
|
|
165
144
|
const playwright = this._preLaunched.playwright;
|
|
166
145
|
const requestedOptions = launchOptionsHash(this._options.launchOptions);
|
|
167
|
-
let browser = playwright.allBrowsers().find(b => {
|
|
168
|
-
if (b.options.name !== this._options.browserName)
|
|
146
|
+
let browser = playwright.allBrowsers().find((b) => {
|
|
147
|
+
if (b.options.name !== this._options.browserName)
|
|
148
|
+
return false;
|
|
169
149
|
const existingOptions = launchOptionsHash(b.options.originalLaunchOptions);
|
|
170
150
|
return existingOptions === requestedOptions;
|
|
171
151
|
});
|
|
172
|
-
|
|
173
|
-
// Close remaining browsers of this type+channel. Keep different browser types for the speed.
|
|
174
152
|
for (const b of playwright.allBrowsers()) {
|
|
175
|
-
if (b === browser)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
153
|
+
if (b === browser)
|
|
154
|
+
continue;
|
|
155
|
+
if (b.options.name === this._options.browserName && b.options.channel === this._options.launchOptions.channel)
|
|
156
|
+
await b.close({ reason: "Connection terminated" });
|
|
179
157
|
}
|
|
180
158
|
if (!browser) {
|
|
181
|
-
browser = await playwright[this._options.browserName ||
|
|
159
|
+
browser = await playwright[this._options.browserName || "chromium"].launch((0, import_instrumentation.serverSideCallMetadata)(), {
|
|
182
160
|
...this._options.launchOptions,
|
|
183
161
|
headless: !!process.env.PW_DEBUG_CONTROLLER_HEADLESS
|
|
184
162
|
});
|
|
185
|
-
browser.on(
|
|
186
|
-
|
|
187
|
-
this.close({
|
|
188
|
-
code: 1001,
|
|
189
|
-
reason: 'Browser closed'
|
|
190
|
-
});
|
|
163
|
+
browser.on(import_browser.Browser.Events.Disconnected, () => {
|
|
164
|
+
this.close({ code: 1001, reason: "Browser closed" });
|
|
191
165
|
});
|
|
192
166
|
}
|
|
193
167
|
this._cleanups.push(async () => {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
});else await context.stopPendingOperations('Connection closed');
|
|
168
|
+
for (const browser2 of playwright.allBrowsers()) {
|
|
169
|
+
for (const context of browser2.contexts()) {
|
|
170
|
+
if (!context.pages().length)
|
|
171
|
+
await context.close({ reason: "Connection terminated" });
|
|
172
|
+
else
|
|
173
|
+
await context.stopPendingOperations("Connection closed");
|
|
201
174
|
}
|
|
202
|
-
if (!
|
|
203
|
-
reason:
|
|
204
|
-
});
|
|
175
|
+
if (!browser2.contexts())
|
|
176
|
+
await browser2.close({ reason: "Connection terminated" });
|
|
205
177
|
}
|
|
206
178
|
});
|
|
207
|
-
const playwrightDispatcher = new
|
|
179
|
+
const playwrightDispatcher = new import_server.PlaywrightDispatcher(scope, playwright, void 0, browser);
|
|
208
180
|
return playwrightDispatcher;
|
|
209
181
|
}
|
|
210
182
|
async _createOwnedSocksProxy(playwright) {
|
|
211
|
-
if (!this._options.socksProxyPattern)
|
|
212
|
-
|
|
183
|
+
if (!this._options.socksProxyPattern)
|
|
184
|
+
return;
|
|
185
|
+
const socksProxy = new import_socksProxy.SocksProxy();
|
|
213
186
|
socksProxy.setPattern(this._options.socksProxyPattern);
|
|
214
187
|
playwright.options.socksProxyPort = await socksProxy.listen(0);
|
|
215
|
-
|
|
188
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] started socks proxy on port ${playwright.options.socksProxyPort}`);
|
|
216
189
|
this._cleanups.push(() => socksProxy.close());
|
|
217
190
|
return socksProxy;
|
|
218
191
|
}
|
|
219
192
|
async _onDisconnect(error) {
|
|
220
193
|
this._disconnected = true;
|
|
221
|
-
|
|
194
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] disconnected. error: ${error}`);
|
|
222
195
|
this._root._dispose();
|
|
223
|
-
|
|
224
|
-
for (const cleanup of this._cleanups)
|
|
225
|
-
|
|
196
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] starting cleanup`);
|
|
197
|
+
for (const cleanup of this._cleanups)
|
|
198
|
+
await cleanup().catch(() => {
|
|
199
|
+
});
|
|
200
|
+
await (0, import_profiler.stopProfiling)(this._profileName);
|
|
226
201
|
this._onClose();
|
|
227
|
-
|
|
202
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] finished cleanup`);
|
|
228
203
|
}
|
|
229
204
|
logServerMetadata(message, messageString, direction) {
|
|
230
205
|
const serverLogMetadata = {
|
|
@@ -232,28 +207,29 @@ class PlaywrightConnection {
|
|
|
232
207
|
id: message.id,
|
|
233
208
|
guid: message.guid,
|
|
234
209
|
method: message.method,
|
|
235
|
-
payloadSizeInBytes: Buffer.byteLength(messageString,
|
|
210
|
+
payloadSizeInBytes: Buffer.byteLength(messageString, "utf-8")
|
|
236
211
|
};
|
|
237
|
-
|
|
212
|
+
import_debugLogger.debugLogger.log("server:metadata", (direction === "SEND" ? "SEND \u25BA " : "\u25C0 RECV ") + JSON.stringify(serverLogMetadata));
|
|
238
213
|
}
|
|
239
214
|
async close(reason) {
|
|
240
|
-
if (this._disconnected)
|
|
241
|
-
|
|
215
|
+
if (this._disconnected)
|
|
216
|
+
return;
|
|
217
|
+
import_debugLogger.debugLogger.log("server", `[${this._id}] force closing connection: ${reason?.reason || ""} (${reason?.code || 0})`);
|
|
242
218
|
try {
|
|
243
|
-
this._ws.close(reason
|
|
244
|
-
} catch (e) {
|
|
219
|
+
this._ws.close(reason?.code, reason?.reason);
|
|
220
|
+
} catch (e) {
|
|
221
|
+
}
|
|
245
222
|
}
|
|
246
223
|
}
|
|
247
|
-
exports.PlaywrightConnection = PlaywrightConnection;
|
|
248
224
|
function launchOptionsHash(options) {
|
|
249
|
-
const copy = {
|
|
250
|
-
...options
|
|
251
|
-
};
|
|
225
|
+
const copy = { ...options };
|
|
252
226
|
for (const k of Object.keys(copy)) {
|
|
253
227
|
const key = k;
|
|
254
|
-
if (copy[key] === defaultLaunchOptions[key])
|
|
228
|
+
if (copy[key] === defaultLaunchOptions[key])
|
|
229
|
+
delete copy[key];
|
|
255
230
|
}
|
|
256
|
-
for (const key of optionsThatAllowBrowserReuse)
|
|
231
|
+
for (const key of optionsThatAllowBrowserReuse)
|
|
232
|
+
delete copy[key];
|
|
257
233
|
return JSON.stringify(copy);
|
|
258
234
|
}
|
|
259
235
|
function filterLaunchOptions(options, allowFSPaths) {
|
|
@@ -268,8 +244,8 @@ function filterLaunchOptions(options, allowFSPaths) {
|
|
|
268
244
|
chromiumSandbox: options.chromiumSandbox,
|
|
269
245
|
firefoxUserPrefs: options.firefoxUserPrefs,
|
|
270
246
|
slowMo: options.slowMo,
|
|
271
|
-
executablePath: (0,
|
|
272
|
-
downloadsPath: allowFSPaths ? options.downloadsPath :
|
|
247
|
+
executablePath: (0, import_debug.isUnderTest)() || allowFSPaths ? options.executablePath : void 0,
|
|
248
|
+
downloadsPath: allowFSPaths ? options.downloadsPath : void 0
|
|
273
249
|
};
|
|
274
250
|
}
|
|
275
251
|
const defaultLaunchOptions = {
|
|
@@ -280,4 +256,11 @@ const defaultLaunchOptions = {
|
|
|
280
256
|
headless: true,
|
|
281
257
|
devtools: false
|
|
282
258
|
};
|
|
283
|
-
const optionsThatAllowBrowserReuse = [
|
|
259
|
+
const optionsThatAllowBrowserReuse = [
|
|
260
|
+
"headless",
|
|
261
|
+
"tracesDir"
|
|
262
|
+
];
|
|
263
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
264
|
+
0 && (module.exports = {
|
|
265
|
+
PlaywrightConnection
|
|
266
|
+
});
|
|
@@ -1,104 +1,105 @@
|
|
|
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 playwrightServer_exports = {};
|
|
20
|
+
__export(playwrightServer_exports, {
|
|
21
|
+
PlaywrightServer: () => PlaywrightServer
|
|
5
22
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
/**
|
|
15
|
-
* Copyright (c) Microsoft Corporation.
|
|
16
|
-
*
|
|
17
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
18
|
-
* you may not use this file except in compliance with the License.
|
|
19
|
-
* You may obtain a copy of the License at
|
|
20
|
-
*
|
|
21
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
22
|
-
*
|
|
23
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
24
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
25
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
26
|
-
* See the License for the specific language governing permissions and
|
|
27
|
-
* limitations under the License.
|
|
28
|
-
*/
|
|
29
|
-
|
|
23
|
+
module.exports = __toCommonJS(playwrightServer_exports);
|
|
24
|
+
var import_playwrightConnection = require("./playwrightConnection");
|
|
25
|
+
var import_playwright = require("../server/playwright");
|
|
26
|
+
var import_debugLogger = require("../server/utils/debugLogger");
|
|
27
|
+
var import_semaphore = require("../utils/isomorphic/semaphore");
|
|
28
|
+
var import_wsServer = require("../server/utils/wsServer");
|
|
29
|
+
var import_ascii = require("../server/utils/ascii");
|
|
30
|
+
var import_userAgent = require("../server/utils/userAgent");
|
|
30
31
|
class PlaywrightServer {
|
|
31
32
|
constructor(options) {
|
|
32
|
-
this._preLaunchedPlaywright = void 0;
|
|
33
|
-
this._options = void 0;
|
|
34
|
-
this._wsServer = void 0;
|
|
35
33
|
this._options = options;
|
|
36
|
-
if (options.preLaunchedBrowser)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
34
|
+
if (options.preLaunchedBrowser)
|
|
35
|
+
this._preLaunchedPlaywright = options.preLaunchedBrowser.attribution.playwright;
|
|
36
|
+
if (options.preLaunchedAndroidDevice)
|
|
37
|
+
this._preLaunchedPlaywright = options.preLaunchedAndroidDevice._android.attribution.playwright;
|
|
38
|
+
const browserSemaphore = new import_semaphore.Semaphore(this._options.maxConnections);
|
|
39
|
+
const controllerSemaphore = new import_semaphore.Semaphore(1);
|
|
40
|
+
const reuseBrowserSemaphore = new import_semaphore.Semaphore(1);
|
|
41
|
+
this._wsServer = new import_wsServer.WSServer({
|
|
42
42
|
onUpgrade: (request, socket) => {
|
|
43
|
-
const uaError = userAgentVersionMatchesErrorMessage(request.headers[
|
|
44
|
-
if (uaError)
|
|
45
|
-
error: `HTTP/${request.httpVersion} 428 Precondition Required\r
|
|
46
|
-
|
|
43
|
+
const uaError = userAgentVersionMatchesErrorMessage(request.headers["user-agent"] || "");
|
|
44
|
+
if (uaError)
|
|
45
|
+
return { error: `HTTP/${request.httpVersion} 428 Precondition Required\r
|
|
46
|
+
\r
|
|
47
|
+
${uaError}` };
|
|
47
48
|
},
|
|
48
|
-
onHeaders: headers => {
|
|
49
|
-
if (process.env.PWTEST_SERVER_WS_HEADERS)
|
|
49
|
+
onHeaders: (headers) => {
|
|
50
|
+
if (process.env.PWTEST_SERVER_WS_HEADERS)
|
|
51
|
+
headers.push(process.env.PWTEST_SERVER_WS_HEADERS);
|
|
50
52
|
},
|
|
51
53
|
onConnection: (request, url, ws, id) => {
|
|
52
|
-
const browserHeader = request.headers[
|
|
53
|
-
const browserName = url.searchParams.get(
|
|
54
|
-
const proxyHeader = request.headers[
|
|
55
|
-
const proxyValue = url.searchParams.get(
|
|
56
|
-
const launchOptionsHeader = request.headers[
|
|
54
|
+
const browserHeader = request.headers["x-playwright-browser"];
|
|
55
|
+
const browserName = url.searchParams.get("browser") || (Array.isArray(browserHeader) ? browserHeader[0] : browserHeader) || null;
|
|
56
|
+
const proxyHeader = request.headers["x-playwright-proxy"];
|
|
57
|
+
const proxyValue = url.searchParams.get("proxy") || (Array.isArray(proxyHeader) ? proxyHeader[0] : proxyHeader);
|
|
58
|
+
const launchOptionsHeader = request.headers["x-playwright-launch-options"] || "";
|
|
57
59
|
const launchOptionsHeaderValue = Array.isArray(launchOptionsHeader) ? launchOptionsHeader[0] : launchOptionsHeader;
|
|
58
|
-
const launchOptionsParam = url.searchParams.get(
|
|
60
|
+
const launchOptionsParam = url.searchParams.get("launch-options");
|
|
59
61
|
let launchOptions = {};
|
|
60
62
|
try {
|
|
61
63
|
launchOptions = JSON.parse(launchOptionsParam || launchOptionsHeaderValue);
|
|
62
|
-
} catch (e) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const isExtension = this._options.mode === 'extension';
|
|
64
|
+
} catch (e) {
|
|
65
|
+
}
|
|
66
|
+
const isExtension = this._options.mode === "extension";
|
|
66
67
|
if (isExtension) {
|
|
67
|
-
if (!this._preLaunchedPlaywright)
|
|
68
|
-
sdkLanguage:
|
|
69
|
-
isServer: true
|
|
70
|
-
});
|
|
68
|
+
if (!this._preLaunchedPlaywright)
|
|
69
|
+
this._preLaunchedPlaywright = (0, import_playwright.createPlaywright)({ sdkLanguage: "javascript", isServer: true });
|
|
71
70
|
}
|
|
72
|
-
let clientType =
|
|
71
|
+
let clientType = "launch-browser";
|
|
73
72
|
let semaphore = browserSemaphore;
|
|
74
|
-
if (isExtension && url.searchParams.has(
|
|
75
|
-
clientType =
|
|
73
|
+
if (isExtension && url.searchParams.has("debug-controller")) {
|
|
74
|
+
clientType = "controller";
|
|
76
75
|
semaphore = controllerSemaphore;
|
|
77
76
|
} else if (isExtension) {
|
|
78
|
-
clientType =
|
|
77
|
+
clientType = "reuse-browser";
|
|
79
78
|
semaphore = reuseBrowserSemaphore;
|
|
80
|
-
} else if (this._options.mode ===
|
|
81
|
-
clientType =
|
|
79
|
+
} else if (this._options.mode === "launchServer") {
|
|
80
|
+
clientType = "pre-launched-browser-or-android";
|
|
82
81
|
semaphore = browserSemaphore;
|
|
83
82
|
}
|
|
84
|
-
return new
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
allowFSPaths: this._options.mode ===
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
83
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
84
|
+
semaphore.acquire(),
|
|
85
|
+
clientType,
|
|
86
|
+
ws,
|
|
87
|
+
{ socksProxyPattern: proxyValue, browserName, launchOptions, allowFSPaths: this._options.mode === "extension" },
|
|
88
|
+
{
|
|
89
|
+
playwright: this._preLaunchedPlaywright,
|
|
90
|
+
browser: this._options.preLaunchedBrowser,
|
|
91
|
+
androidDevice: this._options.preLaunchedAndroidDevice,
|
|
92
|
+
socksProxy: this._options.preLaunchedSocksProxy
|
|
93
|
+
},
|
|
94
|
+
id,
|
|
95
|
+
() => semaphore.release()
|
|
96
|
+
);
|
|
95
97
|
},
|
|
96
98
|
onClose: async () => {
|
|
97
|
-
|
|
98
|
-
if (this._preLaunchedPlaywright)
|
|
99
|
-
reason:
|
|
100
|
-
|
|
101
|
-
_debugLogger.debugLogger.log('server', 'closed browsers');
|
|
99
|
+
import_debugLogger.debugLogger.log("server", "closing browsers");
|
|
100
|
+
if (this._preLaunchedPlaywright)
|
|
101
|
+
await Promise.all(this._preLaunchedPlaywright.allBrowsers().map((browser) => browser.close({ reason: "Playwright Server stopped" })));
|
|
102
|
+
import_debugLogger.debugLogger.log("server", "closed browsers");
|
|
102
103
|
}
|
|
103
104
|
});
|
|
104
105
|
}
|
|
@@ -109,16 +110,30 @@ class PlaywrightServer {
|
|
|
109
110
|
await this._wsServer.close();
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
|
-
exports.PlaywrightServer = PlaywrightServer;
|
|
113
113
|
function userAgentVersionMatchesErrorMessage(userAgent) {
|
|
114
114
|
const match = userAgent.match(/^Playwright\/(\d+\.\d+\.\d+)/);
|
|
115
115
|
if (!match) {
|
|
116
|
-
// Cannot parse user agent - be lax.
|
|
117
116
|
return;
|
|
118
117
|
}
|
|
119
|
-
const received = match[1].split(
|
|
120
|
-
const expected = (0,
|
|
118
|
+
const received = match[1].split(".").slice(0, 2).join(".");
|
|
119
|
+
const expected = (0, import_userAgent.getPlaywrightVersion)(true);
|
|
121
120
|
if (received !== expected) {
|
|
122
|
-
return (0,
|
|
121
|
+
return (0, import_ascii.wrapInASCIIBox)([
|
|
122
|
+
`Playwright version mismatch:`,
|
|
123
|
+
` - server version: v${expected}`,
|
|
124
|
+
` - client version: v${received}`,
|
|
125
|
+
``,
|
|
126
|
+
`If you are using VSCode extension, restart VSCode.`,
|
|
127
|
+
``,
|
|
128
|
+
`If you are connecting to a remote service,`,
|
|
129
|
+
`keep your local Playwright version in sync`,
|
|
130
|
+
`with the remote service version.`,
|
|
131
|
+
``,
|
|
132
|
+
`<3 Playwright Team`
|
|
133
|
+
].join("\n"), 1);
|
|
123
134
|
}
|
|
124
|
-
}
|
|
135
|
+
}
|
|
136
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
137
|
+
0 && (module.exports = {
|
|
138
|
+
PlaywrightServer
|
|
139
|
+
});
|