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,753 +1,792 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
17
|
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var registry_exports = {};
|
|
30
|
+
__export(registry_exports, {
|
|
31
|
+
Registry: () => Registry,
|
|
32
|
+
browserDirectoryToMarkerFilePath: () => browserDirectoryToMarkerFilePath,
|
|
33
|
+
buildPlaywrightCLICommand: () => buildPlaywrightCLICommand,
|
|
34
|
+
findChromiumChannel: () => findChromiumChannel,
|
|
35
|
+
installBrowsersForNpmInstall: () => installBrowsersForNpmInstall,
|
|
36
|
+
registry: () => registry,
|
|
37
|
+
registryDirectory: () => registryDirectory,
|
|
38
|
+
writeDockerVersion: () => import_dependencies3.writeDockerVersion
|
|
17
39
|
});
|
|
18
|
-
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
var
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
var
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
*
|
|
46
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
47
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
48
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
49
|
-
* See the License for the specific language governing permissions and
|
|
50
|
-
* limitations under the License.
|
|
51
|
-
*/
|
|
52
|
-
|
|
53
|
-
const PACKAGE_PATH = _path.default.join(__dirname, '..', '..', '..');
|
|
54
|
-
const BIN_PATH = _path.default.join(__dirname, '..', '..', '..', 'bin');
|
|
55
|
-
const PLAYWRIGHT_CDN_MIRRORS = ['https://cdn.playwright.dev/dbazure/download/playwright',
|
|
56
|
-
// ESRP CDN
|
|
57
|
-
'https://playwright.download.prss.microsoft.com/dbazure/download/playwright',
|
|
58
|
-
// Directly hit ESRP CDN
|
|
59
|
-
'https://cdn.playwright.dev' // Hit the Storage Bucket directly
|
|
40
|
+
module.exports = __toCommonJS(registry_exports);
|
|
41
|
+
var import_fs = __toESM(require("fs"));
|
|
42
|
+
var import_os = __toESM(require("os"));
|
|
43
|
+
var import_path = __toESM(require("path"));
|
|
44
|
+
var util = __toESM(require("util"));
|
|
45
|
+
var import_browserFetcher = require("./browserFetcher");
|
|
46
|
+
var import_dependencies = require("./dependencies");
|
|
47
|
+
var import_dependencies2 = require("./dependencies");
|
|
48
|
+
var import_utils = require("../../utils");
|
|
49
|
+
var import_ascii = require("../utils/ascii");
|
|
50
|
+
var import_debugLogger = require("../utils/debugLogger");
|
|
51
|
+
var import_hostPlatform = require("../utils/hostPlatform");
|
|
52
|
+
var import_network = require("../utils/network");
|
|
53
|
+
var import_spawnAsync = require("../utils/spawnAsync");
|
|
54
|
+
var import_userAgent = require("../utils/userAgent");
|
|
55
|
+
var import_utilsBundle = require("../../utilsBundle");
|
|
56
|
+
var import_fileUtils = require("../utils/fileUtils");
|
|
57
|
+
var import_dependencies3 = require("./dependencies");
|
|
58
|
+
const PACKAGE_PATH = import_path.default.join(__dirname, "..", "..", "..");
|
|
59
|
+
const BIN_PATH = import_path.default.join(__dirname, "..", "..", "..", "bin");
|
|
60
|
+
const PLAYWRIGHT_CDN_MIRRORS = [
|
|
61
|
+
"https://cdn.playwright.dev/dbazure/download/playwright",
|
|
62
|
+
// ESRP CDN
|
|
63
|
+
"https://playwright.download.prss.microsoft.com/dbazure/download/playwright",
|
|
64
|
+
// Directly hit ESRP CDN
|
|
65
|
+
"https://cdn.playwright.dev"
|
|
66
|
+
// Hit the Storage Bucket directly
|
|
60
67
|
];
|
|
61
68
|
if (process.env.PW_TEST_CDN_THAT_SHOULD_WORK) {
|
|
62
69
|
for (let i = 0; i < PLAYWRIGHT_CDN_MIRRORS.length; i++) {
|
|
63
70
|
const cdn = PLAYWRIGHT_CDN_MIRRORS[i];
|
|
64
71
|
if (cdn !== process.env.PW_TEST_CDN_THAT_SHOULD_WORK) {
|
|
65
72
|
const parsedCDN = new URL(cdn);
|
|
66
|
-
parsedCDN.hostname = parsedCDN.hostname +
|
|
73
|
+
parsedCDN.hostname = parsedCDN.hostname + ".does-not-resolve.playwright.dev";
|
|
67
74
|
PLAYWRIGHT_CDN_MIRRORS[i] = parsedCDN.toString();
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
}
|
|
71
78
|
const EXECUTABLE_PATHS = {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
"chromium": {
|
|
80
|
+
"linux": ["chrome-linux", "chrome"],
|
|
81
|
+
"mac": ["chrome-mac", "Chromium.app", "Contents", "MacOS", "Chromium"],
|
|
82
|
+
"win": ["chrome-win", "chrome.exe"]
|
|
76
83
|
},
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
"chromium-headless-shell": {
|
|
85
|
+
"linux": ["chrome-linux", "headless_shell"],
|
|
86
|
+
"mac": ["chrome-mac", "headless_shell"],
|
|
87
|
+
"win": ["chrome-win", "headless_shell.exe"]
|
|
81
88
|
},
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
89
|
+
"firefox": {
|
|
90
|
+
"linux": ["firefox", "firefox"],
|
|
91
|
+
"mac": ["firefox", "Nightly.app", "Contents", "MacOS", "firefox"],
|
|
92
|
+
"win": ["firefox", "firefox.exe"]
|
|
86
93
|
},
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
94
|
+
"webkit": {
|
|
95
|
+
"linux": ["pw_run.sh"],
|
|
96
|
+
"mac": ["pw_run.sh"],
|
|
97
|
+
"win": ["Playwright.exe"]
|
|
91
98
|
},
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
99
|
+
"ffmpeg": {
|
|
100
|
+
"linux": ["ffmpeg-linux"],
|
|
101
|
+
"mac": ["ffmpeg-mac"],
|
|
102
|
+
"win": ["ffmpeg-win64.exe"]
|
|
96
103
|
},
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
104
|
+
"winldd": {
|
|
105
|
+
"linux": void 0,
|
|
106
|
+
"mac": void 0,
|
|
107
|
+
"win": ["PrintDeps.exe"]
|
|
101
108
|
}
|
|
102
109
|
};
|
|
103
110
|
const DOWNLOAD_PATHS = {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
111
|
+
"chromium": {
|
|
112
|
+
"<unknown>": void 0,
|
|
113
|
+
"ubuntu18.04-x64": void 0,
|
|
114
|
+
"ubuntu20.04-x64": "builds/chromium/%s/chromium-linux.zip",
|
|
115
|
+
"ubuntu22.04-x64": "builds/chromium/%s/chromium-linux.zip",
|
|
116
|
+
"ubuntu24.04-x64": "builds/chromium/%s/chromium-linux.zip",
|
|
117
|
+
"ubuntu18.04-arm64": void 0,
|
|
118
|
+
"ubuntu20.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
119
|
+
"ubuntu22.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
120
|
+
"ubuntu24.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
121
|
+
"debian11-x64": "builds/chromium/%s/chromium-linux.zip",
|
|
122
|
+
"debian11-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
123
|
+
"debian12-x64": "builds/chromium/%s/chromium-linux.zip",
|
|
124
|
+
"debian12-arm64": "builds/chromium/%s/chromium-linux-arm64.zip",
|
|
125
|
+
"mac10.13": "builds/chromium/%s/chromium-mac.zip",
|
|
126
|
+
"mac10.14": "builds/chromium/%s/chromium-mac.zip",
|
|
127
|
+
"mac10.15": "builds/chromium/%s/chromium-mac.zip",
|
|
128
|
+
"mac11": "builds/chromium/%s/chromium-mac.zip",
|
|
129
|
+
"mac11-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
|
|
130
|
+
"mac12": "builds/chromium/%s/chromium-mac.zip",
|
|
131
|
+
"mac12-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
|
|
132
|
+
"mac13": "builds/chromium/%s/chromium-mac.zip",
|
|
133
|
+
"mac13-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
|
|
134
|
+
"mac14": "builds/chromium/%s/chromium-mac.zip",
|
|
135
|
+
"mac14-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
|
|
136
|
+
"mac15": "builds/chromium/%s/chromium-mac.zip",
|
|
137
|
+
"mac15-arm64": "builds/chromium/%s/chromium-mac-arm64.zip",
|
|
138
|
+
"win64": "builds/chromium/%s/chromium-win64.zip"
|
|
132
139
|
},
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
140
|
+
"chromium-headless-shell": {
|
|
141
|
+
"<unknown>": void 0,
|
|
142
|
+
"ubuntu18.04-x64": void 0,
|
|
143
|
+
"ubuntu20.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
|
|
144
|
+
"ubuntu22.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
|
|
145
|
+
"ubuntu24.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
|
|
146
|
+
"ubuntu18.04-arm64": void 0,
|
|
147
|
+
"ubuntu20.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
|
|
148
|
+
"ubuntu22.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
|
|
149
|
+
"ubuntu24.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
|
|
150
|
+
"debian11-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
|
|
151
|
+
"debian11-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
|
|
152
|
+
"debian12-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip",
|
|
153
|
+
"debian12-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip",
|
|
154
|
+
"mac10.13": void 0,
|
|
155
|
+
"mac10.14": void 0,
|
|
156
|
+
"mac10.15": void 0,
|
|
157
|
+
"mac11": "builds/chromium/%s/chromium-headless-shell-mac.zip",
|
|
158
|
+
"mac11-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
|
|
159
|
+
"mac12": "builds/chromium/%s/chromium-headless-shell-mac.zip",
|
|
160
|
+
"mac12-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
|
|
161
|
+
"mac13": "builds/chromium/%s/chromium-headless-shell-mac.zip",
|
|
162
|
+
"mac13-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
|
|
163
|
+
"mac14": "builds/chromium/%s/chromium-headless-shell-mac.zip",
|
|
164
|
+
"mac14-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
|
|
165
|
+
"mac15": "builds/chromium/%s/chromium-headless-shell-mac.zip",
|
|
166
|
+
"mac15-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip",
|
|
167
|
+
"win64": "builds/chromium/%s/chromium-headless-shell-win64.zip"
|
|
161
168
|
},
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
169
|
+
"chromium-tip-of-tree": {
|
|
170
|
+
"<unknown>": void 0,
|
|
171
|
+
"ubuntu18.04-x64": void 0,
|
|
172
|
+
"ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
|
|
173
|
+
"ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
|
|
174
|
+
"ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
|
|
175
|
+
"ubuntu18.04-arm64": void 0,
|
|
176
|
+
"ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
|
|
177
|
+
"ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
|
|
178
|
+
"ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
|
|
179
|
+
"debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
|
|
180
|
+
"debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
|
|
181
|
+
"debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip",
|
|
182
|
+
"debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip",
|
|
183
|
+
"mac10.13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
184
|
+
"mac10.14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
185
|
+
"mac10.15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
186
|
+
"mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
187
|
+
"mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
|
|
188
|
+
"mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
189
|
+
"mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
|
|
190
|
+
"mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
191
|
+
"mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
|
|
192
|
+
"mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
193
|
+
"mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
|
|
194
|
+
"mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip",
|
|
195
|
+
"mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip",
|
|
196
|
+
"win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-win64.zip"
|
|
190
197
|
},
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
198
|
+
"chromium-tip-of-tree-headless-shell": {
|
|
199
|
+
"<unknown>": void 0,
|
|
200
|
+
"ubuntu18.04-x64": void 0,
|
|
201
|
+
"ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
|
|
202
|
+
"ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
|
|
203
|
+
"ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
|
|
204
|
+
"ubuntu18.04-arm64": void 0,
|
|
205
|
+
"ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
|
|
206
|
+
"ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
|
|
207
|
+
"ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
|
|
208
|
+
"debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
|
|
209
|
+
"debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
|
|
210
|
+
"debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip",
|
|
211
|
+
"debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip",
|
|
212
|
+
"mac10.13": void 0,
|
|
213
|
+
"mac10.14": void 0,
|
|
214
|
+
"mac10.15": void 0,
|
|
215
|
+
"mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
|
|
216
|
+
"mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
|
|
217
|
+
"mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
|
|
218
|
+
"mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
|
|
219
|
+
"mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
|
|
220
|
+
"mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
|
|
221
|
+
"mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
|
|
222
|
+
"mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
|
|
223
|
+
"mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip",
|
|
224
|
+
"mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip",
|
|
225
|
+
"win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-win64.zip"
|
|
219
226
|
},
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
227
|
+
"firefox": {
|
|
228
|
+
"<unknown>": void 0,
|
|
229
|
+
"ubuntu18.04-x64": void 0,
|
|
230
|
+
"ubuntu20.04-x64": "builds/firefox/%s/firefox-ubuntu-20.04.zip",
|
|
231
|
+
"ubuntu22.04-x64": "builds/firefox/%s/firefox-ubuntu-22.04.zip",
|
|
232
|
+
"ubuntu24.04-x64": "builds/firefox/%s/firefox-ubuntu-24.04.zip",
|
|
233
|
+
"ubuntu18.04-arm64": void 0,
|
|
234
|
+
"ubuntu20.04-arm64": "builds/firefox/%s/firefox-ubuntu-20.04-arm64.zip",
|
|
235
|
+
"ubuntu22.04-arm64": "builds/firefox/%s/firefox-ubuntu-22.04-arm64.zip",
|
|
236
|
+
"ubuntu24.04-arm64": "builds/firefox/%s/firefox-ubuntu-24.04-arm64.zip",
|
|
237
|
+
"debian11-x64": "builds/firefox/%s/firefox-debian-11.zip",
|
|
238
|
+
"debian11-arm64": "builds/firefox/%s/firefox-debian-11-arm64.zip",
|
|
239
|
+
"debian12-x64": "builds/firefox/%s/firefox-debian-12.zip",
|
|
240
|
+
"debian12-arm64": "builds/firefox/%s/firefox-debian-12-arm64.zip",
|
|
241
|
+
"mac10.13": "builds/firefox/%s/firefox-mac.zip",
|
|
242
|
+
"mac10.14": "builds/firefox/%s/firefox-mac.zip",
|
|
243
|
+
"mac10.15": "builds/firefox/%s/firefox-mac.zip",
|
|
244
|
+
"mac11": "builds/firefox/%s/firefox-mac.zip",
|
|
245
|
+
"mac11-arm64": "builds/firefox/%s/firefox-mac-arm64.zip",
|
|
246
|
+
"mac12": "builds/firefox/%s/firefox-mac.zip",
|
|
247
|
+
"mac12-arm64": "builds/firefox/%s/firefox-mac-arm64.zip",
|
|
248
|
+
"mac13": "builds/firefox/%s/firefox-mac.zip",
|
|
249
|
+
"mac13-arm64": "builds/firefox/%s/firefox-mac-arm64.zip",
|
|
250
|
+
"mac14": "builds/firefox/%s/firefox-mac.zip",
|
|
251
|
+
"mac14-arm64": "builds/firefox/%s/firefox-mac-arm64.zip",
|
|
252
|
+
"mac15": "builds/firefox/%s/firefox-mac.zip",
|
|
253
|
+
"mac15-arm64": "builds/firefox/%s/firefox-mac-arm64.zip",
|
|
254
|
+
"win64": "builds/firefox/%s/firefox-win64.zip"
|
|
248
255
|
},
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
256
|
+
"firefox-beta": {
|
|
257
|
+
"<unknown>": void 0,
|
|
258
|
+
"ubuntu18.04-x64": void 0,
|
|
259
|
+
"ubuntu20.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-20.04.zip",
|
|
260
|
+
"ubuntu22.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-22.04.zip",
|
|
261
|
+
"ubuntu24.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-24.04.zip",
|
|
262
|
+
"ubuntu18.04-arm64": void 0,
|
|
263
|
+
"ubuntu20.04-arm64": void 0,
|
|
264
|
+
"ubuntu22.04-arm64": "builds/firefox-beta/%s/firefox-beta-ubuntu-22.04-arm64.zip",
|
|
265
|
+
"ubuntu24.04-arm64": "builds/firefox-beta/%s/firefox-beta-ubuntu-24.04-arm64.zip",
|
|
266
|
+
"debian11-x64": "builds/firefox-beta/%s/firefox-beta-debian-11.zip",
|
|
267
|
+
"debian11-arm64": "builds/firefox-beta/%s/firefox-beta-debian-11-arm64.zip",
|
|
268
|
+
"debian12-x64": "builds/firefox-beta/%s/firefox-beta-debian-12.zip",
|
|
269
|
+
"debian12-arm64": "builds/firefox-beta/%s/firefox-beta-debian-12-arm64.zip",
|
|
270
|
+
"mac10.13": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
271
|
+
"mac10.14": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
272
|
+
"mac10.15": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
273
|
+
"mac11": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
274
|
+
"mac11-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip",
|
|
275
|
+
"mac12": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
276
|
+
"mac12-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip",
|
|
277
|
+
"mac13": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
278
|
+
"mac13-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip",
|
|
279
|
+
"mac14": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
280
|
+
"mac14-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip",
|
|
281
|
+
"mac15": "builds/firefox-beta/%s/firefox-beta-mac.zip",
|
|
282
|
+
"mac15-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip",
|
|
283
|
+
"win64": "builds/firefox-beta/%s/firefox-beta-win64.zip"
|
|
277
284
|
},
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
285
|
+
"webkit": {
|
|
286
|
+
"<unknown>": void 0,
|
|
287
|
+
"ubuntu18.04-x64": void 0,
|
|
288
|
+
"ubuntu20.04-x64": "builds/webkit/%s/webkit-ubuntu-20.04.zip",
|
|
289
|
+
"ubuntu22.04-x64": "builds/webkit/%s/webkit-ubuntu-22.04.zip",
|
|
290
|
+
"ubuntu24.04-x64": "builds/webkit/%s/webkit-ubuntu-24.04.zip",
|
|
291
|
+
"ubuntu18.04-arm64": void 0,
|
|
292
|
+
"ubuntu20.04-arm64": "builds/webkit/%s/webkit-ubuntu-20.04-arm64.zip",
|
|
293
|
+
"ubuntu22.04-arm64": "builds/webkit/%s/webkit-ubuntu-22.04-arm64.zip",
|
|
294
|
+
"ubuntu24.04-arm64": "builds/webkit/%s/webkit-ubuntu-24.04-arm64.zip",
|
|
295
|
+
"debian11-x64": "builds/webkit/%s/webkit-debian-11.zip",
|
|
296
|
+
"debian11-arm64": "builds/webkit/%s/webkit-debian-11-arm64.zip",
|
|
297
|
+
"debian12-x64": "builds/webkit/%s/webkit-debian-12.zip",
|
|
298
|
+
"debian12-arm64": "builds/webkit/%s/webkit-debian-12-arm64.zip",
|
|
299
|
+
"mac10.13": void 0,
|
|
300
|
+
"mac10.14": "builds/deprecated-webkit-mac-10.14/%s/deprecated-webkit-mac-10.14.zip",
|
|
301
|
+
"mac10.15": "builds/deprecated-webkit-mac-10.15/%s/deprecated-webkit-mac-10.15.zip",
|
|
302
|
+
"mac11": "builds/webkit/%s/webkit-mac-11.zip",
|
|
303
|
+
"mac11-arm64": "builds/webkit/%s/webkit-mac-11-arm64.zip",
|
|
304
|
+
"mac12": "builds/webkit/%s/webkit-mac-12.zip",
|
|
305
|
+
"mac12-arm64": "builds/webkit/%s/webkit-mac-12-arm64.zip",
|
|
306
|
+
"mac13": "builds/webkit/%s/webkit-mac-13.zip",
|
|
307
|
+
"mac13-arm64": "builds/webkit/%s/webkit-mac-13-arm64.zip",
|
|
308
|
+
"mac14": "builds/webkit/%s/webkit-mac-14.zip",
|
|
309
|
+
"mac14-arm64": "builds/webkit/%s/webkit-mac-14-arm64.zip",
|
|
310
|
+
"mac15": "builds/webkit/%s/webkit-mac-15.zip",
|
|
311
|
+
"mac15-arm64": "builds/webkit/%s/webkit-mac-15-arm64.zip",
|
|
312
|
+
"win64": "builds/webkit/%s/webkit-win64.zip"
|
|
306
313
|
},
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
314
|
+
"ffmpeg": {
|
|
315
|
+
"<unknown>": void 0,
|
|
316
|
+
"ubuntu18.04-x64": void 0,
|
|
317
|
+
"ubuntu20.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip",
|
|
318
|
+
"ubuntu22.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip",
|
|
319
|
+
"ubuntu24.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip",
|
|
320
|
+
"ubuntu18.04-arm64": void 0,
|
|
321
|
+
"ubuntu20.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip",
|
|
322
|
+
"ubuntu22.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip",
|
|
323
|
+
"ubuntu24.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip",
|
|
324
|
+
"debian11-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip",
|
|
325
|
+
"debian11-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip",
|
|
326
|
+
"debian12-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip",
|
|
327
|
+
"debian12-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip",
|
|
328
|
+
"mac10.13": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
329
|
+
"mac10.14": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
330
|
+
"mac10.15": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
331
|
+
"mac11": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
332
|
+
"mac11-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip",
|
|
333
|
+
"mac12": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
334
|
+
"mac12-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip",
|
|
335
|
+
"mac13": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
336
|
+
"mac13-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip",
|
|
337
|
+
"mac14": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
338
|
+
"mac14-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip",
|
|
339
|
+
"mac15": "builds/ffmpeg/%s/ffmpeg-mac.zip",
|
|
340
|
+
"mac15-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip",
|
|
341
|
+
"win64": "builds/ffmpeg/%s/ffmpeg-win64.zip"
|
|
335
342
|
},
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
343
|
+
"winldd": {
|
|
344
|
+
"<unknown>": void 0,
|
|
345
|
+
"ubuntu18.04-x64": void 0,
|
|
346
|
+
"ubuntu20.04-x64": void 0,
|
|
347
|
+
"ubuntu22.04-x64": void 0,
|
|
348
|
+
"ubuntu24.04-x64": void 0,
|
|
349
|
+
"ubuntu18.04-arm64": void 0,
|
|
350
|
+
"ubuntu20.04-arm64": void 0,
|
|
351
|
+
"ubuntu22.04-arm64": void 0,
|
|
352
|
+
"ubuntu24.04-arm64": void 0,
|
|
353
|
+
"debian11-x64": void 0,
|
|
354
|
+
"debian11-arm64": void 0,
|
|
355
|
+
"debian12-x64": void 0,
|
|
356
|
+
"debian12-arm64": void 0,
|
|
357
|
+
"mac10.13": void 0,
|
|
358
|
+
"mac10.14": void 0,
|
|
359
|
+
"mac10.15": void 0,
|
|
360
|
+
"mac11": void 0,
|
|
361
|
+
"mac11-arm64": void 0,
|
|
362
|
+
"mac12": void 0,
|
|
363
|
+
"mac12-arm64": void 0,
|
|
364
|
+
"mac13": void 0,
|
|
365
|
+
"mac13-arm64": void 0,
|
|
366
|
+
"mac14": void 0,
|
|
367
|
+
"mac14-arm64": void 0,
|
|
368
|
+
"mac15": void 0,
|
|
369
|
+
"mac15-arm64": void 0,
|
|
370
|
+
"win64": "builds/winldd/%s/winldd-win64.zip"
|
|
364
371
|
},
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
372
|
+
"android": {
|
|
373
|
+
"<unknown>": "builds/android/%s/android.zip",
|
|
374
|
+
"ubuntu18.04-x64": void 0,
|
|
375
|
+
"ubuntu20.04-x64": "builds/android/%s/android.zip",
|
|
376
|
+
"ubuntu22.04-x64": "builds/android/%s/android.zip",
|
|
377
|
+
"ubuntu24.04-x64": "builds/android/%s/android.zip",
|
|
378
|
+
"ubuntu18.04-arm64": void 0,
|
|
379
|
+
"ubuntu20.04-arm64": "builds/android/%s/android.zip",
|
|
380
|
+
"ubuntu22.04-arm64": "builds/android/%s/android.zip",
|
|
381
|
+
"ubuntu24.04-arm64": "builds/android/%s/android.zip",
|
|
382
|
+
"debian11-x64": "builds/android/%s/android.zip",
|
|
383
|
+
"debian11-arm64": "builds/android/%s/android.zip",
|
|
384
|
+
"debian12-x64": "builds/android/%s/android.zip",
|
|
385
|
+
"debian12-arm64": "builds/android/%s/android.zip",
|
|
386
|
+
"mac10.13": "builds/android/%s/android.zip",
|
|
387
|
+
"mac10.14": "builds/android/%s/android.zip",
|
|
388
|
+
"mac10.15": "builds/android/%s/android.zip",
|
|
389
|
+
"mac11": "builds/android/%s/android.zip",
|
|
390
|
+
"mac11-arm64": "builds/android/%s/android.zip",
|
|
391
|
+
"mac12": "builds/android/%s/android.zip",
|
|
392
|
+
"mac12-arm64": "builds/android/%s/android.zip",
|
|
393
|
+
"mac13": "builds/android/%s/android.zip",
|
|
394
|
+
"mac13-arm64": "builds/android/%s/android.zip",
|
|
395
|
+
"mac14": "builds/android/%s/android.zip",
|
|
396
|
+
"mac14-arm64": "builds/android/%s/android.zip",
|
|
397
|
+
"mac15": "builds/android/%s/android.zip",
|
|
398
|
+
"mac15-arm64": "builds/android/%s/android.zip",
|
|
399
|
+
"win64": "builds/android/%s/android.zip"
|
|
393
400
|
},
|
|
394
401
|
// TODO(bidi): implement downloads.
|
|
395
|
-
|
|
402
|
+
"bidi": {}
|
|
396
403
|
};
|
|
397
|
-
const registryDirectory =
|
|
404
|
+
const registryDirectory = (() => {
|
|
398
405
|
let result;
|
|
399
|
-
const envDefined = (0,
|
|
400
|
-
if (envDefined ===
|
|
401
|
-
result =
|
|
406
|
+
const envDefined = (0, import_utils.getFromENV)("PLAYWRIGHT_BROWSERS_PATH");
|
|
407
|
+
if (envDefined === "0") {
|
|
408
|
+
result = import_path.default.join(__dirname, "..", "..", "..", ".local-browsers");
|
|
402
409
|
} else if (envDefined) {
|
|
403
410
|
result = envDefined;
|
|
404
411
|
} else {
|
|
405
412
|
let cacheDirectory;
|
|
406
|
-
if (process.platform ===
|
|
407
|
-
|
|
413
|
+
if (process.platform === "linux")
|
|
414
|
+
cacheDirectory = process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
|
|
415
|
+
else if (process.platform === "darwin")
|
|
416
|
+
cacheDirectory = import_path.default.join(import_os.default.homedir(), "Library", "Caches");
|
|
417
|
+
else if (process.platform === "win32")
|
|
418
|
+
cacheDirectory = process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
|
|
419
|
+
else
|
|
420
|
+
throw new Error("Unsupported platform: " + process.platform);
|
|
421
|
+
result = import_path.default.join(cacheDirectory, "ms-playwright");
|
|
408
422
|
}
|
|
409
|
-
if (!
|
|
410
|
-
|
|
411
|
-
// - for unzipping to work correctly;
|
|
412
|
-
// - so that registry directory matches between installation and execution.
|
|
413
|
-
// INIT_CWD points to the root of `npm/yarn install` and is probably what
|
|
414
|
-
// the user meant when typing the relative path.
|
|
415
|
-
result = _path.default.resolve((0, _utils.getFromENV)('INIT_CWD') || process.cwd(), result);
|
|
423
|
+
if (!import_path.default.isAbsolute(result)) {
|
|
424
|
+
result = import_path.default.resolve((0, import_utils.getFromENV)("INIT_CWD") || process.cwd(), result);
|
|
416
425
|
}
|
|
417
426
|
return result;
|
|
418
427
|
})();
|
|
419
428
|
function isBrowserDirectory(browserDirectory) {
|
|
420
|
-
const baseName =
|
|
429
|
+
const baseName = import_path.default.basename(browserDirectory);
|
|
421
430
|
for (const browserName of allDownloadable) {
|
|
422
|
-
if (baseName.startsWith(browserName.replace(/-/g,
|
|
431
|
+
if (baseName.startsWith(browserName.replace(/-/g, "_") + "-"))
|
|
432
|
+
return true;
|
|
423
433
|
}
|
|
424
434
|
return false;
|
|
425
435
|
}
|
|
426
436
|
function readDescriptors(browsersJSON) {
|
|
427
|
-
return browsersJSON[
|
|
437
|
+
return browsersJSON["browsers"].map((obj) => {
|
|
428
438
|
const name = obj.name;
|
|
429
|
-
const revisionOverride = (obj.revisionOverrides || {})[
|
|
439
|
+
const revisionOverride = (obj.revisionOverrides || {})[import_hostPlatform.hostPlatform];
|
|
430
440
|
const revision = revisionOverride || obj.revision;
|
|
431
|
-
const browserDirectoryPrefix = revisionOverride ? `${name}_${
|
|
441
|
+
const browserDirectoryPrefix = revisionOverride ? `${name}_${import_hostPlatform.hostPlatform}_special` : `${name}`;
|
|
432
442
|
const descriptor = {
|
|
433
443
|
name,
|
|
434
444
|
revision,
|
|
435
445
|
hasRevisionOverride: !!revisionOverride,
|
|
436
446
|
// We only put browser version for the supported operating systems.
|
|
437
|
-
browserVersion: revisionOverride ?
|
|
447
|
+
browserVersion: revisionOverride ? void 0 : obj.browserVersion,
|
|
438
448
|
installByDefault: !!obj.installByDefault,
|
|
439
449
|
// Method `isBrowserDirectory` determines directory to be browser iff
|
|
440
450
|
// it starts with some browser name followed by '-'. Some browser names
|
|
441
451
|
// are prefixes of others, e.g. 'webkit' is a prefix of `webkit-technology-preview`.
|
|
442
452
|
// To avoid older registries erroneously removing 'webkit-technology-preview', we have to
|
|
443
453
|
// ensure that browser folders to never include dashes inside.
|
|
444
|
-
dir:
|
|
454
|
+
dir: import_path.default.join(registryDirectory, browserDirectoryPrefix.replace(/-/g, "_") + "-" + revision)
|
|
445
455
|
};
|
|
446
456
|
return descriptor;
|
|
447
457
|
});
|
|
448
458
|
}
|
|
449
|
-
const allDownloadable = [
|
|
459
|
+
const allDownloadable = ["android", "chromium", "firefox", "webkit", "ffmpeg", "firefox-beta", "chromium-tip-of-tree", "chromium-headless-shell", "chromium-tip-of-tree-headless-shell"];
|
|
450
460
|
class Registry {
|
|
451
461
|
constructor(browsersJSON) {
|
|
452
|
-
this._executables = void 0;
|
|
453
462
|
const descriptors = readDescriptors(browsersJSON);
|
|
454
463
|
const findExecutablePath = (dir, name) => {
|
|
455
|
-
let tokens =
|
|
456
|
-
if (process.platform ===
|
|
457
|
-
|
|
464
|
+
let tokens = void 0;
|
|
465
|
+
if (process.platform === "linux")
|
|
466
|
+
tokens = EXECUTABLE_PATHS[name]["linux"];
|
|
467
|
+
else if (process.platform === "darwin")
|
|
468
|
+
tokens = EXECUTABLE_PATHS[name]["mac"];
|
|
469
|
+
else if (process.platform === "win32")
|
|
470
|
+
tokens = EXECUTABLE_PATHS[name]["win"];
|
|
471
|
+
return tokens ? import_path.default.join(dir, ...tokens) : void 0;
|
|
458
472
|
};
|
|
459
473
|
const executablePathOrDie = (name, e, installByDefault, sdkLanguage) => {
|
|
460
|
-
if (!e)
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
const
|
|
474
|
+
if (!e)
|
|
475
|
+
throw new Error(`${name} is not supported on ${import_hostPlatform.hostPlatform}`);
|
|
476
|
+
const installCommand = buildPlaywrightCLICommand(sdkLanguage, `install${installByDefault ? "" : " " + name}`);
|
|
477
|
+
if (!(0, import_fileUtils.canAccessFile)(e)) {
|
|
478
|
+
const currentDockerVersion = (0, import_dependencies.readDockerVersionSync)();
|
|
479
|
+
const preferredDockerVersion = currentDockerVersion ? (0, import_dependencies.dockerVersion)(currentDockerVersion.dockerImageNameTemplate) : null;
|
|
465
480
|
const isOutdatedDockerImage = currentDockerVersion && preferredDockerVersion && currentDockerVersion.dockerImageName !== preferredDockerVersion.dockerImageName;
|
|
466
|
-
const prettyMessage = isOutdatedDockerImage ? [
|
|
467
|
-
|
|
481
|
+
const prettyMessage = isOutdatedDockerImage ? [
|
|
482
|
+
`Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just updated to ${preferredDockerVersion.driverVersion}.`,
|
|
483
|
+
`Please update docker image as well.`,
|
|
484
|
+
`- current: ${currentDockerVersion.dockerImageName}`,
|
|
485
|
+
`- required: ${preferredDockerVersion.dockerImageName}`,
|
|
486
|
+
``,
|
|
487
|
+
`<3 Playwright Team`
|
|
488
|
+
].join("\n") : [
|
|
489
|
+
`Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just installed or updated.`,
|
|
490
|
+
`Please run the following command to download new browser${installByDefault ? "s" : ""}:`,
|
|
491
|
+
``,
|
|
492
|
+
` ${installCommand}`,
|
|
493
|
+
``,
|
|
494
|
+
`<3 Playwright Team`
|
|
495
|
+
].join("\n");
|
|
496
|
+
throw new Error(`Executable doesn't exist at ${e}
|
|
497
|
+
${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
|
|
468
498
|
}
|
|
469
499
|
return e;
|
|
470
500
|
};
|
|
471
501
|
this._executables = [];
|
|
472
|
-
const chromium = descriptors.find(d => d.name ===
|
|
473
|
-
const chromiumExecutable = findExecutablePath(chromium.dir,
|
|
502
|
+
const chromium = descriptors.find((d) => d.name === "chromium");
|
|
503
|
+
const chromiumExecutable = findExecutablePath(chromium.dir, "chromium");
|
|
474
504
|
this._executables.push({
|
|
475
|
-
type:
|
|
476
|
-
name:
|
|
477
|
-
browserName:
|
|
505
|
+
type: "browser",
|
|
506
|
+
name: "chromium",
|
|
507
|
+
browserName: "chromium",
|
|
478
508
|
directory: chromium.dir,
|
|
479
509
|
executablePath: () => chromiumExecutable,
|
|
480
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
481
|
-
installType: chromium.installByDefault ?
|
|
482
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, chromium.dir, [
|
|
510
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumExecutable, chromium.installByDefault, sdkLanguage),
|
|
511
|
+
installType: chromium.installByDefault ? "download-by-default" : "download-on-demand",
|
|
512
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]),
|
|
483
513
|
downloadURLs: this._downloadURLs(chromium),
|
|
484
514
|
browserVersion: chromium.browserVersion,
|
|
485
515
|
_install: () => this._downloadExecutable(chromium, chromiumExecutable),
|
|
486
|
-
_dependencyGroup:
|
|
516
|
+
_dependencyGroup: "chromium",
|
|
487
517
|
_isHermeticInstallation: true
|
|
488
518
|
});
|
|
489
|
-
const chromiumHeadlessShell = descriptors.find(d => d.name ===
|
|
490
|
-
const chromiumHeadlessShellExecutable = findExecutablePath(chromiumHeadlessShell.dir,
|
|
519
|
+
const chromiumHeadlessShell = descriptors.find((d) => d.name === "chromium-headless-shell");
|
|
520
|
+
const chromiumHeadlessShellExecutable = findExecutablePath(chromiumHeadlessShell.dir, "chromium-headless-shell");
|
|
491
521
|
this._executables.push({
|
|
492
|
-
type:
|
|
493
|
-
name:
|
|
494
|
-
browserName:
|
|
522
|
+
type: "channel",
|
|
523
|
+
name: "chromium-headless-shell",
|
|
524
|
+
browserName: "chromium",
|
|
495
525
|
directory: chromiumHeadlessShell.dir,
|
|
496
526
|
executablePath: () => chromiumHeadlessShellExecutable,
|
|
497
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
498
|
-
installType: chromiumHeadlessShell.installByDefault ?
|
|
499
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, chromiumHeadlessShell.dir, [
|
|
527
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumHeadlessShellExecutable, chromiumHeadlessShell.installByDefault, sdkLanguage),
|
|
528
|
+
installType: chromiumHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand",
|
|
529
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]),
|
|
500
530
|
downloadURLs: this._downloadURLs(chromiumHeadlessShell),
|
|
501
531
|
browserVersion: chromium.browserVersion,
|
|
502
532
|
_install: () => this._downloadExecutable(chromiumHeadlessShell, chromiumHeadlessShellExecutable),
|
|
503
|
-
_dependencyGroup:
|
|
533
|
+
_dependencyGroup: "chromium",
|
|
504
534
|
_isHermeticInstallation: true
|
|
505
535
|
});
|
|
506
|
-
const chromiumTipOfTreeHeadlessShell = descriptors.find(d => d.name ===
|
|
507
|
-
const chromiumTipOfTreeHeadlessShellExecutable = findExecutablePath(chromiumTipOfTreeHeadlessShell.dir,
|
|
536
|
+
const chromiumTipOfTreeHeadlessShell = descriptors.find((d) => d.name === "chromium-tip-of-tree-headless-shell");
|
|
537
|
+
const chromiumTipOfTreeHeadlessShellExecutable = findExecutablePath(chromiumTipOfTreeHeadlessShell.dir, "chromium-headless-shell");
|
|
508
538
|
this._executables.push({
|
|
509
|
-
type:
|
|
510
|
-
name:
|
|
511
|
-
browserName:
|
|
539
|
+
type: "channel",
|
|
540
|
+
name: "chromium-tip-of-tree-headless-shell",
|
|
541
|
+
browserName: "chromium",
|
|
512
542
|
directory: chromiumTipOfTreeHeadlessShell.dir,
|
|
513
543
|
executablePath: () => chromiumTipOfTreeHeadlessShellExecutable,
|
|
514
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
515
|
-
installType: chromiumTipOfTreeHeadlessShell.installByDefault ?
|
|
516
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, chromiumTipOfTreeHeadlessShell.dir, [
|
|
544
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumTipOfTreeHeadlessShellExecutable, chromiumTipOfTreeHeadlessShell.installByDefault, sdkLanguage),
|
|
545
|
+
installType: chromiumTipOfTreeHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand",
|
|
546
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTreeHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]),
|
|
517
547
|
downloadURLs: this._downloadURLs(chromiumTipOfTreeHeadlessShell),
|
|
518
548
|
browserVersion: chromium.browserVersion,
|
|
519
549
|
_install: () => this._downloadExecutable(chromiumTipOfTreeHeadlessShell, chromiumTipOfTreeHeadlessShellExecutable),
|
|
520
|
-
_dependencyGroup:
|
|
550
|
+
_dependencyGroup: "chromium",
|
|
521
551
|
_isHermeticInstallation: true
|
|
522
552
|
});
|
|
523
|
-
const chromiumTipOfTree = descriptors.find(d => d.name ===
|
|
524
|
-
const chromiumTipOfTreeExecutable = findExecutablePath(chromiumTipOfTree.dir,
|
|
553
|
+
const chromiumTipOfTree = descriptors.find((d) => d.name === "chromium-tip-of-tree");
|
|
554
|
+
const chromiumTipOfTreeExecutable = findExecutablePath(chromiumTipOfTree.dir, "chromium");
|
|
525
555
|
this._executables.push({
|
|
526
|
-
type:
|
|
527
|
-
name:
|
|
528
|
-
browserName:
|
|
556
|
+
type: "tool",
|
|
557
|
+
name: "chromium-tip-of-tree",
|
|
558
|
+
browserName: "chromium",
|
|
529
559
|
directory: chromiumTipOfTree.dir,
|
|
530
560
|
executablePath: () => chromiumTipOfTreeExecutable,
|
|
531
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
532
|
-
installType: chromiumTipOfTree.installByDefault ?
|
|
533
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, chromiumTipOfTree.dir, [
|
|
561
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium-tip-of-tree", chromiumTipOfTreeExecutable, chromiumTipOfTree.installByDefault, sdkLanguage),
|
|
562
|
+
installType: chromiumTipOfTree.installByDefault ? "download-by-default" : "download-on-demand",
|
|
563
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTree.dir, ["chrome-linux"], [], ["chrome-win"]),
|
|
534
564
|
downloadURLs: this._downloadURLs(chromiumTipOfTree),
|
|
535
565
|
browserVersion: chromiumTipOfTree.browserVersion,
|
|
536
566
|
_install: () => this._downloadExecutable(chromiumTipOfTree, chromiumTipOfTreeExecutable),
|
|
537
|
-
_dependencyGroup:
|
|
567
|
+
_dependencyGroup: "chromium",
|
|
538
568
|
_isHermeticInstallation: true
|
|
539
569
|
});
|
|
540
|
-
this._executables.push(this._createChromiumChannel(
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
}, () => this._installChromiumChannel(
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
570
|
+
this._executables.push(this._createChromiumChannel("chrome", {
|
|
571
|
+
"linux": "/opt/google/chrome/chrome",
|
|
572
|
+
"darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
573
|
+
"win32": `\\Google\\Chrome\\Application\\chrome.exe`
|
|
574
|
+
}, () => this._installChromiumChannel("chrome", {
|
|
575
|
+
"linux": "reinstall_chrome_stable_linux.sh",
|
|
576
|
+
"darwin": "reinstall_chrome_stable_mac.sh",
|
|
577
|
+
"win32": "reinstall_chrome_stable_win.ps1"
|
|
548
578
|
})));
|
|
549
|
-
this._executables.push(this._createChromiumChannel(
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
}, () => this._installChromiumChannel(
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
579
|
+
this._executables.push(this._createChromiumChannel("chrome-beta", {
|
|
580
|
+
"linux": "/opt/google/chrome-beta/chrome",
|
|
581
|
+
"darwin": "/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta",
|
|
582
|
+
"win32": `\\Google\\Chrome Beta\\Application\\chrome.exe`
|
|
583
|
+
}, () => this._installChromiumChannel("chrome-beta", {
|
|
584
|
+
"linux": "reinstall_chrome_beta_linux.sh",
|
|
585
|
+
"darwin": "reinstall_chrome_beta_mac.sh",
|
|
586
|
+
"win32": "reinstall_chrome_beta_win.ps1"
|
|
557
587
|
})));
|
|
558
|
-
this._executables.push(this._createChromiumChannel(
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
588
|
+
this._executables.push(this._createChromiumChannel("chrome-dev", {
|
|
589
|
+
"linux": "/opt/google/chrome-unstable/chrome",
|
|
590
|
+
"darwin": "/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev",
|
|
591
|
+
"win32": `\\Google\\Chrome Dev\\Application\\chrome.exe`
|
|
562
592
|
}));
|
|
563
|
-
this._executables.push(this._createChromiumChannel(
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
593
|
+
this._executables.push(this._createChromiumChannel("chrome-canary", {
|
|
594
|
+
"linux": "",
|
|
595
|
+
"darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
|
|
596
|
+
"win32": `\\Google\\Chrome SxS\\Application\\chrome.exe`
|
|
567
597
|
}));
|
|
568
|
-
this._executables.push(this._createChromiumChannel(
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
}, () => this._installMSEdgeChannel(
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
598
|
+
this._executables.push(this._createChromiumChannel("msedge", {
|
|
599
|
+
"linux": "/opt/microsoft/msedge/msedge",
|
|
600
|
+
"darwin": "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
|
|
601
|
+
"win32": `\\Microsoft\\Edge\\Application\\msedge.exe`
|
|
602
|
+
}, () => this._installMSEdgeChannel("msedge", {
|
|
603
|
+
"linux": "reinstall_msedge_stable_linux.sh",
|
|
604
|
+
"darwin": "reinstall_msedge_stable_mac.sh",
|
|
605
|
+
"win32": "reinstall_msedge_stable_win.ps1"
|
|
576
606
|
})));
|
|
577
|
-
this._executables.push(this._createChromiumChannel(
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
}, () => this._installMSEdgeChannel(
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
607
|
+
this._executables.push(this._createChromiumChannel("msedge-beta", {
|
|
608
|
+
"linux": "/opt/microsoft/msedge-beta/msedge",
|
|
609
|
+
"darwin": "/Applications/Microsoft Edge Beta.app/Contents/MacOS/Microsoft Edge Beta",
|
|
610
|
+
"win32": `\\Microsoft\\Edge Beta\\Application\\msedge.exe`
|
|
611
|
+
}, () => this._installMSEdgeChannel("msedge-beta", {
|
|
612
|
+
"darwin": "reinstall_msedge_beta_mac.sh",
|
|
613
|
+
"linux": "reinstall_msedge_beta_linux.sh",
|
|
614
|
+
"win32": "reinstall_msedge_beta_win.ps1"
|
|
585
615
|
})));
|
|
586
|
-
this._executables.push(this._createChromiumChannel(
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
}, () => this._installMSEdgeChannel(
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
616
|
+
this._executables.push(this._createChromiumChannel("msedge-dev", {
|
|
617
|
+
"linux": "/opt/microsoft/msedge-dev/msedge",
|
|
618
|
+
"darwin": "/Applications/Microsoft Edge Dev.app/Contents/MacOS/Microsoft Edge Dev",
|
|
619
|
+
"win32": `\\Microsoft\\Edge Dev\\Application\\msedge.exe`
|
|
620
|
+
}, () => this._installMSEdgeChannel("msedge-dev", {
|
|
621
|
+
"darwin": "reinstall_msedge_dev_mac.sh",
|
|
622
|
+
"linux": "reinstall_msedge_dev_linux.sh",
|
|
623
|
+
"win32": "reinstall_msedge_dev_win.ps1"
|
|
594
624
|
})));
|
|
595
|
-
this._executables.push(this._createChromiumChannel(
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
625
|
+
this._executables.push(this._createChromiumChannel("msedge-canary", {
|
|
626
|
+
"linux": "",
|
|
627
|
+
"darwin": "/Applications/Microsoft Edge Canary.app/Contents/MacOS/Microsoft Edge Canary",
|
|
628
|
+
"win32": `\\Microsoft\\Edge SxS\\Application\\msedge.exe`
|
|
599
629
|
}));
|
|
600
|
-
this._executables.push(this._createBidiFirefoxChannel(
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
630
|
+
this._executables.push(this._createBidiFirefoxChannel("moz-firefox", {
|
|
631
|
+
"linux": "/snap/bin/firefox",
|
|
632
|
+
"darwin": "/Applications/Firefox.app/Contents/MacOS/firefox",
|
|
633
|
+
"win32": "\\Mozilla Firefox\\firefox.exe"
|
|
604
634
|
}));
|
|
605
|
-
this._executables.push(this._createBidiFirefoxChannel(
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
635
|
+
this._executables.push(this._createBidiFirefoxChannel("moz-firefox-beta", {
|
|
636
|
+
"linux": "/opt/firefox-beta/firefox",
|
|
637
|
+
"darwin": "/Applications/Firefox.app/Contents/MacOS/firefox",
|
|
638
|
+
"win32": "\\Mozilla Firefox\\firefox.exe"
|
|
609
639
|
}));
|
|
610
|
-
this._executables.push(this._createBidiFirefoxChannel(
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
640
|
+
this._executables.push(this._createBidiFirefoxChannel("moz-firefox-nightly", {
|
|
641
|
+
"linux": "/opt/firefox-nightly/firefox",
|
|
642
|
+
"darwin": "/Applications/Firefox Nightly.app/Contents/MacOS/firefox",
|
|
643
|
+
"win32": "\\Mozilla Firefox\\firefox.exe"
|
|
614
644
|
}));
|
|
615
|
-
this._executables.push(this.
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
645
|
+
this._executables.push(this._createBidiChromiumChannel("bidi-chrome-stable", {
|
|
646
|
+
"linux": "/opt/google/chrome/chrome",
|
|
647
|
+
"darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
648
|
+
"win32": `\\Google\\Chrome\\Application\\chrome.exe`
|
|
619
649
|
}));
|
|
620
|
-
this._executables.push(this.
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
650
|
+
this._executables.push(this._createBidiChromiumChannel("bidi-chrome-canary", {
|
|
651
|
+
"linux": "",
|
|
652
|
+
"darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
|
|
653
|
+
"win32": `\\Google\\Chrome SxS\\Application\\chrome.exe`
|
|
624
654
|
}));
|
|
625
655
|
this._executables.push({
|
|
626
|
-
type:
|
|
627
|
-
name:
|
|
628
|
-
browserName:
|
|
656
|
+
type: "browser",
|
|
657
|
+
name: "bidi-chromium",
|
|
658
|
+
browserName: "bidi",
|
|
629
659
|
directory: chromium.dir,
|
|
630
660
|
executablePath: () => chromiumExecutable,
|
|
631
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
632
|
-
installType:
|
|
633
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, chromium.dir, [
|
|
661
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumExecutable, chromium.installByDefault, sdkLanguage),
|
|
662
|
+
installType: "download-on-demand",
|
|
663
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]),
|
|
634
664
|
downloadURLs: this._downloadURLs(chromium),
|
|
635
665
|
browserVersion: chromium.browserVersion,
|
|
636
666
|
_install: () => this._downloadExecutable(chromium, chromiumExecutable),
|
|
637
|
-
_dependencyGroup:
|
|
667
|
+
_dependencyGroup: "chromium",
|
|
638
668
|
_isHermeticInstallation: true
|
|
639
669
|
});
|
|
640
|
-
const firefox = descriptors.find(d => d.name ===
|
|
641
|
-
const firefoxExecutable = findExecutablePath(firefox.dir,
|
|
670
|
+
const firefox = descriptors.find((d) => d.name === "firefox");
|
|
671
|
+
const firefoxExecutable = findExecutablePath(firefox.dir, "firefox");
|
|
642
672
|
this._executables.push({
|
|
643
|
-
type:
|
|
644
|
-
name:
|
|
645
|
-
browserName:
|
|
673
|
+
type: "browser",
|
|
674
|
+
name: "firefox",
|
|
675
|
+
browserName: "firefox",
|
|
646
676
|
directory: firefox.dir,
|
|
647
677
|
executablePath: () => firefoxExecutable,
|
|
648
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
649
|
-
installType: firefox.installByDefault ?
|
|
650
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, firefox.dir, [
|
|
678
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("firefox", firefoxExecutable, firefox.installByDefault, sdkLanguage),
|
|
679
|
+
installType: firefox.installByDefault ? "download-by-default" : "download-on-demand",
|
|
680
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefox.dir, ["firefox"], [], ["firefox"]),
|
|
651
681
|
downloadURLs: this._downloadURLs(firefox),
|
|
652
682
|
browserVersion: firefox.browserVersion,
|
|
653
683
|
_install: () => this._downloadExecutable(firefox, firefoxExecutable),
|
|
654
|
-
_dependencyGroup:
|
|
684
|
+
_dependencyGroup: "firefox",
|
|
655
685
|
_isHermeticInstallation: true
|
|
656
686
|
});
|
|
657
|
-
const firefoxBeta = descriptors.find(d => d.name ===
|
|
658
|
-
const firefoxBetaExecutable = findExecutablePath(firefoxBeta.dir,
|
|
687
|
+
const firefoxBeta = descriptors.find((d) => d.name === "firefox-beta");
|
|
688
|
+
const firefoxBetaExecutable = findExecutablePath(firefoxBeta.dir, "firefox");
|
|
659
689
|
this._executables.push({
|
|
660
|
-
type:
|
|
661
|
-
name:
|
|
662
|
-
browserName:
|
|
690
|
+
type: "tool",
|
|
691
|
+
name: "firefox-beta",
|
|
692
|
+
browserName: "firefox",
|
|
663
693
|
directory: firefoxBeta.dir,
|
|
664
694
|
executablePath: () => firefoxBetaExecutable,
|
|
665
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
666
|
-
installType: firefoxBeta.installByDefault ?
|
|
667
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, firefoxBeta.dir, [
|
|
695
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("firefox-beta", firefoxBetaExecutable, firefoxBeta.installByDefault, sdkLanguage),
|
|
696
|
+
installType: firefoxBeta.installByDefault ? "download-by-default" : "download-on-demand",
|
|
697
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefoxBeta.dir, ["firefox"], [], ["firefox"]),
|
|
668
698
|
downloadURLs: this._downloadURLs(firefoxBeta),
|
|
669
699
|
browserVersion: firefoxBeta.browserVersion,
|
|
670
700
|
_install: () => this._downloadExecutable(firefoxBeta, firefoxBetaExecutable),
|
|
671
|
-
_dependencyGroup:
|
|
701
|
+
_dependencyGroup: "firefox",
|
|
672
702
|
_isHermeticInstallation: true
|
|
673
703
|
});
|
|
674
|
-
const webkit = descriptors.find(d => d.name ===
|
|
675
|
-
const webkitExecutable = findExecutablePath(webkit.dir,
|
|
676
|
-
const webkitLinuxLddDirectories = [
|
|
704
|
+
const webkit = descriptors.find((d) => d.name === "webkit");
|
|
705
|
+
const webkitExecutable = findExecutablePath(webkit.dir, "webkit");
|
|
706
|
+
const webkitLinuxLddDirectories = [
|
|
707
|
+
import_path.default.join("minibrowser-gtk"),
|
|
708
|
+
import_path.default.join("minibrowser-gtk", "bin"),
|
|
709
|
+
import_path.default.join("minibrowser-gtk", "lib"),
|
|
710
|
+
import_path.default.join("minibrowser-gtk", "sys", "lib"),
|
|
711
|
+
import_path.default.join("minibrowser-wpe"),
|
|
712
|
+
import_path.default.join("minibrowser-wpe", "bin"),
|
|
713
|
+
import_path.default.join("minibrowser-wpe", "lib"),
|
|
714
|
+
import_path.default.join("minibrowser-wpe", "sys", "lib")
|
|
715
|
+
];
|
|
677
716
|
this._executables.push({
|
|
678
|
-
type:
|
|
679
|
-
name:
|
|
680
|
-
browserName:
|
|
717
|
+
type: "browser",
|
|
718
|
+
name: "webkit",
|
|
719
|
+
browserName: "webkit",
|
|
681
720
|
directory: webkit.dir,
|
|
682
721
|
executablePath: () => webkitExecutable,
|
|
683
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
684
|
-
installType: webkit.installByDefault ?
|
|
685
|
-
_validateHostRequirements: sdkLanguage => this._validateHostRequirements(sdkLanguage, webkit.dir, webkitLinuxLddDirectories, [
|
|
722
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("webkit", webkitExecutable, webkit.installByDefault, sdkLanguage),
|
|
723
|
+
installType: webkit.installByDefault ? "download-by-default" : "download-on-demand",
|
|
724
|
+
_validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, webkit.dir, webkitLinuxLddDirectories, ["libGLESv2.so.2", "libx264.so"], [""]),
|
|
686
725
|
downloadURLs: this._downloadURLs(webkit),
|
|
687
726
|
browserVersion: webkit.browserVersion,
|
|
688
727
|
_install: () => this._downloadExecutable(webkit, webkitExecutable),
|
|
689
|
-
_dependencyGroup:
|
|
728
|
+
_dependencyGroup: "webkit",
|
|
690
729
|
_isHermeticInstallation: true
|
|
691
730
|
});
|
|
692
|
-
const ffmpeg = descriptors.find(d => d.name ===
|
|
693
|
-
const ffmpegExecutable = findExecutablePath(ffmpeg.dir,
|
|
731
|
+
const ffmpeg = descriptors.find((d) => d.name === "ffmpeg");
|
|
732
|
+
const ffmpegExecutable = findExecutablePath(ffmpeg.dir, "ffmpeg");
|
|
694
733
|
this._executables.push({
|
|
695
|
-
type:
|
|
696
|
-
name:
|
|
697
|
-
browserName:
|
|
734
|
+
type: "tool",
|
|
735
|
+
name: "ffmpeg",
|
|
736
|
+
browserName: void 0,
|
|
698
737
|
directory: ffmpeg.dir,
|
|
699
738
|
executablePath: () => ffmpegExecutable,
|
|
700
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
701
|
-
installType: ffmpeg.installByDefault ?
|
|
739
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("ffmpeg", ffmpegExecutable, ffmpeg.installByDefault, sdkLanguage),
|
|
740
|
+
installType: ffmpeg.installByDefault ? "download-by-default" : "download-on-demand",
|
|
702
741
|
_validateHostRequirements: () => Promise.resolve(),
|
|
703
742
|
downloadURLs: this._downloadURLs(ffmpeg),
|
|
704
743
|
_install: () => this._downloadExecutable(ffmpeg, ffmpegExecutable),
|
|
705
|
-
_dependencyGroup:
|
|
744
|
+
_dependencyGroup: "tools",
|
|
706
745
|
_isHermeticInstallation: true
|
|
707
746
|
});
|
|
708
|
-
const winldd = descriptors.find(d => d.name ===
|
|
709
|
-
const winlddExecutable = findExecutablePath(winldd.dir,
|
|
747
|
+
const winldd = descriptors.find((d) => d.name === "winldd");
|
|
748
|
+
const winlddExecutable = findExecutablePath(winldd.dir, "winldd");
|
|
710
749
|
this._executables.push({
|
|
711
|
-
type:
|
|
712
|
-
name:
|
|
713
|
-
browserName:
|
|
750
|
+
type: "tool",
|
|
751
|
+
name: "winldd",
|
|
752
|
+
browserName: void 0,
|
|
714
753
|
directory: winldd.dir,
|
|
715
754
|
executablePath: () => winlddExecutable,
|
|
716
|
-
executablePathOrDie: sdkLanguage => executablePathOrDie(
|
|
717
|
-
installType: process.platform ===
|
|
755
|
+
executablePathOrDie: (sdkLanguage) => executablePathOrDie("winldd", winlddExecutable, winldd.installByDefault, sdkLanguage),
|
|
756
|
+
installType: process.platform === "win32" ? "download-by-default" : "none",
|
|
718
757
|
_validateHostRequirements: () => Promise.resolve(),
|
|
719
758
|
downloadURLs: this._downloadURLs(winldd),
|
|
720
759
|
_install: () => this._downloadExecutable(winldd, winlddExecutable),
|
|
721
|
-
_dependencyGroup:
|
|
760
|
+
_dependencyGroup: "tools",
|
|
722
761
|
_isHermeticInstallation: true
|
|
723
762
|
});
|
|
724
|
-
const android = descriptors.find(d => d.name ===
|
|
763
|
+
const android = descriptors.find((d) => d.name === "android");
|
|
725
764
|
this._executables.push({
|
|
726
|
-
type:
|
|
727
|
-
name:
|
|
728
|
-
browserName:
|
|
765
|
+
type: "tool",
|
|
766
|
+
name: "android",
|
|
767
|
+
browserName: void 0,
|
|
729
768
|
directory: android.dir,
|
|
730
|
-
executablePath: () =>
|
|
731
|
-
executablePathOrDie: () =>
|
|
732
|
-
installType:
|
|
769
|
+
executablePath: () => void 0,
|
|
770
|
+
executablePathOrDie: () => "",
|
|
771
|
+
installType: "download-on-demand",
|
|
733
772
|
_validateHostRequirements: () => Promise.resolve(),
|
|
734
773
|
downloadURLs: this._downloadURLs(android),
|
|
735
774
|
_install: () => this._downloadExecutable(android),
|
|
736
|
-
_dependencyGroup:
|
|
775
|
+
_dependencyGroup: "tools",
|
|
737
776
|
_isHermeticInstallation: true
|
|
738
777
|
});
|
|
739
778
|
this._executables.push({
|
|
740
|
-
type:
|
|
741
|
-
name:
|
|
742
|
-
browserName:
|
|
743
|
-
directory:
|
|
744
|
-
executablePath: () =>
|
|
745
|
-
executablePathOrDie: () =>
|
|
746
|
-
installType:
|
|
779
|
+
type: "browser",
|
|
780
|
+
name: "bidi",
|
|
781
|
+
browserName: "bidi",
|
|
782
|
+
directory: void 0,
|
|
783
|
+
executablePath: () => void 0,
|
|
784
|
+
executablePathOrDie: () => "",
|
|
785
|
+
installType: "none",
|
|
747
786
|
_validateHostRequirements: () => Promise.resolve(),
|
|
748
787
|
downloadURLs: [],
|
|
749
788
|
_install: () => Promise.resolve(),
|
|
750
|
-
_dependencyGroup:
|
|
789
|
+
_dependencyGroup: "tools",
|
|
751
790
|
_isHermeticInstallation: true
|
|
752
791
|
});
|
|
753
792
|
}
|
|
@@ -755,27 +794,38 @@ class Registry {
|
|
|
755
794
|
const executablePath = (sdkLanguage, shouldThrow) => {
|
|
756
795
|
const suffix = lookAt[process.platform];
|
|
757
796
|
if (!suffix) {
|
|
758
|
-
if (shouldThrow)
|
|
759
|
-
|
|
797
|
+
if (shouldThrow)
|
|
798
|
+
throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`);
|
|
799
|
+
return void 0;
|
|
760
800
|
}
|
|
761
|
-
const prefixes = process.platform ===
|
|
801
|
+
const prefixes = process.platform === "win32" ? [
|
|
802
|
+
process.env.LOCALAPPDATA,
|
|
803
|
+
process.env.PROGRAMFILES,
|
|
804
|
+
process.env["PROGRAMFILES(X86)"],
|
|
805
|
+
// In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set.
|
|
806
|
+
process.env.HOMEDRIVE + "\\Program Files",
|
|
807
|
+
process.env.HOMEDRIVE + "\\Program Files (x86)"
|
|
808
|
+
].filter(Boolean) : [""];
|
|
762
809
|
for (const prefix of prefixes) {
|
|
763
|
-
const
|
|
764
|
-
if ((0,
|
|
810
|
+
const executablePath2 = import_path.default.join(prefix, suffix);
|
|
811
|
+
if ((0, import_fileUtils.canAccessFile)(executablePath2))
|
|
812
|
+
return executablePath2;
|
|
765
813
|
}
|
|
766
|
-
if (!shouldThrow)
|
|
767
|
-
|
|
768
|
-
const
|
|
814
|
+
if (!shouldThrow)
|
|
815
|
+
return void 0;
|
|
816
|
+
const location = prefixes.length ? ` at ${import_path.default.join(prefixes[0], suffix)}` : ``;
|
|
817
|
+
const installation = install ? `
|
|
818
|
+
Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
|
|
769
819
|
throw new Error(`Chromium distribution '${name}' is not found${location}${installation}`);
|
|
770
820
|
};
|
|
771
821
|
return {
|
|
772
|
-
type:
|
|
822
|
+
type: "channel",
|
|
773
823
|
name,
|
|
774
|
-
browserName:
|
|
775
|
-
directory:
|
|
776
|
-
executablePath: sdkLanguage => executablePath(sdkLanguage, false),
|
|
777
|
-
executablePathOrDie: sdkLanguage => executablePath(sdkLanguage, true),
|
|
778
|
-
installType: install ?
|
|
824
|
+
browserName: "chromium",
|
|
825
|
+
directory: void 0,
|
|
826
|
+
executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
|
|
827
|
+
executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
|
|
828
|
+
installType: install ? "install-script" : "none",
|
|
779
829
|
_validateHostRequirements: () => Promise.resolve(),
|
|
780
830
|
_isHermeticInstallation: false,
|
|
781
831
|
_install: install
|
|
@@ -785,59 +835,76 @@ class Registry {
|
|
|
785
835
|
const executablePath = (sdkLanguage, shouldThrow) => {
|
|
786
836
|
const suffix = lookAt[process.platform];
|
|
787
837
|
if (!suffix) {
|
|
788
|
-
if (shouldThrow)
|
|
789
|
-
|
|
838
|
+
if (shouldThrow)
|
|
839
|
+
throw new Error(`Firefox distribution '${name}' is not supported on ${process.platform}`);
|
|
840
|
+
return void 0;
|
|
790
841
|
}
|
|
791
|
-
const
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
842
|
+
const prefixes = process.platform === "win32" ? [
|
|
843
|
+
process.env.LOCALAPPDATA,
|
|
844
|
+
process.env.PROGRAMFILES,
|
|
845
|
+
process.env["PROGRAMFILES(X86)"],
|
|
846
|
+
// In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set.
|
|
847
|
+
process.env.HOMEDRIVE + "\\Program Files",
|
|
848
|
+
process.env.HOMEDRIVE + "\\Program Files (x86)"
|
|
849
|
+
].filter(Boolean) : [""];
|
|
850
|
+
for (const prefix of prefixes) {
|
|
851
|
+
const executablePath2 = import_path.default.join(prefix, suffix);
|
|
852
|
+
if ((0, import_fileUtils.canAccessFile)(executablePath2))
|
|
853
|
+
return executablePath2;
|
|
799
854
|
}
|
|
800
|
-
if (shouldThrow)
|
|
801
|
-
|
|
855
|
+
if (shouldThrow)
|
|
856
|
+
throw new Error(`Cannot find Firefox installation for channel '${name}' at the standard system paths.`);
|
|
857
|
+
return void 0;
|
|
802
858
|
};
|
|
803
859
|
return {
|
|
804
|
-
type:
|
|
860
|
+
type: "channel",
|
|
805
861
|
name,
|
|
806
|
-
browserName:
|
|
807
|
-
directory:
|
|
808
|
-
executablePath: sdkLanguage => executablePath(sdkLanguage, false),
|
|
809
|
-
executablePathOrDie: sdkLanguage => executablePath(sdkLanguage, true),
|
|
810
|
-
installType:
|
|
862
|
+
browserName: "bidi",
|
|
863
|
+
directory: void 0,
|
|
864
|
+
executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
|
|
865
|
+
executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
|
|
866
|
+
installType: "none",
|
|
811
867
|
_validateHostRequirements: () => Promise.resolve(),
|
|
812
868
|
_isHermeticInstallation: true,
|
|
813
869
|
_install: install
|
|
814
870
|
};
|
|
815
871
|
}
|
|
816
|
-
|
|
872
|
+
_createBidiChromiumChannel(name, lookAt, install) {
|
|
817
873
|
const executablePath = (sdkLanguage, shouldThrow) => {
|
|
818
874
|
const suffix = lookAt[process.platform];
|
|
819
875
|
if (!suffix) {
|
|
820
|
-
if (shouldThrow)
|
|
821
|
-
|
|
876
|
+
if (shouldThrow)
|
|
877
|
+
throw new Error(`Firefox distribution '${name}' is not supported on ${process.platform}`);
|
|
878
|
+
return void 0;
|
|
822
879
|
}
|
|
823
|
-
const prefixes = process.platform ===
|
|
880
|
+
const prefixes = process.platform === "win32" ? [
|
|
881
|
+
process.env.LOCALAPPDATA,
|
|
882
|
+
process.env.PROGRAMFILES,
|
|
883
|
+
process.env["PROGRAMFILES(X86)"],
|
|
884
|
+
// In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set.
|
|
885
|
+
process.env.HOMEDRIVE + "\\Program Files",
|
|
886
|
+
process.env.HOMEDRIVE + "\\Program Files (x86)"
|
|
887
|
+
].filter(Boolean) : [""];
|
|
824
888
|
for (const prefix of prefixes) {
|
|
825
|
-
const
|
|
826
|
-
if ((0,
|
|
889
|
+
const executablePath2 = import_path.default.join(prefix, suffix);
|
|
890
|
+
if ((0, import_fileUtils.canAccessFile)(executablePath2))
|
|
891
|
+
return executablePath2;
|
|
827
892
|
}
|
|
828
|
-
if (!shouldThrow)
|
|
829
|
-
|
|
830
|
-
const
|
|
831
|
-
|
|
893
|
+
if (!shouldThrow)
|
|
894
|
+
return void 0;
|
|
895
|
+
const location = prefixes.length ? ` at ${import_path.default.join(prefixes[0], suffix)}` : ``;
|
|
896
|
+
const installation = install ? `
|
|
897
|
+
Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : "";
|
|
898
|
+
throw new Error(`Chromium distribution '${name}' is not found${location}${installation}`);
|
|
832
899
|
};
|
|
833
900
|
return {
|
|
834
|
-
type:
|
|
901
|
+
type: "channel",
|
|
835
902
|
name,
|
|
836
|
-
browserName:
|
|
837
|
-
directory:
|
|
838
|
-
executablePath: sdkLanguage => executablePath(sdkLanguage, false),
|
|
839
|
-
executablePathOrDie: sdkLanguage => executablePath(sdkLanguage, true),
|
|
840
|
-
installType: install ?
|
|
903
|
+
browserName: "bidi",
|
|
904
|
+
directory: void 0,
|
|
905
|
+
executablePath: (sdkLanguage) => executablePath(sdkLanguage, false),
|
|
906
|
+
executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true),
|
|
907
|
+
installType: install ? "install-script" : "none",
|
|
841
908
|
_validateHostRequirements: () => Promise.resolve(),
|
|
842
909
|
_isHermeticInstallation: false,
|
|
843
910
|
_install: install
|
|
@@ -847,38 +914,41 @@ class Registry {
|
|
|
847
914
|
return this._executables;
|
|
848
915
|
}
|
|
849
916
|
findExecutable(name) {
|
|
850
|
-
return this._executables.find(b => b.name === name);
|
|
917
|
+
return this._executables.find((b) => b.name === name);
|
|
851
918
|
}
|
|
852
919
|
defaultExecutables() {
|
|
853
|
-
return this._executables.filter(e => e.installType ===
|
|
920
|
+
return this._executables.filter((e) => e.installType === "download-by-default");
|
|
854
921
|
}
|
|
855
922
|
_dedupe(executables) {
|
|
856
923
|
return Array.from(new Set(executables));
|
|
857
924
|
}
|
|
858
925
|
async _validateHostRequirements(sdkLanguage, browserDirectory, linuxLddDirectories, dlOpenLibraries, windowsExeAndDllDirectories) {
|
|
859
|
-
if (
|
|
860
|
-
|
|
926
|
+
if (import_os.default.platform() === "linux")
|
|
927
|
+
return await (0, import_dependencies2.validateDependenciesLinux)(sdkLanguage, linuxLddDirectories.map((d) => import_path.default.join(browserDirectory, d)), dlOpenLibraries);
|
|
928
|
+
if (import_os.default.platform() === "win32" && import_os.default.arch() === "x64")
|
|
929
|
+
return await (0, import_dependencies2.validateDependenciesWindows)(sdkLanguage, windowsExeAndDllDirectories.map((d) => import_path.default.join(browserDirectory, d)));
|
|
861
930
|
}
|
|
862
931
|
async installDeps(executablesToInstallDeps, dryRun) {
|
|
863
932
|
const executables = this._dedupe(executablesToInstallDeps);
|
|
864
|
-
const targets = new Set();
|
|
933
|
+
const targets = /* @__PURE__ */ new Set();
|
|
865
934
|
for (const executable of executables) {
|
|
866
|
-
if (executable._dependencyGroup)
|
|
935
|
+
if (executable._dependencyGroup)
|
|
936
|
+
targets.add(executable._dependencyGroup);
|
|
867
937
|
}
|
|
868
|
-
targets.add(
|
|
869
|
-
if (
|
|
870
|
-
|
|
938
|
+
targets.add("tools");
|
|
939
|
+
if (import_os.default.platform() === "win32")
|
|
940
|
+
return await (0, import_dependencies2.installDependenciesWindows)(targets, dryRun);
|
|
941
|
+
if (import_os.default.platform() === "linux")
|
|
942
|
+
return await (0, import_dependencies2.installDependenciesLinux)(targets, dryRun);
|
|
871
943
|
}
|
|
872
944
|
async install(executablesToInstall, forceReinstall) {
|
|
873
945
|
const executables = this._dedupe(executablesToInstall);
|
|
874
|
-
await
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
const lockfilePath = _path.default.join(registryDirectory, '__dirlock');
|
|
878
|
-
const linksDir = _path.default.join(registryDirectory, '.links');
|
|
946
|
+
await import_fs.default.promises.mkdir(registryDirectory, { recursive: true });
|
|
947
|
+
const lockfilePath = import_path.default.join(registryDirectory, "__dirlock");
|
|
948
|
+
const linksDir = import_path.default.join(registryDirectory, ".links");
|
|
879
949
|
let releaseLock;
|
|
880
950
|
try {
|
|
881
|
-
releaseLock = await
|
|
951
|
+
releaseLock = await import_utilsBundle.lockfile.lock(registryDirectory, {
|
|
882
952
|
retries: {
|
|
883
953
|
// Retry 20 times during 10 minutes with
|
|
884
954
|
// exponential back-off.
|
|
@@ -886,274 +956,316 @@ class Registry {
|
|
|
886
956
|
retries: 20,
|
|
887
957
|
factor: 1.27579
|
|
888
958
|
},
|
|
889
|
-
onCompromised: err => {
|
|
959
|
+
onCompromised: (err) => {
|
|
890
960
|
throw new Error(`${err.message} Path: ${lockfilePath}`);
|
|
891
961
|
},
|
|
892
962
|
lockfilePath
|
|
893
963
|
});
|
|
894
|
-
|
|
895
|
-
await
|
|
896
|
-
recursive: true
|
|
897
|
-
});
|
|
898
|
-
await _fs.default.promises.writeFile(_path.default.join(linksDir, (0, _utils.calculateSha1)(PACKAGE_PATH)), PACKAGE_PATH);
|
|
899
|
-
|
|
900
|
-
// Remove stale browsers.
|
|
964
|
+
await import_fs.default.promises.mkdir(linksDir, { recursive: true });
|
|
965
|
+
await import_fs.default.promises.writeFile(import_path.default.join(linksDir, (0, import_utils.calculateSha1)(PACKAGE_PATH)), PACKAGE_PATH);
|
|
901
966
|
await this._validateInstallationCache(linksDir);
|
|
902
|
-
|
|
903
|
-
// Install browsers for this package.
|
|
904
967
|
for (const executable of executables) {
|
|
905
|
-
if (!executable._install)
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
968
|
+
if (!executable._install)
|
|
969
|
+
throw new Error(`ERROR: Playwright does not support installing ${executable.name}`);
|
|
970
|
+
const { embedderName } = (0, import_userAgent.getEmbedderName)();
|
|
971
|
+
if (!(0, import_utils.getAsBooleanFromENV)("CI") && !executable._isHermeticInstallation && !forceReinstall && executable.executablePath(embedderName)) {
|
|
972
|
+
const command = buildPlaywrightCLICommand(embedderName, "install --force " + executable.name);
|
|
973
|
+
throw new Error("\n" + (0, import_ascii.wrapInASCIIBox)([
|
|
974
|
+
`ATTENTION: "${executable.name}" is already installed on the system!`,
|
|
975
|
+
``,
|
|
976
|
+
`"${executable.name}" installation is not hermetic; installing newer version`,
|
|
977
|
+
`requires *removal* of a current installation first.`,
|
|
978
|
+
``,
|
|
979
|
+
`To *uninstall* current version and re-install latest "${executable.name}":`,
|
|
980
|
+
``,
|
|
981
|
+
`- Close all running instances of "${executable.name}", if any`,
|
|
982
|
+
`- Use "--force" to install browser:`,
|
|
983
|
+
``,
|
|
984
|
+
` ${command}`,
|
|
985
|
+
``,
|
|
986
|
+
`<3 Playwright Team`
|
|
987
|
+
].join("\n"), 1));
|
|
912
988
|
}
|
|
913
989
|
await executable._install();
|
|
914
990
|
}
|
|
915
991
|
} catch (e) {
|
|
916
|
-
if (e.code ===
|
|
917
|
-
const rmCommand = process.platform ===
|
|
918
|
-
throw new Error(
|
|
992
|
+
if (e.code === "ELOCKED") {
|
|
993
|
+
const rmCommand = process.platform === "win32" ? "rm -R" : "rm -rf";
|
|
994
|
+
throw new Error("\n" + (0, import_ascii.wrapInASCIIBox)([
|
|
995
|
+
`An active lockfile is found at:`,
|
|
996
|
+
``,
|
|
997
|
+
` ${lockfilePath}`,
|
|
998
|
+
``,
|
|
999
|
+
`Either:`,
|
|
1000
|
+
`- wait a few minutes if other Playwright is installing browsers in parallel`,
|
|
1001
|
+
`- remove lock manually with:`,
|
|
1002
|
+
``,
|
|
1003
|
+
` ${rmCommand} ${lockfilePath}`,
|
|
1004
|
+
``,
|
|
1005
|
+
`<3 Playwright Team`
|
|
1006
|
+
].join("\n"), 1));
|
|
919
1007
|
} else {
|
|
920
1008
|
throw e;
|
|
921
1009
|
}
|
|
922
1010
|
} finally {
|
|
923
|
-
if (releaseLock)
|
|
1011
|
+
if (releaseLock)
|
|
1012
|
+
await releaseLock();
|
|
924
1013
|
}
|
|
925
1014
|
}
|
|
926
1015
|
async uninstall(all) {
|
|
927
|
-
const linksDir =
|
|
1016
|
+
const linksDir = import_path.default.join(registryDirectory, ".links");
|
|
928
1017
|
if (all) {
|
|
929
|
-
const links = await
|
|
930
|
-
for (const link of links)
|
|
1018
|
+
const links = await import_fs.default.promises.readdir(linksDir).catch(() => []);
|
|
1019
|
+
for (const link of links)
|
|
1020
|
+
await import_fs.default.promises.unlink(import_path.default.join(linksDir, link));
|
|
931
1021
|
} else {
|
|
932
|
-
await
|
|
1022
|
+
await import_fs.default.promises.unlink(import_path.default.join(linksDir, (0, import_utils.calculateSha1)(PACKAGE_PATH))).catch(() => {
|
|
1023
|
+
});
|
|
933
1024
|
}
|
|
934
|
-
|
|
935
|
-
// Remove stale browsers.
|
|
936
1025
|
await this._validateInstallationCache(linksDir);
|
|
937
1026
|
return {
|
|
938
|
-
numberOfBrowsersLeft: (await
|
|
1027
|
+
numberOfBrowsersLeft: (await import_fs.default.promises.readdir(registryDirectory).catch(() => [])).filter((browserDirectory) => isBrowserDirectory(browserDirectory)).length
|
|
939
1028
|
};
|
|
940
1029
|
}
|
|
941
1030
|
async validateHostRequirementsForExecutablesIfNeeded(executables, sdkLanguage) {
|
|
942
|
-
if ((0,
|
|
943
|
-
process.stderr.write(
|
|
1031
|
+
if ((0, import_utils.getAsBooleanFromENV)("PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS")) {
|
|
1032
|
+
process.stderr.write("Skipping host requirements validation logic because `PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS` env variable is set.\n");
|
|
944
1033
|
return;
|
|
945
1034
|
}
|
|
946
|
-
for (const executable of executables)
|
|
1035
|
+
for (const executable of executables)
|
|
1036
|
+
await this._validateHostRequirementsForExecutableIfNeeded(executable, sdkLanguage);
|
|
947
1037
|
}
|
|
948
1038
|
async _validateHostRequirementsForExecutableIfNeeded(executable, sdkLanguage) {
|
|
949
|
-
const kMaximumReValidationPeriod = 30 * 24 * 60 * 60 *
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
const markerFile =
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
1039
|
+
const kMaximumReValidationPeriod = 30 * 24 * 60 * 60 * 1e3;
|
|
1040
|
+
if (!executable.directory)
|
|
1041
|
+
return;
|
|
1042
|
+
const markerFile = import_path.default.join(executable.directory, "DEPENDENCIES_VALIDATED");
|
|
1043
|
+
if (await import_fs.default.promises.stat(markerFile).then((stat) => Date.now() - stat.mtime.getTime() < kMaximumReValidationPeriod).catch(() => false))
|
|
1044
|
+
return;
|
|
1045
|
+
import_debugLogger.debugLogger.log("install", `validating host requirements for "${executable.name}"`);
|
|
956
1046
|
try {
|
|
957
1047
|
await executable._validateHostRequirements(sdkLanguage);
|
|
958
|
-
|
|
1048
|
+
import_debugLogger.debugLogger.log("install", `validation passed for ${executable.name}`);
|
|
959
1049
|
} catch (error) {
|
|
960
|
-
|
|
1050
|
+
import_debugLogger.debugLogger.log("install", `validation failed for ${executable.name}`);
|
|
961
1051
|
throw error;
|
|
962
1052
|
}
|
|
963
|
-
await
|
|
1053
|
+
await import_fs.default.promises.writeFile(markerFile, "").catch(() => {
|
|
1054
|
+
});
|
|
964
1055
|
}
|
|
965
1056
|
_downloadURLs(descriptor) {
|
|
966
1057
|
const paths = DOWNLOAD_PATHS[descriptor.name];
|
|
967
|
-
const downloadPathTemplate = paths[
|
|
968
|
-
if (!downloadPathTemplate)
|
|
1058
|
+
const downloadPathTemplate = paths[import_hostPlatform.hostPlatform] || paths["<unknown>"];
|
|
1059
|
+
if (!downloadPathTemplate)
|
|
1060
|
+
return [];
|
|
969
1061
|
const downloadPath = util.format(downloadPathTemplate, descriptor.revision);
|
|
970
|
-
let downloadURLs = PLAYWRIGHT_CDN_MIRRORS.map(mirror => `${mirror}/${downloadPath}`);
|
|
1062
|
+
let downloadURLs = PLAYWRIGHT_CDN_MIRRORS.map((mirror) => `${mirror}/${downloadPath}`);
|
|
971
1063
|
let downloadHostEnv;
|
|
972
|
-
if (descriptor.name.startsWith(
|
|
973
|
-
|
|
974
|
-
if (
|
|
1064
|
+
if (descriptor.name.startsWith("chromium"))
|
|
1065
|
+
downloadHostEnv = "PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST";
|
|
1066
|
+
else if (descriptor.name.startsWith("firefox"))
|
|
1067
|
+
downloadHostEnv = "PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST";
|
|
1068
|
+
else if (descriptor.name.startsWith("webkit"))
|
|
1069
|
+
downloadHostEnv = "PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST";
|
|
1070
|
+
const customHostOverride = downloadHostEnv && (0, import_utils.getFromENV)(downloadHostEnv) || (0, import_utils.getFromENV)("PLAYWRIGHT_DOWNLOAD_HOST");
|
|
1071
|
+
if (customHostOverride)
|
|
1072
|
+
downloadURLs = [`${customHostOverride}/${downloadPath}`];
|
|
975
1073
|
return downloadURLs;
|
|
976
1074
|
}
|
|
977
1075
|
async _downloadExecutable(descriptor, executablePath) {
|
|
978
1076
|
const downloadURLs = this._downloadURLs(descriptor);
|
|
979
|
-
if (!downloadURLs.length)
|
|
980
|
-
|
|
1077
|
+
if (!downloadURLs.length)
|
|
1078
|
+
throw new Error(`ERROR: Playwright does not support ${descriptor.name} on ${import_hostPlatform.hostPlatform}`);
|
|
1079
|
+
if (!import_hostPlatform.isOfficiallySupportedPlatform)
|
|
1080
|
+
(0, import_browserFetcher.logPolitely)(`BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ${import_hostPlatform.hostPlatform}.`);
|
|
981
1081
|
if (descriptor.hasRevisionOverride) {
|
|
982
|
-
const message = `You are using a frozen ${descriptor.name} browser which does not receive updates anymore on ${
|
|
983
|
-
if (process.env.GITHUB_ACTIONS)
|
|
984
|
-
|
|
1082
|
+
const message = `You are using a frozen ${descriptor.name} browser which does not receive updates anymore on ${import_hostPlatform.hostPlatform}. Please update to the latest version of your operating system to test up-to-date browsers.`;
|
|
1083
|
+
if (process.env.GITHUB_ACTIONS)
|
|
1084
|
+
console.log(`::warning title=Playwright::${message}`);
|
|
1085
|
+
else
|
|
1086
|
+
(0, import_browserFetcher.logPolitely)(message);
|
|
985
1087
|
}
|
|
986
|
-
const displayName = descriptor.name.split(
|
|
987
|
-
return word ===
|
|
988
|
-
}).join(
|
|
1088
|
+
const displayName = descriptor.name.split("-").map((word) => {
|
|
1089
|
+
return word === "ffmpeg" ? "FFMPEG" : word.charAt(0).toUpperCase() + word.slice(1);
|
|
1090
|
+
}).join(" ");
|
|
989
1091
|
const title = descriptor.browserVersion ? `${displayName} ${descriptor.browserVersion} (playwright build v${descriptor.revision})` : `${displayName} playwright build v${descriptor.revision}`;
|
|
990
|
-
const downloadFileName = `playwright-download-${descriptor.name}-${
|
|
991
|
-
const
|
|
992
|
-
const
|
|
993
|
-
await (0,
|
|
994
|
-
throw new Error(`Failed to download ${title}, caused by
|
|
1092
|
+
const downloadFileName = `playwright-download-${descriptor.name}-${import_hostPlatform.hostPlatform}-${descriptor.revision}.zip`;
|
|
1093
|
+
const downloadSocketTimeoutEnv = (0, import_utils.getFromENV)("PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT");
|
|
1094
|
+
const downloadSocketTimeout = +(downloadSocketTimeoutEnv || "0") || 3e4;
|
|
1095
|
+
await (0, import_browserFetcher.downloadBrowserWithProgressBar)(title, descriptor.dir, executablePath, downloadURLs, downloadFileName, downloadSocketTimeout).catch((e) => {
|
|
1096
|
+
throw new Error(`Failed to download ${title}, caused by
|
|
1097
|
+
${e.stack}`);
|
|
995
1098
|
});
|
|
996
1099
|
}
|
|
997
1100
|
async _installMSEdgeChannel(channel, scripts) {
|
|
998
1101
|
const scriptArgs = [];
|
|
999
|
-
if (process.platform !==
|
|
1000
|
-
const products = lowercaseAllKeys(JSON.parse(await (0,
|
|
1001
|
-
url: 'https://edgeupdates.microsoft.com/api/products'
|
|
1002
|
-
})));
|
|
1102
|
+
if (process.platform !== "linux") {
|
|
1103
|
+
const products = lowercaseAllKeys(JSON.parse(await (0, import_network.fetchData)({ url: "https://edgeupdates.microsoft.com/api/products" })));
|
|
1003
1104
|
const productName = {
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1105
|
+
"msedge": "Stable",
|
|
1106
|
+
"msedge-beta": "Beta",
|
|
1107
|
+
"msedge-dev": "Dev"
|
|
1007
1108
|
}[channel];
|
|
1008
|
-
const product = products.find(
|
|
1109
|
+
const product = products.find((product2) => product2.product === productName);
|
|
1009
1110
|
const searchConfig = {
|
|
1010
|
-
darwin: {
|
|
1011
|
-
|
|
1012
|
-
arch: 'universal',
|
|
1013
|
-
artifact: 'pkg'
|
|
1014
|
-
},
|
|
1015
|
-
win32: {
|
|
1016
|
-
platform: 'Windows',
|
|
1017
|
-
arch: 'x64',
|
|
1018
|
-
artifact: 'msi'
|
|
1019
|
-
}
|
|
1111
|
+
darwin: { platform: "MacOS", arch: "universal", artifact: "pkg" },
|
|
1112
|
+
win32: { platform: "Windows", arch: "x64", artifact: "msi" }
|
|
1020
1113
|
}[process.platform];
|
|
1021
|
-
const release = searchConfig ? product.releases.find(
|
|
1022
|
-
const artifact = release ? release.artifacts.find(
|
|
1023
|
-
if (artifact)
|
|
1114
|
+
const release = searchConfig ? product.releases.find((release2) => release2.platform === searchConfig.platform && release2.architecture === searchConfig.arch && release2.artifacts.length > 0) : null;
|
|
1115
|
+
const artifact = release ? release.artifacts.find((artifact2) => artifact2.artifactname === searchConfig.artifact) : null;
|
|
1116
|
+
if (artifact)
|
|
1117
|
+
scriptArgs.push(
|
|
1118
|
+
artifact.location
|
|
1119
|
+
/* url */
|
|
1120
|
+
);
|
|
1121
|
+
else
|
|
1122
|
+
throw new Error(`Cannot install ${channel} on ${process.platform}`);
|
|
1024
1123
|
}
|
|
1025
1124
|
await this._installChromiumChannel(channel, scripts, scriptArgs);
|
|
1026
1125
|
}
|
|
1027
1126
|
async _installChromiumChannel(channel, scripts, scriptArgs = []) {
|
|
1028
1127
|
const scriptName = scripts[process.platform];
|
|
1029
|
-
if (!scriptName)
|
|
1128
|
+
if (!scriptName)
|
|
1129
|
+
throw new Error(`Cannot install ${channel} on ${process.platform}`);
|
|
1030
1130
|
const cwd = BIN_PATH;
|
|
1031
|
-
const isPowerShell = scriptName.endsWith(
|
|
1131
|
+
const isPowerShell = scriptName.endsWith(".ps1");
|
|
1032
1132
|
if (isPowerShell) {
|
|
1033
|
-
const args = [
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1133
|
+
const args = [
|
|
1134
|
+
"-ExecutionPolicy",
|
|
1135
|
+
"Bypass",
|
|
1136
|
+
"-File",
|
|
1137
|
+
import_path.default.join(BIN_PATH, scriptName),
|
|
1138
|
+
...scriptArgs
|
|
1139
|
+
];
|
|
1140
|
+
const { code } = await (0, import_spawnAsync.spawnAsync)("powershell.exe", args, { cwd, stdio: "inherit" });
|
|
1141
|
+
if (code !== 0)
|
|
1142
|
+
throw new Error(`Failed to install ${channel}`);
|
|
1041
1143
|
} else {
|
|
1042
|
-
const {
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
const {
|
|
1049
|
-
code
|
|
1050
|
-
} = await (0, _spawnAsync.spawnAsync)(command, args, {
|
|
1051
|
-
cwd,
|
|
1052
|
-
stdio: 'inherit'
|
|
1053
|
-
});
|
|
1054
|
-
if (code !== 0) throw new Error(`Failed to install ${channel}`);
|
|
1144
|
+
const { command, args, elevatedPermissions } = await (0, import_dependencies.transformCommandsForRoot)([`bash "${import_path.default.join(BIN_PATH, scriptName)}" ${scriptArgs.join("")}`]);
|
|
1145
|
+
if (elevatedPermissions)
|
|
1146
|
+
console.log("Switching to root user to install dependencies...");
|
|
1147
|
+
const { code } = await (0, import_spawnAsync.spawnAsync)(command, args, { cwd, stdio: "inherit" });
|
|
1148
|
+
if (code !== 0)
|
|
1149
|
+
throw new Error(`Failed to install ${channel}`);
|
|
1055
1150
|
}
|
|
1056
1151
|
}
|
|
1057
1152
|
async _validateInstallationCache(linksDir) {
|
|
1058
|
-
|
|
1059
|
-
const
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
let linkTarget = '';
|
|
1153
|
+
const usedBrowserPaths = /* @__PURE__ */ new Set();
|
|
1154
|
+
for (const fileName of await import_fs.default.promises.readdir(linksDir)) {
|
|
1155
|
+
const linkPath = import_path.default.join(linksDir, fileName);
|
|
1156
|
+
let linkTarget = "";
|
|
1063
1157
|
try {
|
|
1064
|
-
linkTarget = (await
|
|
1065
|
-
const browsersJSON = require(
|
|
1158
|
+
linkTarget = (await import_fs.default.promises.readFile(linkPath)).toString();
|
|
1159
|
+
const browsersJSON = require(import_path.default.join(linkTarget, "browsers.json"));
|
|
1066
1160
|
const descriptors = readDescriptors(browsersJSON);
|
|
1067
1161
|
for (const browserName of allDownloadable) {
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
// to retain and download browsers.
|
|
1072
|
-
// As of v1.10, we decided to abandon "download" field.
|
|
1073
|
-
const descriptor = descriptors.find(d => d.name === browserName);
|
|
1074
|
-
if (!descriptor) continue;
|
|
1162
|
+
const descriptor = descriptors.find((d) => d.name === browserName);
|
|
1163
|
+
if (!descriptor)
|
|
1164
|
+
continue;
|
|
1075
1165
|
const usedBrowserPath = descriptor.dir;
|
|
1076
1166
|
const browserRevision = parseInt(descriptor.revision, 10);
|
|
1077
|
-
//
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
browserName !== 'firefox' && browserName !== 'chromium' && browserName !== 'webkit';
|
|
1082
|
-
if (!shouldHaveMarkerFile || (await (0, _fileUtils.existsAsync)(browserDirectoryToMarkerFilePath(usedBrowserPath)))) usedBrowserPaths.add(usedBrowserPath);
|
|
1167
|
+
const shouldHaveMarkerFile = browserName === "chromium" && (browserRevision >= 786218 || browserRevision < 3e5) || browserName === "firefox" && browserRevision >= 1128 || browserName === "webkit" && browserRevision >= 1307 || // All new applications have a marker file right away.
|
|
1168
|
+
browserName !== "firefox" && browserName !== "chromium" && browserName !== "webkit";
|
|
1169
|
+
if (!shouldHaveMarkerFile || await (0, import_fileUtils.existsAsync)(browserDirectoryToMarkerFilePath(usedBrowserPath)))
|
|
1170
|
+
usedBrowserPaths.add(usedBrowserPath);
|
|
1083
1171
|
}
|
|
1084
1172
|
} catch (e) {
|
|
1085
|
-
await
|
|
1173
|
+
await import_fs.default.promises.unlink(linkPath).catch((e2) => {
|
|
1174
|
+
});
|
|
1086
1175
|
}
|
|
1087
1176
|
}
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
let downloadedBrowsers = (await _fs.default.promises.readdir(registryDirectory)).map(file => _path.default.join(registryDirectory, file));
|
|
1092
|
-
downloadedBrowsers = downloadedBrowsers.filter(file => isBrowserDirectory(file));
|
|
1177
|
+
if (!(0, import_utils.getAsBooleanFromENV)("PLAYWRIGHT_SKIP_BROWSER_GC")) {
|
|
1178
|
+
let downloadedBrowsers = (await import_fs.default.promises.readdir(registryDirectory)).map((file) => import_path.default.join(registryDirectory, file));
|
|
1179
|
+
downloadedBrowsers = downloadedBrowsers.filter((file) => isBrowserDirectory(file));
|
|
1093
1180
|
const directories = new Set(downloadedBrowsers);
|
|
1094
|
-
for (const browserDirectory of usedBrowserPaths)
|
|
1095
|
-
|
|
1096
|
-
|
|
1181
|
+
for (const browserDirectory of usedBrowserPaths)
|
|
1182
|
+
directories.delete(browserDirectory);
|
|
1183
|
+
for (const directory of directories)
|
|
1184
|
+
(0, import_browserFetcher.logPolitely)("Removing unused browser at " + directory);
|
|
1185
|
+
await (0, import_fileUtils.removeFolders)([...directories]);
|
|
1097
1186
|
}
|
|
1098
1187
|
}
|
|
1099
1188
|
}
|
|
1100
|
-
exports.Registry = Registry;
|
|
1101
1189
|
function browserDirectoryToMarkerFilePath(browserDirectory) {
|
|
1102
|
-
return
|
|
1190
|
+
return import_path.default.join(browserDirectory, "INSTALLATION_COMPLETE");
|
|
1103
1191
|
}
|
|
1104
1192
|
function buildPlaywrightCLICommand(sdkLanguage, parameters) {
|
|
1105
1193
|
switch (sdkLanguage) {
|
|
1106
|
-
case
|
|
1194
|
+
case "python":
|
|
1107
1195
|
return `playwright ${parameters}`;
|
|
1108
|
-
case
|
|
1196
|
+
case "java":
|
|
1109
1197
|
return `mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="${parameters}"`;
|
|
1110
|
-
case
|
|
1198
|
+
case "csharp":
|
|
1111
1199
|
return `pwsh bin/Debug/netX/playwright.ps1 ${parameters}`;
|
|
1112
|
-
default:
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
}
|
|
1200
|
+
default: {
|
|
1201
|
+
const packageManagerCommand = (0, import_utils.getPackageManagerExecCommand)();
|
|
1202
|
+
return `${packageManagerCommand} playwright ${parameters}`;
|
|
1203
|
+
}
|
|
1117
1204
|
}
|
|
1118
1205
|
}
|
|
1119
1206
|
async function installBrowsersForNpmInstall(browsers) {
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
(0, _browserFetcher.logPolitely)('Skipping browsers download because `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD` env variable is set');
|
|
1207
|
+
if ((0, import_utils.getAsBooleanFromENV)("PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD")) {
|
|
1208
|
+
(0, import_browserFetcher.logPolitely)("Skipping browsers download because `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD` env variable is set");
|
|
1123
1209
|
return false;
|
|
1124
1210
|
}
|
|
1125
1211
|
const executables = [];
|
|
1126
|
-
if (process.platform ===
|
|
1212
|
+
if (process.platform === "win32")
|
|
1213
|
+
executables.push(registry.findExecutable("winldd"));
|
|
1127
1214
|
for (const browserName of browsers) {
|
|
1128
1215
|
const executable = registry.findExecutable(browserName);
|
|
1129
|
-
if (!executable || executable.installType ===
|
|
1216
|
+
if (!executable || executable.installType === "none")
|
|
1217
|
+
throw new Error(`Cannot install ${browserName}`);
|
|
1130
1218
|
executables.push(executable);
|
|
1131
1219
|
}
|
|
1132
|
-
await registry.install(
|
|
1220
|
+
await registry.install(
|
|
1221
|
+
executables,
|
|
1222
|
+
false
|
|
1223
|
+
/* forceReinstall */
|
|
1224
|
+
);
|
|
1133
1225
|
}
|
|
1134
1226
|
function findChromiumChannel(sdkLanguage) {
|
|
1135
|
-
// Fall back to the stable channels of popular vendors to work out of the box.
|
|
1136
|
-
// Null means no installation and no channels found.
|
|
1137
1227
|
let channel = null;
|
|
1138
|
-
for (const name of [
|
|
1228
|
+
for (const name of ["chromium", "chrome", "msedge"]) {
|
|
1139
1229
|
try {
|
|
1140
1230
|
registry.findExecutable(name).executablePathOrDie(sdkLanguage);
|
|
1141
|
-
channel = name ===
|
|
1231
|
+
channel = name === "chromium" ? void 0 : name;
|
|
1142
1232
|
break;
|
|
1143
|
-
} catch (e) {
|
|
1233
|
+
} catch (e) {
|
|
1234
|
+
}
|
|
1144
1235
|
}
|
|
1145
1236
|
if (channel === null) {
|
|
1146
1237
|
const installCommand = buildPlaywrightCLICommand(sdkLanguage, `install chromium`);
|
|
1147
|
-
const prettyMessage = [
|
|
1148
|
-
|
|
1238
|
+
const prettyMessage = [
|
|
1239
|
+
`No chromium-based browser found on the system.`,
|
|
1240
|
+
`Please run the following command to download one:`,
|
|
1241
|
+
``,
|
|
1242
|
+
` ${installCommand}`,
|
|
1243
|
+
``,
|
|
1244
|
+
`<3 Playwright Team`
|
|
1245
|
+
].join("\n");
|
|
1246
|
+
throw new Error("\n" + (0, import_ascii.wrapInASCIIBox)(prettyMessage, 1));
|
|
1149
1247
|
}
|
|
1150
1248
|
return channel;
|
|
1151
1249
|
}
|
|
1152
1250
|
function lowercaseAllKeys(json) {
|
|
1153
|
-
if (typeof json !==
|
|
1154
|
-
|
|
1251
|
+
if (typeof json !== "object" || !json)
|
|
1252
|
+
return json;
|
|
1253
|
+
if (Array.isArray(json))
|
|
1254
|
+
return json.map(lowercaseAllKeys);
|
|
1155
1255
|
const result = {};
|
|
1156
|
-
for (const [key, value] of Object.entries(json))
|
|
1256
|
+
for (const [key, value] of Object.entries(json))
|
|
1257
|
+
result[key.toLowerCase()] = lowercaseAllKeys(value);
|
|
1157
1258
|
return result;
|
|
1158
1259
|
}
|
|
1159
|
-
const registry =
|
|
1260
|
+
const registry = new Registry(require("../../../browsers.json"));
|
|
1261
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1262
|
+
0 && (module.exports = {
|
|
1263
|
+
Registry,
|
|
1264
|
+
browserDirectoryToMarkerFilePath,
|
|
1265
|
+
buildPlaywrightCLICommand,
|
|
1266
|
+
findChromiumChannel,
|
|
1267
|
+
installBrowsersForNpmInstall,
|
|
1268
|
+
registry,
|
|
1269
|
+
registryDirectory,
|
|
1270
|
+
writeDockerVersion
|
|
1271
|
+
});
|