patchright-bun-core 1.58.0 → 1.58.2
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/README.md +2 -2
- package/ThirdPartyNotices.txt +4075 -4075
- package/bin/install_media_pack.ps1 +5 -5
- package/bin/install_webkit_wsl.ps1 +32 -32
- package/bin/reinstall_chrome_beta_linux.sh +42 -42
- package/bin/reinstall_chrome_beta_mac.sh +13 -13
- package/bin/reinstall_chrome_beta_win.ps1 +24 -24
- package/bin/reinstall_chrome_stable_linux.sh +42 -42
- package/bin/reinstall_chrome_stable_mac.sh +12 -12
- package/bin/reinstall_chrome_stable_win.ps1 +24 -24
- package/bin/reinstall_msedge_beta_linux.sh +48 -48
- package/bin/reinstall_msedge_beta_mac.sh +11 -11
- package/bin/reinstall_msedge_beta_win.ps1 +23 -23
- package/bin/reinstall_msedge_dev_linux.sh +48 -48
- package/bin/reinstall_msedge_dev_mac.sh +11 -11
- package/bin/reinstall_msedge_dev_win.ps1 +23 -23
- package/bin/reinstall_msedge_stable_linux.sh +48 -48
- package/bin/reinstall_msedge_stable_mac.sh +11 -11
- package/bin/reinstall_msedge_stable_win.ps1 +23 -23
- package/browsers.json +79 -79
- package/cli.js +18 -18
- package/index.d.ts +17 -17
- package/index.js +32 -32
- package/index.mjs +28 -28
- package/lib/androidServerImpl.js +65 -65
- package/lib/browserServerImpl.js +120 -120
- package/lib/cli/driver.js +97 -97
- package/lib/cli/program.js +589 -589
- package/lib/cli/programWithTestStub.js +74 -74
- package/lib/client/android.js +361 -361
- package/lib/client/api.js +137 -137
- package/lib/client/artifact.js +79 -79
- package/lib/client/browser.js +161 -161
- package/lib/client/browserContext.js +582 -582
- package/lib/client/browserType.js +185 -185
- package/lib/client/cdpSession.js +51 -51
- package/lib/client/channelOwner.js +194 -194
- package/lib/client/clientHelper.js +64 -64
- package/lib/client/clientInstrumentation.js +55 -55
- package/lib/client/clientStackTrace.js +69 -69
- package/lib/client/clock.js +68 -68
- package/lib/client/connection.js +318 -318
- package/lib/client/consoleMessage.js +58 -58
- package/lib/client/coverage.js +44 -44
- package/lib/client/dialog.js +56 -56
- package/lib/client/download.js +62 -62
- package/lib/client/electron.js +138 -138
- package/lib/client/elementHandle.js +284 -284
- package/lib/client/errors.js +77 -77
- package/lib/client/eventEmitter.js +314 -314
- package/lib/client/events.js +103 -103
- package/lib/client/fetch.js +368 -368
- package/lib/client/fileChooser.js +46 -46
- package/lib/client/fileUtils.js +34 -34
- package/lib/client/frame.js +409 -409
- package/lib/client/harRouter.js +87 -87
- package/lib/client/input.js +84 -84
- package/lib/client/jsHandle.js +109 -109
- package/lib/client/jsonPipe.js +39 -39
- package/lib/client/localUtils.js +60 -60
- package/lib/client/locator.js +369 -369
- package/lib/client/network.js +747 -747
- package/lib/client/page.js +745 -745
- package/lib/client/pageAgent.js +64 -64
- package/lib/client/platform.js +77 -77
- package/lib/client/playwright.js +71 -71
- package/lib/client/selectors.js +55 -55
- package/lib/client/stream.js +39 -39
- package/lib/client/timeoutSettings.js +79 -79
- package/lib/client/tracing.js +119 -119
- package/lib/client/types.js +28 -28
- package/lib/client/video.js +59 -59
- package/lib/client/waiter.js +142 -142
- package/lib/client/webError.js +39 -39
- package/lib/client/webSocket.js +93 -93
- package/lib/client/worker.js +85 -85
- package/lib/client/writableStream.js +39 -39
- package/lib/generated/bindingsControllerSource.js +28 -28
- package/lib/generated/clockSource.js +28 -28
- package/lib/generated/injectedScriptSource.js +28 -28
- package/lib/generated/pollingRecorderSource.js +28 -28
- package/lib/generated/storageScriptSource.js +28 -28
- package/lib/generated/utilityScriptSource.js +28 -28
- package/lib/generated/webSocketMockSource.js +336 -336
- package/lib/inProcessFactory.js +60 -60
- package/lib/inprocess.js +3 -3
- package/lib/mcpBundle.js +84 -84
- package/lib/mcpBundleImpl/index.js +147 -147
- package/lib/outofprocess.js +76 -76
- package/lib/protocol/serializers.js +197 -197
- package/lib/protocol/validator.js +2969 -2969
- package/lib/protocol/validatorPrimitives.js +193 -193
- package/lib/remote/playwrightConnection.js +129 -129
- package/lib/remote/playwrightServer.js +334 -334
- package/lib/server/agent/actionRunner.js +335 -335
- package/lib/server/agent/actions.js +128 -128
- package/lib/server/agent/codegen.js +111 -111
- package/lib/server/agent/context.js +150 -150
- package/lib/server/agent/expectTools.js +156 -156
- package/lib/server/agent/pageAgent.js +204 -204
- package/lib/server/agent/performTools.js +262 -262
- package/lib/server/agent/tool.js +109 -109
- package/lib/server/android/android.js +465 -465
- package/lib/server/android/backendAdb.js +177 -177
- package/lib/server/artifact.js +127 -127
- package/lib/server/bidi/bidiBrowser.js +549 -549
- package/lib/server/bidi/bidiChromium.js +149 -148
- package/lib/server/bidi/bidiConnection.js +213 -213
- package/lib/server/bidi/bidiDeserializer.js +116 -116
- package/lib/server/bidi/bidiExecutionContext.js +267 -267
- package/lib/server/bidi/bidiFirefox.js +128 -128
- package/lib/server/bidi/bidiInput.js +146 -146
- package/lib/server/bidi/bidiNetworkManager.js +383 -383
- package/lib/server/bidi/bidiOverCdp.js +102 -102
- package/lib/server/bidi/bidiPage.js +583 -583
- package/lib/server/bidi/bidiPdf.js +106 -106
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -22
- package/lib/server/bidi/third_party/bidiKeyboard.js +256 -256
- package/lib/server/bidi/third_party/bidiProtocol.js +24 -24
- package/lib/server/bidi/third_party/bidiProtocolCore.js +180 -180
- package/lib/server/bidi/third_party/bidiProtocolPermissions.js +42 -42
- package/lib/server/bidi/third_party/bidiSerializer.js +148 -148
- package/lib/server/bidi/third_party/firefoxPrefs.js +259 -259
- package/lib/server/browser.js +149 -149
- package/lib/server/browserContext.js +702 -702
- package/lib/server/browserType.js +336 -336
- package/lib/server/callLog.js +82 -82
- package/lib/server/chromium/chromium.js +397 -395
- package/lib/server/chromium/chromiumSwitches.js +104 -104
- package/lib/server/chromium/crBrowser.js +520 -511
- package/lib/server/chromium/crConnection.js +197 -197
- package/lib/server/chromium/crCoverage.js +235 -235
- package/lib/server/chromium/crDevTools.js +111 -111
- package/lib/server/chromium/crDragDrop.js +131 -131
- package/lib/server/chromium/crExecutionContext.js +146 -146
- package/lib/server/chromium/crInput.js +187 -187
- package/lib/server/chromium/crNetworkManager.js +707 -707
- package/lib/server/chromium/crPage.js +1001 -1001
- package/lib/server/chromium/crPdf.js +121 -121
- package/lib/server/chromium/crProtocolHelper.js +145 -145
- package/lib/server/chromium/crServiceWorker.js +136 -136
- package/lib/server/chromium/defaultFontFamilies.js +162 -162
- package/lib/server/chromium/protocol.d.js +16 -16
- package/lib/server/clock.js +149 -149
- package/lib/server/codegen/csharp.js +327 -327
- package/lib/server/codegen/java.js +274 -274
- package/lib/server/codegen/javascript.js +247 -247
- package/lib/server/codegen/jsonl.js +52 -52
- package/lib/server/codegen/language.js +132 -132
- package/lib/server/codegen/languages.js +68 -68
- package/lib/server/codegen/python.js +279 -279
- package/lib/server/codegen/types.js +16 -16
- package/lib/server/console.js +57 -57
- package/lib/server/cookieStore.js +206 -206
- package/lib/server/debugController.js +191 -191
- package/lib/server/debugger.js +119 -119
- package/lib/server/deviceDescriptors.js +39 -39
- package/lib/server/deviceDescriptorsSource.json +1778 -1778
- package/lib/server/dialog.js +116 -116
- package/lib/server/dispatchers/androidDispatcher.js +325 -325
- package/lib/server/dispatchers/artifactDispatcher.js +118 -118
- package/lib/server/dispatchers/browserContextDispatcher.js +384 -384
- package/lib/server/dispatchers/browserDispatcher.js +118 -118
- package/lib/server/dispatchers/browserTypeDispatcher.js +64 -64
- package/lib/server/dispatchers/cdpSessionDispatcher.js +44 -44
- package/lib/server/dispatchers/debugControllerDispatcher.js +78 -78
- package/lib/server/dispatchers/dialogDispatcher.js +47 -47
- package/lib/server/dispatchers/dispatcher.js +364 -364
- package/lib/server/dispatchers/electronDispatcher.js +89 -89
- package/lib/server/dispatchers/elementHandlerDispatcher.js +181 -181
- package/lib/server/dispatchers/frameDispatcher.js +227 -227
- package/lib/server/dispatchers/jsHandleDispatcher.js +85 -85
- package/lib/server/dispatchers/jsonPipeDispatcher.js +58 -58
- package/lib/server/dispatchers/localUtilsDispatcher.js +149 -149
- package/lib/server/dispatchers/networkDispatchers.js +213 -213
- package/lib/server/dispatchers/pageAgentDispatcher.js +96 -96
- package/lib/server/dispatchers/pageDispatcher.js +393 -393
- package/lib/server/dispatchers/playwrightDispatcher.js +108 -108
- package/lib/server/dispatchers/streamDispatcher.js +67 -67
- package/lib/server/dispatchers/tracingDispatcher.js +68 -68
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +165 -165
- package/lib/server/dispatchers/writableStreamDispatcher.js +79 -79
- package/lib/server/dom.js +815 -815
- package/lib/server/download.js +70 -70
- package/lib/server/electron/electron.js +273 -273
- package/lib/server/electron/loader.js +29 -29
- package/lib/server/errors.js +69 -69
- package/lib/server/fetch.js +621 -621
- package/lib/server/fileChooser.js +43 -43
- package/lib/server/fileUploadUtils.js +84 -84
- package/lib/server/firefox/ffBrowser.js +418 -418
- package/lib/server/firefox/ffConnection.js +142 -142
- package/lib/server/firefox/ffExecutionContext.js +150 -150
- package/lib/server/firefox/ffInput.js +159 -159
- package/lib/server/firefox/ffNetworkManager.js +256 -256
- package/lib/server/firefox/ffPage.js +497 -497
- package/lib/server/firefox/firefox.js +114 -114
- package/lib/server/firefox/protocol.d.js +16 -16
- package/lib/server/formData.js +147 -147
- package/lib/server/frameSelectors.js +160 -160
- package/lib/server/frames.js +1471 -1471
- package/lib/server/har/harRecorder.js +147 -147
- package/lib/server/har/harTracer.js +607 -607
- package/lib/server/harBackend.js +157 -157
- package/lib/server/helper.js +96 -96
- package/lib/server/index.js +58 -58
- package/lib/server/input.js +277 -277
- package/lib/server/instrumentation.js +72 -72
- package/lib/server/javascript.js +291 -291
- package/lib/server/launchApp.js +128 -128
- package/lib/server/localUtils.js +214 -214
- package/lib/server/macEditingCommands.js +143 -143
- package/lib/server/network.js +667 -667
- package/lib/server/page.js +830 -830
- package/lib/server/pipeTransport.js +89 -89
- package/lib/server/playwright.js +69 -69
- package/lib/server/progress.js +132 -132
- package/lib/server/protocolError.js +52 -52
- package/lib/server/recorder/chat.js +161 -161
- package/lib/server/recorder/recorderApp.js +366 -366
- package/lib/server/recorder/recorderRunner.js +138 -138
- package/lib/server/recorder/recorderSignalProcessor.js +83 -83
- package/lib/server/recorder/recorderUtils.js +157 -157
- package/lib/server/recorder/throttledFile.js +57 -57
- package/lib/server/recorder.js +499 -499
- package/lib/server/registry/browserFetcher.js +177 -177
- package/lib/server/registry/dependencies.js +371 -371
- package/lib/server/registry/index.js +1422 -1422
- package/lib/server/registry/nativeDeps.js +1280 -1280
- package/lib/server/registry/oopDownloadBrowserMain.js +127 -127
- package/lib/server/screencast.js +190 -190
- package/lib/server/screenshotter.js +333 -333
- package/lib/server/selectors.js +112 -112
- package/lib/server/socksClientCertificatesInterceptor.js +383 -383
- package/lib/server/socksInterceptor.js +95 -95
- package/lib/server/trace/recorder/snapshotter.js +147 -147
- package/lib/server/trace/recorder/snapshotterInjected.js +561 -561
- package/lib/server/trace/recorder/tracing.js +604 -604
- package/lib/server/trace/viewer/traceParser.js +72 -72
- package/lib/server/trace/viewer/traceViewer.js +245 -245
- package/lib/server/transport.js +254 -254
- package/lib/server/types.js +28 -28
- package/lib/server/usKeyboardLayout.js +145 -145
- package/lib/server/utils/ascii.js +44 -44
- package/lib/server/utils/comparators.js +139 -139
- package/lib/server/utils/crypto.js +216 -216
- package/lib/server/utils/debug.js +42 -42
- package/lib/server/utils/debugLogger.js +122 -122
- package/lib/server/utils/env.js +73 -73
- package/lib/server/utils/eventsHelper.js +39 -39
- package/lib/server/utils/expectUtils.js +123 -123
- package/lib/server/utils/fileUtils.js +191 -191
- package/lib/server/utils/happyEyeballs.js +207 -207
- package/lib/server/utils/hostPlatform.js +138 -123
- package/lib/server/utils/httpServer.js +203 -203
- package/lib/server/utils/imageUtils.js +141 -141
- package/lib/server/utils/image_tools/colorUtils.js +89 -89
- package/lib/server/utils/image_tools/compare.js +109 -109
- package/lib/server/utils/image_tools/imageChannel.js +78 -78
- package/lib/server/utils/image_tools/stats.js +102 -102
- package/lib/server/utils/linuxUtils.js +71 -71
- package/lib/server/utils/network.js +242 -242
- package/lib/server/utils/nodePlatform.js +154 -154
- package/lib/server/utils/pipeTransport.js +84 -84
- package/lib/server/utils/processLauncher.js +241 -241
- package/lib/server/utils/profiler.js +65 -65
- package/lib/server/utils/socksProxy.js +511 -511
- package/lib/server/utils/spawnAsync.js +41 -41
- package/lib/server/utils/task.js +51 -51
- package/lib/server/utils/userAgent.js +98 -98
- package/lib/server/utils/wsServer.js +121 -121
- package/lib/server/utils/zipFile.js +74 -74
- package/lib/server/utils/zones.js +57 -57
- package/lib/server/videoRecorder.js +124 -124
- package/lib/server/webkit/protocol.d.js +16 -16
- package/lib/server/webkit/webkit.js +108 -108
- package/lib/server/webkit/wkBrowser.js +335 -335
- package/lib/server/webkit/wkConnection.js +144 -144
- package/lib/server/webkit/wkExecutionContext.js +154 -154
- package/lib/server/webkit/wkInput.js +181 -181
- package/lib/server/webkit/wkInterceptableRequest.js +197 -197
- package/lib/server/webkit/wkPage.js +1159 -1158
- package/lib/server/webkit/wkProvisionalPage.js +83 -83
- package/lib/server/webkit/wkWorkers.js +105 -105
- package/lib/third_party/pixelmatch.js +255 -255
- package/lib/utils/isomorphic/ariaSnapshot.js +455 -455
- package/lib/utils/isomorphic/assert.js +31 -31
- package/lib/utils/isomorphic/colors.js +72 -72
- package/lib/utils/isomorphic/cssParser.js +245 -245
- package/lib/utils/isomorphic/cssTokenizer.js +1051 -1051
- package/lib/utils/isomorphic/headers.js +53 -53
- package/lib/utils/isomorphic/locatorGenerators.js +689 -689
- package/lib/utils/isomorphic/locatorParser.js +176 -176
- package/lib/utils/isomorphic/locatorUtils.js +81 -81
- package/lib/utils/isomorphic/lruCache.js +51 -51
- package/lib/utils/isomorphic/manualPromise.js +114 -114
- package/lib/utils/isomorphic/mimeType.js +459 -459
- package/lib/utils/isomorphic/multimap.js +80 -80
- package/lib/utils/isomorphic/protocolFormatter.js +81 -81
- package/lib/utils/isomorphic/protocolMetainfo.js +330 -330
- package/lib/utils/isomorphic/rtti.js +43 -43
- package/lib/utils/isomorphic/selectorParser.js +386 -386
- package/lib/utils/isomorphic/semaphore.js +54 -54
- package/lib/utils/isomorphic/stackTrace.js +158 -158
- package/lib/utils/isomorphic/stringUtils.js +204 -204
- package/lib/utils/isomorphic/time.js +49 -49
- package/lib/utils/isomorphic/timeoutRunner.js +66 -66
- package/lib/utils/isomorphic/trace/entries.js +16 -16
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +499 -499
- package/lib/utils/isomorphic/trace/snapshotServer.js +120 -120
- package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -89
- package/lib/utils/isomorphic/trace/traceLoader.js +131 -131
- package/lib/utils/isomorphic/trace/traceModel.js +365 -365
- package/lib/utils/isomorphic/trace/traceModernizer.js +400 -400
- package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -16
- package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -16
- package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -16
- package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -16
- package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -16
- package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -16
- package/lib/utils/isomorphic/traceUtils.js +58 -58
- package/lib/utils/isomorphic/types.js +16 -16
- package/lib/utils/isomorphic/urlMatch.js +190 -190
- package/lib/utils/isomorphic/utilityScriptSerializers.js +251 -251
- package/lib/utils/isomorphic/yaml.js +84 -84
- package/lib/utils.js +111 -111
- package/lib/utilsBundle.js +109 -109
- package/lib/utilsBundleImpl/index.js +218 -218
- package/lib/utilsBundleImpl/xdg-open +1066 -1066
- package/lib/vite/htmlReport/index.html +84 -84
- package/lib/vite/recorder/assets/codeMirrorModule-DYBRYzYX.css +1 -1
- package/lib/vite/recorder/assets/codeMirrorModule-DadYNm1I.js +32 -32
- package/lib/vite/recorder/assets/index-BSjZa4pk.css +1 -1
- package/lib/vite/recorder/assets/index-BhTWtUlo.js +193 -193
- package/lib/vite/recorder/index.html +29 -29
- package/lib/vite/recorder/playwright-logo.svg +9 -9
- package/lib/vite/traceViewer/assets/codeMirrorModule-a5XoALAZ.js +32 -32
- package/lib/vite/traceViewer/assets/defaultSettingsView-CJSZINFr.js +266 -266
- package/lib/vite/traceViewer/assets/xtermModule-CsJ4vdCR.js +9 -9
- package/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -1
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +1 -1
- package/lib/vite/traceViewer/{index.Bk2uYQRV.js → index.BDwrLSGN.js} +2 -2
- package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -1
- package/lib/vite/traceViewer/index.html +43 -43
- package/lib/vite/traceViewer/manifest.webmanifest +16 -16
- package/lib/vite/traceViewer/playwright-logo.svg +9 -9
- package/lib/vite/traceViewer/snapshot.html +21 -21
- package/lib/vite/traceViewer/sw.bundle.js +5 -5
- package/lib/vite/traceViewer/uiMode.Btcz36p_.css +1 -1
- package/lib/vite/traceViewer/uiMode.CQJ9SCIQ.js +5 -5
- package/lib/vite/traceViewer/uiMode.html +17 -17
- package/lib/vite/traceViewer/xtermModule.DYP7pi_n.css +32 -32
- package/lib/zipBundle.js +34 -34
- package/lib/zipBundleImpl.js +5 -5
- package/package.json +1 -1
- package/types/protocol.d.ts +23824 -23824
- package/types/structs.d.ts +45 -45
- package/types/types.d.ts +22843 -22843
|
@@ -1,334 +1,334 @@
|
|
|
1
|
-
"use strict";
|
|
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
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(playwrightServer_exports);
|
|
24
|
-
var import_playwrightConnection = require("./playwrightConnection");
|
|
25
|
-
var import_playwright = require("../server/playwright");
|
|
26
|
-
var import_semaphore = require("../utils/isomorphic/semaphore");
|
|
27
|
-
var import_time = require("../utils/isomorphic/time");
|
|
28
|
-
var import_wsServer = require("../server/utils/wsServer");
|
|
29
|
-
var import_ascii = require("../server/utils/ascii");
|
|
30
|
-
var import_userAgent = require("../server/utils/userAgent");
|
|
31
|
-
var import_utils = require("../utils");
|
|
32
|
-
var import_socksProxy = require("../server/utils/socksProxy");
|
|
33
|
-
var import_browser = require("../server/browser");
|
|
34
|
-
var import_progress = require("../server/progress");
|
|
35
|
-
class PlaywrightServer {
|
|
36
|
-
constructor(options) {
|
|
37
|
-
this._dontReuseBrowsers = /* @__PURE__ */ new Set();
|
|
38
|
-
this._options = options;
|
|
39
|
-
if (options.preLaunchedBrowser) {
|
|
40
|
-
this._playwright = options.preLaunchedBrowser.attribution.playwright;
|
|
41
|
-
this._dontReuse(options.preLaunchedBrowser);
|
|
42
|
-
}
|
|
43
|
-
if (options.preLaunchedAndroidDevice)
|
|
44
|
-
this._playwright = options.preLaunchedAndroidDevice._android.attribution.playwright;
|
|
45
|
-
this._playwright ??= (0, import_playwright.createPlaywright)({ sdkLanguage: "javascript", isServer: true });
|
|
46
|
-
const browserSemaphore = new import_semaphore.Semaphore(this._options.maxConnections);
|
|
47
|
-
const controllerSemaphore = new import_semaphore.Semaphore(1);
|
|
48
|
-
const reuseBrowserSemaphore = new import_semaphore.Semaphore(1);
|
|
49
|
-
this._wsServer = new import_wsServer.WSServer({
|
|
50
|
-
onRequest: (request, response) => {
|
|
51
|
-
if (request.method === "GET" && request.url === "/json") {
|
|
52
|
-
response.setHeader("Content-Type", "application/json");
|
|
53
|
-
response.end(JSON.stringify({
|
|
54
|
-
wsEndpointPath: this._options.path
|
|
55
|
-
}));
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
response.end("Running");
|
|
59
|
-
},
|
|
60
|
-
onUpgrade: (request, socket) => {
|
|
61
|
-
const uaError = userAgentVersionMatchesErrorMessage(request.headers["user-agent"] || "");
|
|
62
|
-
if (uaError)
|
|
63
|
-
return { error: `HTTP/${request.httpVersion} 428 Precondition Required\r
|
|
64
|
-
\r
|
|
65
|
-
${uaError}` };
|
|
66
|
-
},
|
|
67
|
-
onHeaders: (headers) => {
|
|
68
|
-
if (process.env.PWTEST_SERVER_WS_HEADERS)
|
|
69
|
-
headers.push(process.env.PWTEST_SERVER_WS_HEADERS);
|
|
70
|
-
},
|
|
71
|
-
onConnection: (request, url, ws, id) => {
|
|
72
|
-
const browserHeader = request.headers["x-playwright-browser"];
|
|
73
|
-
const browserName = url.searchParams.get("browser") || (Array.isArray(browserHeader) ? browserHeader[0] : browserHeader) || null;
|
|
74
|
-
const proxyHeader = request.headers["x-playwright-proxy"];
|
|
75
|
-
const proxyValue = url.searchParams.get("proxy") || (Array.isArray(proxyHeader) ? proxyHeader[0] : proxyHeader);
|
|
76
|
-
const launchOptionsHeader = request.headers["x-playwright-launch-options"] || "";
|
|
77
|
-
const launchOptionsHeaderValue = Array.isArray(launchOptionsHeader) ? launchOptionsHeader[0] : launchOptionsHeader;
|
|
78
|
-
const launchOptionsParam = url.searchParams.get("launch-options");
|
|
79
|
-
let launchOptions = { timeout: import_time.DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT };
|
|
80
|
-
try {
|
|
81
|
-
launchOptions = JSON.parse(launchOptionsParam || launchOptionsHeaderValue);
|
|
82
|
-
if (!launchOptions.timeout)
|
|
83
|
-
launchOptions.timeout = import_time.DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT;
|
|
84
|
-
} catch (e) {
|
|
85
|
-
}
|
|
86
|
-
const isExtension = this._options.mode === "extension";
|
|
87
|
-
const allowFSPaths = isExtension;
|
|
88
|
-
launchOptions = filterLaunchOptions(launchOptions, allowFSPaths);
|
|
89
|
-
if (isExtension) {
|
|
90
|
-
const connectFilter = url.searchParams.get("connect");
|
|
91
|
-
if (connectFilter) {
|
|
92
|
-
if (connectFilter !== "first")
|
|
93
|
-
throw new Error(`Unknown connect filter: ${connectFilter}`);
|
|
94
|
-
return new import_playwrightConnection.PlaywrightConnection(
|
|
95
|
-
browserSemaphore,
|
|
96
|
-
ws,
|
|
97
|
-
false,
|
|
98
|
-
this._playwright,
|
|
99
|
-
() => this._initConnectMode(id, connectFilter, browserName, launchOptions),
|
|
100
|
-
id
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
if (url.searchParams.has("debug-controller")) {
|
|
104
|
-
return new import_playwrightConnection.PlaywrightConnection(
|
|
105
|
-
controllerSemaphore,
|
|
106
|
-
ws,
|
|
107
|
-
true,
|
|
108
|
-
this._playwright,
|
|
109
|
-
async () => {
|
|
110
|
-
throw new Error("shouldnt be used");
|
|
111
|
-
},
|
|
112
|
-
id
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
return new import_playwrightConnection.PlaywrightConnection(
|
|
116
|
-
reuseBrowserSemaphore,
|
|
117
|
-
ws,
|
|
118
|
-
false,
|
|
119
|
-
this._playwright,
|
|
120
|
-
() => this._initReuseBrowsersMode(browserName, launchOptions, id),
|
|
121
|
-
id
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
if (this._options.mode === "launchServer" || this._options.mode === "launchServerShared") {
|
|
125
|
-
if (this._options.preLaunchedBrowser) {
|
|
126
|
-
return new import_playwrightConnection.PlaywrightConnection(
|
|
127
|
-
browserSemaphore,
|
|
128
|
-
ws,
|
|
129
|
-
false,
|
|
130
|
-
this._playwright,
|
|
131
|
-
() => this._initPreLaunchedBrowserMode(id),
|
|
132
|
-
id
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
return new import_playwrightConnection.PlaywrightConnection(
|
|
136
|
-
browserSemaphore,
|
|
137
|
-
ws,
|
|
138
|
-
false,
|
|
139
|
-
this._playwright,
|
|
140
|
-
() => this._initPreLaunchedAndroidMode(id),
|
|
141
|
-
id
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
return new import_playwrightConnection.PlaywrightConnection(
|
|
145
|
-
browserSemaphore,
|
|
146
|
-
ws,
|
|
147
|
-
false,
|
|
148
|
-
this._playwright,
|
|
149
|
-
() => this._initLaunchBrowserMode(browserName, proxyValue, launchOptions, id),
|
|
150
|
-
id
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
async _initReuseBrowsersMode(browserName, launchOptions, id) {
|
|
156
|
-
import_utils.debugLogger.log("server", `[${id}] engaged reuse browsers mode for ${browserName}`);
|
|
157
|
-
const requestedOptions = launchOptionsHash(launchOptions);
|
|
158
|
-
let browser = this._playwright.allBrowsers().find((b) => {
|
|
159
|
-
if (b.options.name !== browserName)
|
|
160
|
-
return false;
|
|
161
|
-
if (this._dontReuseBrowsers.has(b))
|
|
162
|
-
return false;
|
|
163
|
-
const existingOptions = launchOptionsHash({ ...b.options.originalLaunchOptions, timeout: import_time.DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT });
|
|
164
|
-
return existingOptions === requestedOptions;
|
|
165
|
-
});
|
|
166
|
-
for (const b of this._playwright.allBrowsers()) {
|
|
167
|
-
if (b === browser)
|
|
168
|
-
continue;
|
|
169
|
-
if (this._dontReuseBrowsers.has(b))
|
|
170
|
-
continue;
|
|
171
|
-
if (b.options.name === browserName && b.options.channel === launchOptions.channel)
|
|
172
|
-
await b.close({ reason: "Connection terminated" });
|
|
173
|
-
}
|
|
174
|
-
if (!browser) {
|
|
175
|
-
const browserType = this._playwright[browserName || "chromium"];
|
|
176
|
-
const controller = new import_progress.ProgressController();
|
|
177
|
-
browser = await controller.run((progress) => browserType.launch(progress, {
|
|
178
|
-
...launchOptions,
|
|
179
|
-
headless: !!process.env.PW_DEBUG_CONTROLLER_HEADLESS
|
|
180
|
-
}), launchOptions.timeout);
|
|
181
|
-
}
|
|
182
|
-
return {
|
|
183
|
-
preLaunchedBrowser: browser,
|
|
184
|
-
denyLaunch: true,
|
|
185
|
-
dispose: async () => {
|
|
186
|
-
for (const context of browser.contexts()) {
|
|
187
|
-
if (!context.pages().length)
|
|
188
|
-
await context.close({ reason: "Connection terminated" });
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
async _initConnectMode(id, filter, browserName, launchOptions) {
|
|
194
|
-
browserName ??= "chromium";
|
|
195
|
-
import_utils.debugLogger.log("server", `[${id}] engaged connect mode`);
|
|
196
|
-
let browser = this._playwright.allBrowsers().find((b) => b.options.name === browserName);
|
|
197
|
-
if (!browser) {
|
|
198
|
-
const browserType = this._playwright[browserName];
|
|
199
|
-
const controller = new import_progress.ProgressController();
|
|
200
|
-
browser = await controller.run((progress) => browserType.launch(progress, launchOptions), launchOptions.timeout);
|
|
201
|
-
this._dontReuse(browser);
|
|
202
|
-
}
|
|
203
|
-
return {
|
|
204
|
-
preLaunchedBrowser: browser,
|
|
205
|
-
denyLaunch: true,
|
|
206
|
-
sharedBrowser: true
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
async _initPreLaunchedBrowserMode(id) {
|
|
210
|
-
import_utils.debugLogger.log("server", `[${id}] engaged pre-launched (browser) mode`);
|
|
211
|
-
const browser = this._options.preLaunchedBrowser;
|
|
212
|
-
for (const b of this._playwright.allBrowsers()) {
|
|
213
|
-
if (b !== browser)
|
|
214
|
-
await b.close({ reason: "Connection terminated" });
|
|
215
|
-
}
|
|
216
|
-
return {
|
|
217
|
-
preLaunchedBrowser: browser,
|
|
218
|
-
socksProxy: this._options.preLaunchedSocksProxy,
|
|
219
|
-
sharedBrowser: this._options.mode === "launchServerShared",
|
|
220
|
-
denyLaunch: true
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
async _initPreLaunchedAndroidMode(id) {
|
|
224
|
-
import_utils.debugLogger.log("server", `[${id}] engaged pre-launched (Android) mode`);
|
|
225
|
-
const androidDevice = this._options.preLaunchedAndroidDevice;
|
|
226
|
-
return {
|
|
227
|
-
preLaunchedAndroidDevice: androidDevice,
|
|
228
|
-
denyLaunch: true
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
async _initLaunchBrowserMode(browserName, proxyValue, launchOptions, id) {
|
|
232
|
-
import_utils.debugLogger.log("server", `[${id}] engaged launch mode for "${browserName}"`);
|
|
233
|
-
let socksProxy;
|
|
234
|
-
if (proxyValue) {
|
|
235
|
-
socksProxy = new import_socksProxy.SocksProxy();
|
|
236
|
-
socksProxy.setPattern(proxyValue);
|
|
237
|
-
launchOptions.socksProxyPort = await socksProxy.listen(0);
|
|
238
|
-
import_utils.debugLogger.log("server", `[${id}] started socks proxy on port ${launchOptions.socksProxyPort}`);
|
|
239
|
-
} else {
|
|
240
|
-
launchOptions.socksProxyPort = void 0;
|
|
241
|
-
}
|
|
242
|
-
const browserType = this._playwright[browserName];
|
|
243
|
-
const controller = new import_progress.ProgressController();
|
|
244
|
-
const browser = await controller.run((progress) => browserType.launch(progress, launchOptions), launchOptions.timeout);
|
|
245
|
-
this._dontReuseBrowsers.add(browser);
|
|
246
|
-
return {
|
|
247
|
-
preLaunchedBrowser: browser,
|
|
248
|
-
socksProxy,
|
|
249
|
-
denyLaunch: true,
|
|
250
|
-
dispose: async () => {
|
|
251
|
-
await browser.close({ reason: "Connection terminated" });
|
|
252
|
-
socksProxy?.close();
|
|
253
|
-
}
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
_dontReuse(browser) {
|
|
257
|
-
this._dontReuseBrowsers.add(browser);
|
|
258
|
-
browser.on(import_browser.Browser.Events.Disconnected, () => {
|
|
259
|
-
this._dontReuseBrowsers.delete(browser);
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
async listen(port = 0, hostname) {
|
|
263
|
-
return this._wsServer.listen(port, hostname, this._options.path);
|
|
264
|
-
}
|
|
265
|
-
async close() {
|
|
266
|
-
await this._wsServer.close();
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
function userAgentVersionMatchesErrorMessage(userAgent) {
|
|
270
|
-
const match = userAgent.match(/^Playwright\/(\d+\.\d+\.\d+)/);
|
|
271
|
-
if (!match) {
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
const received = match[1].split(".").slice(0, 2).join(".");
|
|
275
|
-
const expected = (0, import_userAgent.getPlaywrightVersion)(true);
|
|
276
|
-
if (received !== expected) {
|
|
277
|
-
return (0, import_ascii.wrapInASCIIBox)([
|
|
278
|
-
`Playwright version mismatch:`,
|
|
279
|
-
` - server version: v${expected}`,
|
|
280
|
-
` - client version: v${received}`,
|
|
281
|
-
``,
|
|
282
|
-
`If you are using VSCode extension, restart VSCode.`,
|
|
283
|
-
``,
|
|
284
|
-
`If you are connecting to a remote service,`,
|
|
285
|
-
`keep your local Playwright version in sync`,
|
|
286
|
-
`with the remote service version.`,
|
|
287
|
-
``,
|
|
288
|
-
`<3 Playwright Team`
|
|
289
|
-
].join("\n"), 1);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
function launchOptionsHash(options) {
|
|
293
|
-
const copy = { ...options };
|
|
294
|
-
for (const k of Object.keys(copy)) {
|
|
295
|
-
const key = k;
|
|
296
|
-
if (copy[key] === defaultLaunchOptions[key])
|
|
297
|
-
delete copy[key];
|
|
298
|
-
}
|
|
299
|
-
for (const key of optionsThatAllowBrowserReuse)
|
|
300
|
-
delete copy[key];
|
|
301
|
-
return JSON.stringify(copy);
|
|
302
|
-
}
|
|
303
|
-
function filterLaunchOptions(options, allowFSPaths) {
|
|
304
|
-
return {
|
|
305
|
-
channel: options.channel,
|
|
306
|
-
args: options.args,
|
|
307
|
-
ignoreAllDefaultArgs: options.ignoreAllDefaultArgs,
|
|
308
|
-
ignoreDefaultArgs: options.ignoreDefaultArgs,
|
|
309
|
-
timeout: options.timeout,
|
|
310
|
-
headless: options.headless,
|
|
311
|
-
proxy: options.proxy,
|
|
312
|
-
chromiumSandbox: options.chromiumSandbox,
|
|
313
|
-
firefoxUserPrefs: options.firefoxUserPrefs,
|
|
314
|
-
slowMo: options.slowMo,
|
|
315
|
-
executablePath: (0, import_utils.isUnderTest)() || allowFSPaths ? options.executablePath : void 0,
|
|
316
|
-
downloadsPath: allowFSPaths ? options.downloadsPath : void 0
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
const defaultLaunchOptions = {
|
|
320
|
-
ignoreAllDefaultArgs: false,
|
|
321
|
-
handleSIGINT: false,
|
|
322
|
-
handleSIGTERM: false,
|
|
323
|
-
handleSIGHUP: false,
|
|
324
|
-
headless: true
|
|
325
|
-
};
|
|
326
|
-
const optionsThatAllowBrowserReuse = [
|
|
327
|
-
"headless",
|
|
328
|
-
"timeout",
|
|
329
|
-
"tracesDir"
|
|
330
|
-
];
|
|
331
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
332
|
-
0 && (module.exports = {
|
|
333
|
-
PlaywrightServer
|
|
334
|
-
});
|
|
1
|
+
"use strict";
|
|
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
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(playwrightServer_exports);
|
|
24
|
+
var import_playwrightConnection = require("./playwrightConnection");
|
|
25
|
+
var import_playwright = require("../server/playwright");
|
|
26
|
+
var import_semaphore = require("../utils/isomorphic/semaphore");
|
|
27
|
+
var import_time = require("../utils/isomorphic/time");
|
|
28
|
+
var import_wsServer = require("../server/utils/wsServer");
|
|
29
|
+
var import_ascii = require("../server/utils/ascii");
|
|
30
|
+
var import_userAgent = require("../server/utils/userAgent");
|
|
31
|
+
var import_utils = require("../utils");
|
|
32
|
+
var import_socksProxy = require("../server/utils/socksProxy");
|
|
33
|
+
var import_browser = require("../server/browser");
|
|
34
|
+
var import_progress = require("../server/progress");
|
|
35
|
+
class PlaywrightServer {
|
|
36
|
+
constructor(options) {
|
|
37
|
+
this._dontReuseBrowsers = /* @__PURE__ */ new Set();
|
|
38
|
+
this._options = options;
|
|
39
|
+
if (options.preLaunchedBrowser) {
|
|
40
|
+
this._playwright = options.preLaunchedBrowser.attribution.playwright;
|
|
41
|
+
this._dontReuse(options.preLaunchedBrowser);
|
|
42
|
+
}
|
|
43
|
+
if (options.preLaunchedAndroidDevice)
|
|
44
|
+
this._playwright = options.preLaunchedAndroidDevice._android.attribution.playwright;
|
|
45
|
+
this._playwright ??= (0, import_playwright.createPlaywright)({ sdkLanguage: "javascript", isServer: true });
|
|
46
|
+
const browserSemaphore = new import_semaphore.Semaphore(this._options.maxConnections);
|
|
47
|
+
const controllerSemaphore = new import_semaphore.Semaphore(1);
|
|
48
|
+
const reuseBrowserSemaphore = new import_semaphore.Semaphore(1);
|
|
49
|
+
this._wsServer = new import_wsServer.WSServer({
|
|
50
|
+
onRequest: (request, response) => {
|
|
51
|
+
if (request.method === "GET" && request.url === "/json") {
|
|
52
|
+
response.setHeader("Content-Type", "application/json");
|
|
53
|
+
response.end(JSON.stringify({
|
|
54
|
+
wsEndpointPath: this._options.path
|
|
55
|
+
}));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
response.end("Running");
|
|
59
|
+
},
|
|
60
|
+
onUpgrade: (request, socket) => {
|
|
61
|
+
const uaError = userAgentVersionMatchesErrorMessage(request.headers["user-agent"] || "");
|
|
62
|
+
if (uaError)
|
|
63
|
+
return { error: `HTTP/${request.httpVersion} 428 Precondition Required\r
|
|
64
|
+
\r
|
|
65
|
+
${uaError}` };
|
|
66
|
+
},
|
|
67
|
+
onHeaders: (headers) => {
|
|
68
|
+
if (process.env.PWTEST_SERVER_WS_HEADERS)
|
|
69
|
+
headers.push(process.env.PWTEST_SERVER_WS_HEADERS);
|
|
70
|
+
},
|
|
71
|
+
onConnection: (request, url, ws, id) => {
|
|
72
|
+
const browserHeader = request.headers["x-playwright-browser"];
|
|
73
|
+
const browserName = url.searchParams.get("browser") || (Array.isArray(browserHeader) ? browserHeader[0] : browserHeader) || null;
|
|
74
|
+
const proxyHeader = request.headers["x-playwright-proxy"];
|
|
75
|
+
const proxyValue = url.searchParams.get("proxy") || (Array.isArray(proxyHeader) ? proxyHeader[0] : proxyHeader);
|
|
76
|
+
const launchOptionsHeader = request.headers["x-playwright-launch-options"] || "";
|
|
77
|
+
const launchOptionsHeaderValue = Array.isArray(launchOptionsHeader) ? launchOptionsHeader[0] : launchOptionsHeader;
|
|
78
|
+
const launchOptionsParam = url.searchParams.get("launch-options");
|
|
79
|
+
let launchOptions = { timeout: import_time.DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT };
|
|
80
|
+
try {
|
|
81
|
+
launchOptions = JSON.parse(launchOptionsParam || launchOptionsHeaderValue);
|
|
82
|
+
if (!launchOptions.timeout)
|
|
83
|
+
launchOptions.timeout = import_time.DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT;
|
|
84
|
+
} catch (e) {
|
|
85
|
+
}
|
|
86
|
+
const isExtension = this._options.mode === "extension";
|
|
87
|
+
const allowFSPaths = isExtension;
|
|
88
|
+
launchOptions = filterLaunchOptions(launchOptions, allowFSPaths);
|
|
89
|
+
if (isExtension) {
|
|
90
|
+
const connectFilter = url.searchParams.get("connect");
|
|
91
|
+
if (connectFilter) {
|
|
92
|
+
if (connectFilter !== "first")
|
|
93
|
+
throw new Error(`Unknown connect filter: ${connectFilter}`);
|
|
94
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
95
|
+
browserSemaphore,
|
|
96
|
+
ws,
|
|
97
|
+
false,
|
|
98
|
+
this._playwright,
|
|
99
|
+
() => this._initConnectMode(id, connectFilter, browserName, launchOptions),
|
|
100
|
+
id
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (url.searchParams.has("debug-controller")) {
|
|
104
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
105
|
+
controllerSemaphore,
|
|
106
|
+
ws,
|
|
107
|
+
true,
|
|
108
|
+
this._playwright,
|
|
109
|
+
async () => {
|
|
110
|
+
throw new Error("shouldnt be used");
|
|
111
|
+
},
|
|
112
|
+
id
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
116
|
+
reuseBrowserSemaphore,
|
|
117
|
+
ws,
|
|
118
|
+
false,
|
|
119
|
+
this._playwright,
|
|
120
|
+
() => this._initReuseBrowsersMode(browserName, launchOptions, id),
|
|
121
|
+
id
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
if (this._options.mode === "launchServer" || this._options.mode === "launchServerShared") {
|
|
125
|
+
if (this._options.preLaunchedBrowser) {
|
|
126
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
127
|
+
browserSemaphore,
|
|
128
|
+
ws,
|
|
129
|
+
false,
|
|
130
|
+
this._playwright,
|
|
131
|
+
() => this._initPreLaunchedBrowserMode(id),
|
|
132
|
+
id
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
136
|
+
browserSemaphore,
|
|
137
|
+
ws,
|
|
138
|
+
false,
|
|
139
|
+
this._playwright,
|
|
140
|
+
() => this._initPreLaunchedAndroidMode(id),
|
|
141
|
+
id
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
return new import_playwrightConnection.PlaywrightConnection(
|
|
145
|
+
browserSemaphore,
|
|
146
|
+
ws,
|
|
147
|
+
false,
|
|
148
|
+
this._playwright,
|
|
149
|
+
() => this._initLaunchBrowserMode(browserName, proxyValue, launchOptions, id),
|
|
150
|
+
id
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async _initReuseBrowsersMode(browserName, launchOptions, id) {
|
|
156
|
+
import_utils.debugLogger.log("server", `[${id}] engaged reuse browsers mode for ${browserName}`);
|
|
157
|
+
const requestedOptions = launchOptionsHash(launchOptions);
|
|
158
|
+
let browser = this._playwright.allBrowsers().find((b) => {
|
|
159
|
+
if (b.options.name !== browserName)
|
|
160
|
+
return false;
|
|
161
|
+
if (this._dontReuseBrowsers.has(b))
|
|
162
|
+
return false;
|
|
163
|
+
const existingOptions = launchOptionsHash({ ...b.options.originalLaunchOptions, timeout: import_time.DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT });
|
|
164
|
+
return existingOptions === requestedOptions;
|
|
165
|
+
});
|
|
166
|
+
for (const b of this._playwright.allBrowsers()) {
|
|
167
|
+
if (b === browser)
|
|
168
|
+
continue;
|
|
169
|
+
if (this._dontReuseBrowsers.has(b))
|
|
170
|
+
continue;
|
|
171
|
+
if (b.options.name === browserName && b.options.channel === launchOptions.channel)
|
|
172
|
+
await b.close({ reason: "Connection terminated" });
|
|
173
|
+
}
|
|
174
|
+
if (!browser) {
|
|
175
|
+
const browserType = this._playwright[browserName || "chromium"];
|
|
176
|
+
const controller = new import_progress.ProgressController();
|
|
177
|
+
browser = await controller.run((progress) => browserType.launch(progress, {
|
|
178
|
+
...launchOptions,
|
|
179
|
+
headless: !!process.env.PW_DEBUG_CONTROLLER_HEADLESS
|
|
180
|
+
}), launchOptions.timeout);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
preLaunchedBrowser: browser,
|
|
184
|
+
denyLaunch: true,
|
|
185
|
+
dispose: async () => {
|
|
186
|
+
for (const context of browser.contexts()) {
|
|
187
|
+
if (!context.pages().length)
|
|
188
|
+
await context.close({ reason: "Connection terminated" });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async _initConnectMode(id, filter, browserName, launchOptions) {
|
|
194
|
+
browserName ??= "chromium";
|
|
195
|
+
import_utils.debugLogger.log("server", `[${id}] engaged connect mode`);
|
|
196
|
+
let browser = this._playwright.allBrowsers().find((b) => b.options.name === browserName);
|
|
197
|
+
if (!browser) {
|
|
198
|
+
const browserType = this._playwright[browserName];
|
|
199
|
+
const controller = new import_progress.ProgressController();
|
|
200
|
+
browser = await controller.run((progress) => browserType.launch(progress, launchOptions), launchOptions.timeout);
|
|
201
|
+
this._dontReuse(browser);
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
preLaunchedBrowser: browser,
|
|
205
|
+
denyLaunch: true,
|
|
206
|
+
sharedBrowser: true
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
async _initPreLaunchedBrowserMode(id) {
|
|
210
|
+
import_utils.debugLogger.log("server", `[${id}] engaged pre-launched (browser) mode`);
|
|
211
|
+
const browser = this._options.preLaunchedBrowser;
|
|
212
|
+
for (const b of this._playwright.allBrowsers()) {
|
|
213
|
+
if (b !== browser)
|
|
214
|
+
await b.close({ reason: "Connection terminated" });
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
preLaunchedBrowser: browser,
|
|
218
|
+
socksProxy: this._options.preLaunchedSocksProxy,
|
|
219
|
+
sharedBrowser: this._options.mode === "launchServerShared",
|
|
220
|
+
denyLaunch: true
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
async _initPreLaunchedAndroidMode(id) {
|
|
224
|
+
import_utils.debugLogger.log("server", `[${id}] engaged pre-launched (Android) mode`);
|
|
225
|
+
const androidDevice = this._options.preLaunchedAndroidDevice;
|
|
226
|
+
return {
|
|
227
|
+
preLaunchedAndroidDevice: androidDevice,
|
|
228
|
+
denyLaunch: true
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async _initLaunchBrowserMode(browserName, proxyValue, launchOptions, id) {
|
|
232
|
+
import_utils.debugLogger.log("server", `[${id}] engaged launch mode for "${browserName}"`);
|
|
233
|
+
let socksProxy;
|
|
234
|
+
if (proxyValue) {
|
|
235
|
+
socksProxy = new import_socksProxy.SocksProxy();
|
|
236
|
+
socksProxy.setPattern(proxyValue);
|
|
237
|
+
launchOptions.socksProxyPort = await socksProxy.listen(0);
|
|
238
|
+
import_utils.debugLogger.log("server", `[${id}] started socks proxy on port ${launchOptions.socksProxyPort}`);
|
|
239
|
+
} else {
|
|
240
|
+
launchOptions.socksProxyPort = void 0;
|
|
241
|
+
}
|
|
242
|
+
const browserType = this._playwright[browserName];
|
|
243
|
+
const controller = new import_progress.ProgressController();
|
|
244
|
+
const browser = await controller.run((progress) => browserType.launch(progress, launchOptions), launchOptions.timeout);
|
|
245
|
+
this._dontReuseBrowsers.add(browser);
|
|
246
|
+
return {
|
|
247
|
+
preLaunchedBrowser: browser,
|
|
248
|
+
socksProxy,
|
|
249
|
+
denyLaunch: true,
|
|
250
|
+
dispose: async () => {
|
|
251
|
+
await browser.close({ reason: "Connection terminated" });
|
|
252
|
+
socksProxy?.close();
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
_dontReuse(browser) {
|
|
257
|
+
this._dontReuseBrowsers.add(browser);
|
|
258
|
+
browser.on(import_browser.Browser.Events.Disconnected, () => {
|
|
259
|
+
this._dontReuseBrowsers.delete(browser);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
async listen(port = 0, hostname) {
|
|
263
|
+
return this._wsServer.listen(port, hostname, this._options.path);
|
|
264
|
+
}
|
|
265
|
+
async close() {
|
|
266
|
+
await this._wsServer.close();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function userAgentVersionMatchesErrorMessage(userAgent) {
|
|
270
|
+
const match = userAgent.match(/^Playwright\/(\d+\.\d+\.\d+)/);
|
|
271
|
+
if (!match) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const received = match[1].split(".").slice(0, 2).join(".");
|
|
275
|
+
const expected = (0, import_userAgent.getPlaywrightVersion)(true);
|
|
276
|
+
if (received !== expected) {
|
|
277
|
+
return (0, import_ascii.wrapInASCIIBox)([
|
|
278
|
+
`Playwright version mismatch:`,
|
|
279
|
+
` - server version: v${expected}`,
|
|
280
|
+
` - client version: v${received}`,
|
|
281
|
+
``,
|
|
282
|
+
`If you are using VSCode extension, restart VSCode.`,
|
|
283
|
+
``,
|
|
284
|
+
`If you are connecting to a remote service,`,
|
|
285
|
+
`keep your local Playwright version in sync`,
|
|
286
|
+
`with the remote service version.`,
|
|
287
|
+
``,
|
|
288
|
+
`<3 Playwright Team`
|
|
289
|
+
].join("\n"), 1);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function launchOptionsHash(options) {
|
|
293
|
+
const copy = { ...options };
|
|
294
|
+
for (const k of Object.keys(copy)) {
|
|
295
|
+
const key = k;
|
|
296
|
+
if (copy[key] === defaultLaunchOptions[key])
|
|
297
|
+
delete copy[key];
|
|
298
|
+
}
|
|
299
|
+
for (const key of optionsThatAllowBrowserReuse)
|
|
300
|
+
delete copy[key];
|
|
301
|
+
return JSON.stringify(copy);
|
|
302
|
+
}
|
|
303
|
+
function filterLaunchOptions(options, allowFSPaths) {
|
|
304
|
+
return {
|
|
305
|
+
channel: options.channel,
|
|
306
|
+
args: options.args,
|
|
307
|
+
ignoreAllDefaultArgs: options.ignoreAllDefaultArgs,
|
|
308
|
+
ignoreDefaultArgs: options.ignoreDefaultArgs,
|
|
309
|
+
timeout: options.timeout,
|
|
310
|
+
headless: options.headless,
|
|
311
|
+
proxy: options.proxy,
|
|
312
|
+
chromiumSandbox: options.chromiumSandbox,
|
|
313
|
+
firefoxUserPrefs: options.firefoxUserPrefs,
|
|
314
|
+
slowMo: options.slowMo,
|
|
315
|
+
executablePath: (0, import_utils.isUnderTest)() || allowFSPaths ? options.executablePath : void 0,
|
|
316
|
+
downloadsPath: allowFSPaths ? options.downloadsPath : void 0
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
const defaultLaunchOptions = {
|
|
320
|
+
ignoreAllDefaultArgs: false,
|
|
321
|
+
handleSIGINT: false,
|
|
322
|
+
handleSIGTERM: false,
|
|
323
|
+
handleSIGHUP: false,
|
|
324
|
+
headless: true
|
|
325
|
+
};
|
|
326
|
+
const optionsThatAllowBrowserReuse = [
|
|
327
|
+
"headless",
|
|
328
|
+
"timeout",
|
|
329
|
+
"tracesDir"
|
|
330
|
+
];
|
|
331
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
332
|
+
0 && (module.exports = {
|
|
333
|
+
PlaywrightServer
|
|
334
|
+
});
|