UNPKG

brave-real-playwright-core

Version:

Brave-optimized Playwright Core (v1.55.0) with comprehensive stealth patches and error stack sanitization

956 lines 66.6 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var registry_exports = {}; __export(registry_exports, { Registry: () => Registry, browserDirectoryToMarkerFilePath: () => browserDirectoryToMarkerFilePath, buildPlaywrightCLICommand: () => buildPlaywrightCLICommand, findChromiumChannelBestEffort: () => findChromiumChannelBestEffort, installBrowsersForNpmInstall: () => installBrowsersForNpmInstall, registry: () => registry, registryDirectory: () => registryDirectory, writeDockerVersion: () => import_dependencies3.writeDockerVersion }); module.exports = __toCommonJS(registry_exports); var import_fs = __toESM(require("fs")); var import_os = __toESM(require("os")); var import_path = __toESM(require("path")); var util = __toESM(require("util")); var import_browserFetcher = require("./browserFetcher"); var import_dependencies = require("./dependencies"); var import_dependencies2 = require("./dependencies"); var import_utils = require("../../utils"); var import_ascii = require("../utils/ascii"); var import_debugLogger = require("../utils/debugLogger"); var import_hostPlatform = require("../utils/hostPlatform"); var import_network = require("../utils/network"); var import_spawnAsync = require("../utils/spawnAsync"); var import_userAgent = require("../utils/userAgent"); var import_utilsBundle = require("../../utilsBundle"); var import_fileUtils = require("../utils/fileUtils"); var import_dependencies3 = require("./dependencies"); const PACKAGE_PATH = import_path.default.join(__dirname, "..", "..", ".."); const BIN_PATH = import_path.default.join(__dirname, "..", "..", "..", "bin"); const PLAYWRIGHT_CDN_MIRRORS = [ "https://cdn.playwright.dev/dbazure/download/playwright", // ESRP CDN "https://playwright.download.prss.microsoft.com/dbazure/download/playwright", // Directly hit ESRP CDN "https://cdn.playwright.dev" // Hit the Storage Bucket directly ]; if (process.env.PW_TEST_CDN_THAT_SHOULD_WORK) { for (let i = 0; i < PLAYWRIGHT_CDN_MIRRORS.length; i++) { const cdn = PLAYWRIGHT_CDN_MIRRORS[i]; if (cdn !== process.env.PW_TEST_CDN_THAT_SHOULD_WORK) { const parsedCDN = new URL(cdn); parsedCDN.hostname = parsedCDN.hostname + ".does-not-resolve.playwright.dev"; PLAYWRIGHT_CDN_MIRRORS[i] = parsedCDN.toString(); } } } const EXECUTABLE_PATHS = { "chromium": { "linux": ["chrome-linux", "chrome"], "mac": ["chrome-mac", "Chromium.app", "Contents", "MacOS", "Chromium"], "win": ["chrome-win", "chrome.exe"] }, "chromium-headless-shell": { "linux": ["chrome-linux", "headless_shell"], "mac": ["chrome-mac", "headless_shell"], "win": ["chrome-win", "headless_shell.exe"] }, "firefox": { "linux": ["firefox", "firefox"], "mac": ["firefox", "Nightly.app", "Contents", "MacOS", "firefox"], "win": ["firefox", "firefox.exe"] }, "webkit": { "linux": ["pw_run.sh"], "mac": ["pw_run.sh"], "win": ["Playwright.exe"] }, "ffmpeg": { "linux": ["ffmpeg-linux"], "mac": ["ffmpeg-mac"], "win": ["ffmpeg-win64.exe"] }, "winldd": { "linux": void 0, "mac": void 0, "win": ["PrintDeps.exe"] } }; const DOWNLOAD_PATHS = { "chromium": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/chromium/%s/chromium-linux.zip", "ubuntu22.04-x64": "builds/chromium/%s/chromium-linux.zip", "ubuntu24.04-x64": "builds/chromium/%s/chromium-linux.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", "ubuntu22.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", "ubuntu24.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", "debian11-x64": "builds/chromium/%s/chromium-linux.zip", "debian11-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", "debian12-x64": "builds/chromium/%s/chromium-linux.zip", "debian12-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", "debian13-x64": "builds/chromium/%s/chromium-linux.zip", "debian13-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", "mac10.13": "builds/chromium/%s/chromium-mac.zip", "mac10.14": "builds/chromium/%s/chromium-mac.zip", "mac10.15": "builds/chromium/%s/chromium-mac.zip", "mac11": "builds/chromium/%s/chromium-mac.zip", "mac11-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", "mac12": "builds/chromium/%s/chromium-mac.zip", "mac12-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", "mac13": "builds/chromium/%s/chromium-mac.zip", "mac13-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", "mac14": "builds/chromium/%s/chromium-mac.zip", "mac14-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", "mac15": "builds/chromium/%s/chromium-mac.zip", "mac15-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", "win64": "builds/chromium/%s/chromium-win64.zip" }, "chromium-headless-shell": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", "ubuntu22.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", "ubuntu24.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", "ubuntu22.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", "ubuntu24.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", "debian11-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", "debian11-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", "debian12-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", "debian12-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", "debian13-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", "debian13-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", "mac10.13": void 0, "mac10.14": void 0, "mac10.15": void 0, "mac11": "builds/chromium/%s/chromium-headless-shell-mac.zip", "mac11-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", "mac12": "builds/chromium/%s/chromium-headless-shell-mac.zip", "mac12-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", "mac13": "builds/chromium/%s/chromium-headless-shell-mac.zip", "mac13-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", "mac14": "builds/chromium/%s/chromium-headless-shell-mac.zip", "mac14-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", "mac15": "builds/chromium/%s/chromium-headless-shell-mac.zip", "mac15-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", "win64": "builds/chromium/%s/chromium-headless-shell-win64.zip" }, "chromium-tip-of-tree": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", "ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", "ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", "ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", "ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", "debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", "debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", "debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", "debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", "debian13-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", "debian13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", "mac10.13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac10.14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac10.15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", "mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", "mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", "mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", "mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", "mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", "win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-win64.zip" }, "chromium-tip-of-tree-headless-shell": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", "ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", "ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", "ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", "ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", "debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", "debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", "debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", "debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", "debian13-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", "debian13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", "mac10.13": void 0, "mac10.14": void 0, "mac10.15": void 0, "mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", "mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", "mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", "mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", "mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", "mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", "mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", "mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", "mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", "mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", "win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-win64.zip" }, "firefox": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/firefox/%s/firefox-ubuntu-20.04.zip", "ubuntu22.04-x64": "builds/firefox/%s/firefox-ubuntu-22.04.zip", "ubuntu24.04-x64": "builds/firefox/%s/firefox-ubuntu-24.04.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/firefox/%s/firefox-ubuntu-20.04-arm64.zip", "ubuntu22.04-arm64": "builds/firefox/%s/firefox-ubuntu-22.04-arm64.zip", "ubuntu24.04-arm64": "builds/firefox/%s/firefox-ubuntu-24.04-arm64.zip", "debian11-x64": "builds/firefox/%s/firefox-debian-11.zip", "debian11-arm64": "builds/firefox/%s/firefox-debian-11-arm64.zip", "debian12-x64": "builds/firefox/%s/firefox-debian-12.zip", "debian12-arm64": "builds/firefox/%s/firefox-debian-12-arm64.zip", "debian13-x64": "builds/firefox/%s/firefox-debian-13.zip", "debian13-arm64": "builds/firefox/%s/firefox-debian-13-arm64.zip", "mac10.13": "builds/firefox/%s/firefox-mac.zip", "mac10.14": "builds/firefox/%s/firefox-mac.zip", "mac10.15": "builds/firefox/%s/firefox-mac.zip", "mac11": "builds/firefox/%s/firefox-mac.zip", "mac11-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", "mac12": "builds/firefox/%s/firefox-mac.zip", "mac12-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", "mac13": "builds/firefox/%s/firefox-mac.zip", "mac13-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", "mac14": "builds/firefox/%s/firefox-mac.zip", "mac14-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", "mac15": "builds/firefox/%s/firefox-mac.zip", "mac15-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", "win64": "builds/firefox/%s/firefox-win64.zip" }, "firefox-beta": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-20.04.zip", "ubuntu22.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-22.04.zip", "ubuntu24.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-24.04.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": void 0, "ubuntu22.04-arm64": "builds/firefox-beta/%s/firefox-beta-ubuntu-22.04-arm64.zip", "ubuntu24.04-arm64": "builds/firefox-beta/%s/firefox-beta-ubuntu-24.04-arm64.zip", "debian11-x64": "builds/firefox-beta/%s/firefox-beta-debian-11.zip", "debian11-arm64": "builds/firefox-beta/%s/firefox-beta-debian-11-arm64.zip", "debian12-x64": "builds/firefox-beta/%s/firefox-beta-debian-12.zip", "debian12-arm64": "builds/firefox-beta/%s/firefox-beta-debian-12-arm64.zip", "debian13-x64": "builds/firefox-beta/%s/firefox-beta-debian-12.zip", "debian13-arm64": "builds/firefox-beta/%s/firefox-beta-debian-12-arm64.zip", "mac10.13": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac10.14": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac10.15": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac11": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac11-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", "mac12": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac12-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", "mac13": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac13-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", "mac14": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac14-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", "mac15": "builds/firefox-beta/%s/firefox-beta-mac.zip", "mac15-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", "win64": "builds/firefox-beta/%s/firefox-beta-win64.zip" }, "webkit": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/webkit/%s/webkit-ubuntu-20.04.zip", "ubuntu22.04-x64": "builds/webkit/%s/webkit-ubuntu-22.04.zip", "ubuntu24.04-x64": "builds/webkit/%s/webkit-ubuntu-24.04.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/webkit/%s/webkit-ubuntu-20.04-arm64.zip", "ubuntu22.04-arm64": "builds/webkit/%s/webkit-ubuntu-22.04-arm64.zip", "ubuntu24.04-arm64": "builds/webkit/%s/webkit-ubuntu-24.04-arm64.zip", "debian11-x64": "builds/webkit/%s/webkit-debian-11.zip", "debian11-arm64": "builds/webkit/%s/webkit-debian-11-arm64.zip", "debian12-x64": "builds/webkit/%s/webkit-debian-12.zip", "debian12-arm64": "builds/webkit/%s/webkit-debian-12-arm64.zip", "debian13-x64": "builds/webkit/%s/webkit-debian-13.zip", "debian13-arm64": "builds/webkit/%s/webkit-debian-13-arm64.zip", "mac10.13": void 0, "mac10.14": "builds/deprecated-webkit-mac-10.14/%s/deprecated-webkit-mac-10.14.zip", "mac10.15": "builds/deprecated-webkit-mac-10.15/%s/deprecated-webkit-mac-10.15.zip", "mac11": "builds/webkit/%s/webkit-mac-11.zip", "mac11-arm64": "builds/webkit/%s/webkit-mac-11-arm64.zip", "mac12": "builds/webkit/%s/webkit-mac-12.zip", "mac12-arm64": "builds/webkit/%s/webkit-mac-12-arm64.zip", "mac13": "builds/webkit/%s/webkit-mac-13.zip", "mac13-arm64": "builds/webkit/%s/webkit-mac-13-arm64.zip", "mac14": "builds/webkit/%s/webkit-mac-14.zip", "mac14-arm64": "builds/webkit/%s/webkit-mac-14-arm64.zip", "mac15": "builds/webkit/%s/webkit-mac-15.zip", "mac15-arm64": "builds/webkit/%s/webkit-mac-15-arm64.zip", "win64": "builds/webkit/%s/webkit-win64.zip" }, "ffmpeg": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", "ubuntu22.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", "ubuntu24.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", "ubuntu22.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", "ubuntu24.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", "debian11-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", "debian11-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", "debian12-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", "debian12-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", "debian13-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", "debian13-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", "mac10.13": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac10.14": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac10.15": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac11": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac11-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", "mac12": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac12-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", "mac13": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac13-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", "mac14": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac14-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", "mac15": "builds/ffmpeg/%s/ffmpeg-mac.zip", "mac15-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", "win64": "builds/ffmpeg/%s/ffmpeg-win64.zip" }, "winldd": { "<unknown>": void 0, "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": void 0, "ubuntu22.04-x64": void 0, "ubuntu24.04-x64": void 0, "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": void 0, "ubuntu22.04-arm64": void 0, "ubuntu24.04-arm64": void 0, "debian11-x64": void 0, "debian11-arm64": void 0, "debian12-x64": void 0, "debian12-arm64": void 0, "debian13-x64": void 0, "debian13-arm64": void 0, "mac10.13": void 0, "mac10.14": void 0, "mac10.15": void 0, "mac11": void 0, "mac11-arm64": void 0, "mac12": void 0, "mac12-arm64": void 0, "mac13": void 0, "mac13-arm64": void 0, "mac14": void 0, "mac14-arm64": void 0, "mac15": void 0, "mac15-arm64": void 0, "win64": "builds/winldd/%s/winldd-win64.zip" }, "android": { "<unknown>": "builds/android/%s/android.zip", "ubuntu18.04-x64": void 0, "ubuntu20.04-x64": "builds/android/%s/android.zip", "ubuntu22.04-x64": "builds/android/%s/android.zip", "ubuntu24.04-x64": "builds/android/%s/android.zip", "ubuntu18.04-arm64": void 0, "ubuntu20.04-arm64": "builds/android/%s/android.zip", "ubuntu22.04-arm64": "builds/android/%s/android.zip", "ubuntu24.04-arm64": "builds/android/%s/android.zip", "debian11-x64": "builds/android/%s/android.zip", "debian11-arm64": "builds/android/%s/android.zip", "debian12-x64": "builds/android/%s/android.zip", "debian12-arm64": "builds/android/%s/android.zip", "debian13-x64": "builds/android/%s/android.zip", "debian13-arm64": "builds/android/%s/android.zip", "mac10.13": "builds/android/%s/android.zip", "mac10.14": "builds/android/%s/android.zip", "mac10.15": "builds/android/%s/android.zip", "mac11": "builds/android/%s/android.zip", "mac11-arm64": "builds/android/%s/android.zip", "mac12": "builds/android/%s/android.zip", "mac12-arm64": "builds/android/%s/android.zip", "mac13": "builds/android/%s/android.zip", "mac13-arm64": "builds/android/%s/android.zip", "mac14": "builds/android/%s/android.zip", "mac14-arm64": "builds/android/%s/android.zip", "mac15": "builds/android/%s/android.zip", "mac15-arm64": "builds/android/%s/android.zip", "win64": "builds/android/%s/android.zip" }, // TODO(bidi): implement downloads. "_bidiFirefox": {}, "_bidiChromium": {} }; const registryDirectory = (() => { let result; const envDefined = (0, import_utils.getFromENV)("PLAYWRIGHT_BROWSERS_PATH"); if (envDefined === "0") { result = import_path.default.join(__dirname, "..", "..", "..", ".local-browsers"); } else if (envDefined) { result = envDefined; } else { let cacheDirectory; if (process.platform === "linux") cacheDirectory = process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache"); else if (process.platform === "darwin") cacheDirectory = import_path.default.join(import_os.default.homedir(), "Library", "Caches"); else if (process.platform === "win32") cacheDirectory = process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"); else throw new Error("Unsupported platform: " + process.platform); result = import_path.default.join(cacheDirectory, "ms-playwright"); } if (!import_path.default.isAbsolute(result)) { result = import_path.default.resolve((0, import_utils.getFromENV)("INIT_CWD") || process.cwd(), result); } return result; })(); function isBrowserDirectory(browserDirectory) { const baseName = import_path.default.basename(browserDirectory); for (const browserName of allDownloadable) { if (baseName.startsWith(browserName.replace(/-/g, "_") + "-")) return true; } return false; } function readDescriptors(browsersJSON) { return browsersJSON["browsers"].map((obj) => { const name = obj.name; const revisionOverride = (obj.revisionOverrides || {})[import_hostPlatform.hostPlatform]; const revision = revisionOverride || obj.revision; const browserDirectoryPrefix = revisionOverride ? `${name}_${import_hostPlatform.hostPlatform}_special` : `${name}`; const descriptor = { name, revision, hasRevisionOverride: !!revisionOverride, // We only put browser version for the supported operating systems. browserVersion: revisionOverride ? void 0 : obj.browserVersion, installByDefault: !!obj.installByDefault, // Method `isBrowserDirectory` determines directory to be browser iff // it starts with some browser name followed by '-'. Some browser names // are prefixes of others, e.g. 'webkit' is a prefix of `webkit-technology-preview`. // To avoid older registries erroneously removing 'webkit-technology-preview', we have to // ensure that browser folders to never include dashes inside. dir: import_path.default.join(registryDirectory, browserDirectoryPrefix.replace(/-/g, "_") + "-" + revision) }; return descriptor; }); } const allDownloadable = ["android", "chromium", "firefox", "webkit", "ffmpeg", "firefox-beta", "chromium-tip-of-tree", "chromium-headless-shell", "chromium-tip-of-tree-headless-shell"]; class Registry { constructor(browsersJSON) { const descriptors = readDescriptors(browsersJSON); const findExecutablePath = (dir, name) => { let tokens = void 0; if (process.platform === "linux") tokens = EXECUTABLE_PATHS[name]["linux"]; else if (process.platform === "darwin") tokens = EXECUTABLE_PATHS[name]["mac"]; else if (process.platform === "win32") tokens = EXECUTABLE_PATHS[name]["win"]; return tokens ? import_path.default.join(dir, ...tokens) : void 0; }; const executablePathOrDie = (name, e, installByDefault, sdkLanguage) => { if (!e) throw new Error(`${name} is not supported on ${import_hostPlatform.hostPlatform}`); const installCommand = buildPlaywrightCLICommand(sdkLanguage, `install${installByDefault ? "" : " " + name}`); if (!(0, import_fileUtils.canAccessFile)(e)) { const currentDockerVersion = (0, import_dependencies.readDockerVersionSync)(); const preferredDockerVersion = currentDockerVersion ? (0, import_dependencies.dockerVersion)(currentDockerVersion.dockerImageNameTemplate) : null; const isOutdatedDockerImage = currentDockerVersion && preferredDockerVersion && currentDockerVersion.dockerImageName !== preferredDockerVersion.dockerImageName; const prettyMessage = isOutdatedDockerImage ? [ `Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just updated to ${preferredDockerVersion.driverVersion}.`, `Please update docker image as well.`, `- current: ${currentDockerVersion.dockerImageName}`, `- required: ${preferredDockerVersion.dockerImageName}`, ``, `<3 Playwright Team` ].join("\n") : [ `Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just installed or updated.`, `Please run the following command to download new browser${installByDefault ? "s" : ""}:`, ``, ` ${installCommand}`, ``, `<3 Playwright Team` ].join("\n"); throw new Error(`Executable doesn't exist at ${e} ${(0, import_ascii.wrapInASCIIBox)(prettyMessage, 1)}`); } return e; }; this._executables = []; const chromium = descriptors.find((d) => d.name === "chromium"); const chromiumExecutable = findExecutablePath(chromium.dir, "chromium"); this._executables.push({ type: "browser", name: "chromium", browserName: "chromium", directory: chromium.dir, executablePath: () => chromiumExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumExecutable, chromium.installByDefault, sdkLanguage), installType: chromium.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]), downloadURLs: this._downloadURLs(chromium), browserVersion: chromium.browserVersion, _install: () => this._downloadExecutable(chromium, chromiumExecutable), _dependencyGroup: "chromium", _isHermeticInstallation: true }); const chromiumHeadlessShell = descriptors.find((d) => d.name === "chromium-headless-shell"); const chromiumHeadlessShellExecutable = findExecutablePath(chromiumHeadlessShell.dir, "chromium-headless-shell"); this._executables.push({ type: "channel", name: "chromium-headless-shell", browserName: "chromium", directory: chromiumHeadlessShell.dir, executablePath: () => chromiumHeadlessShellExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumHeadlessShellExecutable, chromiumHeadlessShell.installByDefault, sdkLanguage), installType: chromiumHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]), downloadURLs: this._downloadURLs(chromiumHeadlessShell), browserVersion: chromium.browserVersion, _install: () => this._downloadExecutable(chromiumHeadlessShell, chromiumHeadlessShellExecutable), _dependencyGroup: "chromium", _isHermeticInstallation: true }); const chromiumTipOfTreeHeadlessShell = descriptors.find((d) => d.name === "chromium-tip-of-tree-headless-shell"); const chromiumTipOfTreeHeadlessShellExecutable = findExecutablePath(chromiumTipOfTreeHeadlessShell.dir, "chromium-headless-shell"); this._executables.push({ type: "channel", name: "chromium-tip-of-tree-headless-shell", browserName: "chromium", directory: chromiumTipOfTreeHeadlessShell.dir, executablePath: () => chromiumTipOfTreeHeadlessShellExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumTipOfTreeHeadlessShellExecutable, chromiumTipOfTreeHeadlessShell.installByDefault, sdkLanguage), installType: chromiumTipOfTreeHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTreeHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]), downloadURLs: this._downloadURLs(chromiumTipOfTreeHeadlessShell), browserVersion: chromium.browserVersion, _install: () => this._downloadExecutable(chromiumTipOfTreeHeadlessShell, chromiumTipOfTreeHeadlessShellExecutable), _dependencyGroup: "chromium", _isHermeticInstallation: true }); const chromiumTipOfTree = descriptors.find((d) => d.name === "chromium-tip-of-tree"); const chromiumTipOfTreeExecutable = findExecutablePath(chromiumTipOfTree.dir, "chromium"); this._executables.push({ type: "tool", name: "chromium-tip-of-tree", browserName: "chromium", directory: chromiumTipOfTree.dir, executablePath: () => chromiumTipOfTreeExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium-tip-of-tree", chromiumTipOfTreeExecutable, chromiumTipOfTree.installByDefault, sdkLanguage), installType: chromiumTipOfTree.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTree.dir, ["chrome-linux"], [], ["chrome-win"]), downloadURLs: this._downloadURLs(chromiumTipOfTree), browserVersion: chromiumTipOfTree.browserVersion, _install: () => this._downloadExecutable(chromiumTipOfTree, chromiumTipOfTreeExecutable), _dependencyGroup: "chromium", _isHermeticInstallation: true }); this._executables.push(this._createChromiumChannel("chrome", { "linux": "/opt/google/chrome/chrome", "darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "win32": `\\Google\\Chrome\\Application\\chrome.exe` }, () => this._installChromiumChannel("chrome", { "linux": "reinstall_chrome_stable_linux.sh", "darwin": "reinstall_chrome_stable_mac.sh", "win32": "reinstall_chrome_stable_win.ps1" }))); this._executables.push(this._createChromiumChannel("chrome-beta", { "linux": "/opt/google/chrome-beta/chrome", "darwin": "/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta", "win32": `\\Google\\Chrome Beta\\Application\\chrome.exe` }, () => this._installChromiumChannel("chrome-beta", { "linux": "reinstall_chrome_beta_linux.sh", "darwin": "reinstall_chrome_beta_mac.sh", "win32": "reinstall_chrome_beta_win.ps1" }))); this._executables.push(this._createChromiumChannel("chrome-dev", { "linux": "/opt/google/chrome-unstable/chrome", "darwin": "/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev", "win32": `\\Google\\Chrome Dev\\Application\\chrome.exe` })); this._executables.push(this._createChromiumChannel("chrome-canary", { "linux": "/opt/google/chrome-canary/chrome", "darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary", "win32": `\\Google\\Chrome SxS\\Application\\chrome.exe` })); this._executables.push(this._createChromiumChannel("msedge", { "linux": "/opt/microsoft/msedge/msedge", "darwin": "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge", "win32": `\\Microsoft\\Edge\\Application\\msedge.exe` }, () => this._installMSEdgeChannel("msedge", { "linux": "reinstall_msedge_stable_linux.sh", "darwin": "reinstall_msedge_stable_mac.sh", "win32": "reinstall_msedge_stable_win.ps1" }))); this._executables.push(this._createChromiumChannel("msedge-beta", { "linux": "/opt/microsoft/msedge-beta/msedge", "darwin": "/Applications/Microsoft Edge Beta.app/Contents/MacOS/Microsoft Edge Beta", "win32": `\\Microsoft\\Edge Beta\\Application\\msedge.exe` }, () => this._installMSEdgeChannel("msedge-beta", { "darwin": "reinstall_msedge_beta_mac.sh", "linux": "reinstall_msedge_beta_linux.sh", "win32": "reinstall_msedge_beta_win.ps1" }))); this._executables.push(this._createChromiumChannel("msedge-dev", { "linux": "/opt/microsoft/msedge-dev/msedge", "darwin": "/Applications/Microsoft Edge Dev.app/Contents/MacOS/Microsoft Edge Dev", "win32": `\\Microsoft\\Edge Dev\\Application\\msedge.exe` }, () => this._installMSEdgeChannel("msedge-dev", { "darwin": "reinstall_msedge_dev_mac.sh", "linux": "reinstall_msedge_dev_linux.sh", "win32": "reinstall_msedge_dev_win.ps1" }))); this._executables.push(this._createChromiumChannel("msedge-canary", { "linux": "", "darwin": "/Applications/Microsoft Edge Canary.app/Contents/MacOS/Microsoft Edge Canary", "win32": `\\Microsoft\\Edge SxS\\Application\\msedge.exe` })); this._executables.push(this._createBidiFirefoxChannel("moz-firefox", { "linux": "/snap/bin/firefox", "darwin": "/Applications/Firefox.app/Contents/MacOS/firefox", "win32": "\\Mozilla Firefox\\firefox.exe" })); this._executables.push(this._createBidiFirefoxChannel("moz-firefox-beta", { "linux": "/opt/firefox-beta/firefox", "darwin": "/Applications/Firefox.app/Contents/MacOS/firefox", "win32": "\\Mozilla Firefox\\firefox.exe" })); this._executables.push(this._createBidiFirefoxChannel("moz-firefox-nightly", { "linux": "/opt/firefox-nightly/firefox", "darwin": "/Applications/Firefox Nightly.app/Contents/MacOS/firefox", "win32": "\\Mozilla Firefox\\firefox.exe" })); this._executables.push(this._createBidiChromiumChannel("bidi-chrome-stable", { "linux": "/opt/google/chrome/chrome", "darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "win32": `\\Google\\Chrome\\Application\\chrome.exe` })); this._executables.push(this._createBidiChromiumChannel("bidi-chrome-canary", { "linux": "/opt/google/chrome-canary/chrome", "darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary", "win32": `\\Google\\Chrome SxS\\Application\\chrome.exe` })); this._executables.push({ type: "browser", name: "_bidiChromium", browserName: "_bidiChromium", directory: chromium.dir, executablePath: () => chromiumExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumExecutable, chromium.installByDefault, sdkLanguage), installType: "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]), downloadURLs: this._downloadURLs(chromium), browserVersion: chromium.browserVersion, _install: () => this._downloadExecutable(chromium, chromiumExecutable), _dependencyGroup: "chromium", _isHermeticInstallation: true }); const firefox = descriptors.find((d) => d.name === "firefox"); const firefoxExecutable = findExecutablePath(firefox.dir, "firefox"); this._executables.push({ type: "browser", name: "firefox", browserName: "firefox", directory: firefox.dir, executablePath: () => firefoxExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("firefox", firefoxExecutable, firefox.installByDefault, sdkLanguage), installType: firefox.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefox.dir, ["firefox"], [], ["firefox"]), downloadURLs: this._downloadURLs(firefox), browserVersion: firefox.browserVersion, _install: () => this._downloadExecutable(firefox, firefoxExecutable), _dependencyGroup: "firefox", _isHermeticInstallation: true }); const firefoxBeta = descriptors.find((d) => d.name === "firefox-beta"); const firefoxBetaExecutable = findExecutablePath(firefoxBeta.dir, "firefox"); this._executables.push({ type: "tool", name: "firefox-beta", browserName: "firefox", directory: firefoxBeta.dir, executablePath: () => firefoxBetaExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("firefox-beta", firefoxBetaExecutable, firefoxBeta.installByDefault, sdkLanguage), installType: firefoxBeta.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefoxBeta.dir, ["firefox"], [], ["firefox"]), downloadURLs: this._downloadURLs(firefoxBeta), browserVersion: firefoxBeta.browserVersion, _install: () => this._downloadExecutable(firefoxBeta, firefoxBetaExecutable), _dependencyGroup: "firefox", _isHermeticInstallation: true }); const webkit = descriptors.find((d) => d.name === "webkit"); const webkitExecutable = findExecutablePath(webkit.dir, "webkit"); const webkitLinuxLddDirectories = [ import_path.default.join("minibrowser-gtk"), import_path.default.join("minibrowser-gtk", "bin"), import_path.default.join("minibrowser-gtk", "lib"), import_path.default.join("minibrowser-gtk", "sys", "lib"), import_path.default.join("minibrowser-wpe"), import_path.default.join("minibrowser-wpe", "bin"), import_path.default.join("minibrowser-wpe", "lib"), import_path.default.join("minibrowser-wpe", "sys", "lib") ]; this._executables.push({ type: "browser", name: "webkit", browserName: "webkit", directory: webkit.dir, executablePath: () => webkitExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("webkit", webkitExecutable, webkit.installByDefault, sdkLanguage), installType: webkit.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, webkit.dir, webkitLinuxLddDirectories, ["libGLESv2.so.2", "libx264.so"], [""]), downloadURLs: this._downloadURLs(webkit), browserVersion: webkit.browserVersion, _install: () => this._downloadExecutable(webkit, webkitExecutable), _dependencyGroup: "webkit", _isHermeticInstallation: true }); const ffmpeg = descriptors.find((d) => d.name === "ffmpeg"); const ffmpegExecutable = findExecutablePath(ffmpeg.dir, "ffmpeg"); this._executables.push({ type: "tool", name: "ffmpeg", browserName: void 0, directory: ffmpeg.dir, executablePath: () => ffmpegExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("ffmpeg", ffmpegExecutable, ffmpeg.installByDefault, sdkLanguage), installType: ffmpeg.installByDefault ? "download-by-default" : "download-on-demand", _validateHostRequirements: () => Promise.resolve(), downloadURLs: this._downloadURLs(ffmpeg), _install: () => this._downloadExecutable(ffmpeg, ffmpegExecutable), _dependencyGroup: "tools", _isHermeticInstallation: true }); const winldd = descriptors.find((d) => d.name === "winldd"); const winlddExecutable = findExecutablePath(winldd.dir, "winldd"); this._executables.push({ type: "tool", name: "winldd", browserName: void 0, directory: winldd.dir, executablePath: () => winlddExecutable, executablePathOrDie: (sdkLanguage) => executablePathOrDie("winldd", winlddExecutable, winldd.installByDefault, sdkLanguage), installType: process.platform === "win32" ? "download-by-default" : "none", _validateHostRequirements: () => Promise.resolve(), downloadURLs: this._downloadURLs(winldd), _install: () => this._downloadExecutable(winldd, winlddExecutable), _dependencyGroup: "tools", _isHermeticInstallation: true }); const android = descriptors.find((d) => d.name === "android"); this._executables.push({ type: "tool", name: "android", browserName: void 0, directory: android.dir, executablePath: () => void 0, executablePathOrDie: () => "", installType: "download-on-demand", _validateHostRequirements: () => Promise.resolve(), downloadURLs: this._downloadURLs(android), _install: () => this._downloadExecutable(android), _dependencyGroup: "tools", _isHermeticInstallation: true }); } _createChromiumChannel(name, lookAt, install) { const executablePath = (sdkLanguage, shouldThrow) => { const suffix = lookAt[process.platform]; if (!suffix) { if (shouldThrow) throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`); return void 0; } const prefixes = process.platform === "win32" ? [ process.env.LOCALAPPDATA, process.env.PROGRAMFILES, process.env["PROGRAMFILES(X86)"], // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set. process.env.HOMEDRIVE + "\\Program Files", process.env.HOMEDRIVE + "\\Program Files (x86)" ].filter(Boolean) : [""]; for (const prefix of prefixes) { const executablePath2 = import_path.default.join(prefix, suffix); if ((0, import_fileUtils.canAccessFile)(executablePath2)) return executablePath2; } if (!shouldThrow) return void 0; const location = prefixes.length ? ` at ${import_path.default.join(prefixes[0], suffix)}` : ``; const installation = install ? ` Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : ""; throw new Error(`Chromium distribution '${name}' is not found${location}${installation}`); }; return { type: "channel", name, browserName: "chromium", directory: void 0, executablePath: (sdkLanguage) => executablePath(sdkLanguage, false), executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true), installType: install ? "install-script" : "none", _validateHostRequirements: () => Promise.resolve(), _isHermeticInstallation: false, _install: install }; } _createBidiFirefoxChannel(name, lookAt, install) { const executablePath = (sdkLanguage, shouldThrow) => { const suffix = lookAt[process.platform]; if (!suffix) { if (shouldThrow) throw new Error(`Firefox distribution '${name}' is not supported on ${process.platform}`); return void 0; } const prefixes = process.platform === "win32" ? [ process.env.LOCALAPPDATA, process.env.PROGRAMFILES, process.env["PROGRAMFILES(X86)"], // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set. process.env.HOMEDRIVE + "\\Program Files", process.env.HOMEDRIVE + "\\Program Files (x86)" ].filter(Boolean) : [""]; for (const prefix of prefixes) { const executablePath2 = import_path.default.join(prefix, suffix); if ((0, import_fileUtils.canAccessFile)(executablePath2)) return executablePath2; } if (shouldThrow) throw new Error(`Cannot find Firefox installation for channel '${name}' at the standard system paths.`); return void 0; }; return { type: "channel", name, browserName: "_bidiFirefox", directory: void 0, executablePath: (sdkLanguage) => executablePath(sdkLanguage, false), executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true), installType: "none", _validateHostRequirements: () => Promise.resolve(), _isHermeticInstallation: true, _install: install }; } _createBidiChromiumChannel(name, lookAt, install) { const executablePath = (sdkLanguage, shouldThrow) => { const suffix = lookAt[process.platform]; if (!suffix) { if (shouldThrow) throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`); return void 0; } const prefixes = process.platform === "win32" ? [ process.env.LOCALAPPDATA, process.env.PROGRAMFILES, process.env["PROGRAMFILES(X86)"], // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set. process.env.HOMEDRIVE + "\\Program Files", process.env.HOMEDRIVE + "\\Program Files (x86)" ].filter(Boolean) : [""]; for (const prefix of prefixes) { const executablePath2 = import_path.default.join(prefix, suffix); if ((0, import_fileUtils.canAccessFile)(executablePath2)) return executablePath2; } if (!shouldThrow) return void 0; const location = prefixes.length ? ` at ${import_path.default.join(prefixes[0], suffix)}` : ``; const installation = install ? ` Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : ""; throw new Error(`Chromium distribution '${name}' is not found${location}${installation}`); }; return { type: "channel", name, browserName: "_bidiChromium", directory: void 0, executablePath: (sdkLanguage) => executablePath(sdkLanguage, false), executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true), installType: install ? "install-script" : "none", _validateHostRequirements: () => Promise.resolve(), _isHermeticInstallation: false, _install: install }; } executables() { return this._executables; } findExecutable(name) { return this._executables.find((b) => b.name === name); } defaultExecutables() { return this._executables.filter((e) => e.installType === "download-by-default"); } _dedupe(executables) { return Array.from(new Set(executables)); } async _validateHostRequirements(sdkLanguage, browserDirectory, linuxLddDirectories, dlOpenLibraries, windowsExeAndDllDirectories) { if (import_os.default.platform() === "linux") return await (0, import_dependencies2.validateDependenciesLinux)(sdkLanguage, linuxLddDirectories.map((d) => import_path.default.join(browserDirectory, d)), dlOpenLibraries); if (import_os.default.platform() === "win32" && import_os.default.arch() === "x64") return await (0, import_dependencies2.validateDependenciesWindows)(sdkLanguage, windowsExeAndDllDirectories.map((d) => import_path.default.join(browserDirectory, d))); } async installDeps(executablesToInstallDeps, dryRun) { const executables = this._dedupe(executablesToInstallDeps); const targets = /* @__PURE__ */ new Set(); for (const executable of executables) { if (executable._dependencyGroup) targets.add(executable._dependencyGroup); } targets.add("tools"); if (import_os.default.platform() === "win32") return await (0, import_dependencies2.installDependenciesWindows)(targets, dryRun); if (import_os.default.platform() === "linux") return await (0, import_dependencies2.installDependenciesLinux)(targets, dryRun); } async install(executablesToInstall, forceReinstall) { const executables = this._dedupe(executablesToInstall); await import_fs.default.promises.mkdir(registryDirectory, { recursive: true }); const lockfilePath = import_path.default.join(registryDirectory, "__dirlock"); const linksDir = import_path.default.join(registryDirectory, ".links"); let releaseL