diff --git a/browsers.json b/browsers.json index d3776837ee..ed1ca432c4 100644 --- a/browsers.json +++ b/browsers.json @@ -4,17 +4,17 @@ { "name": "chromium", "revision": "857950", - "download": true + "installByDefault": true }, { "name": "firefox", "revision": "1238", - "download": true + "installByDefault": true }, { "name": "webkit", "revision": "1446", - "download": true, + "installByDefault": true, "revisionOverrides": { "mac10.14": "1443" } @@ -22,7 +22,7 @@ { "name": "ffmpeg", "revision": "1005", - "download": true + "installByDefault": true } ] } diff --git a/packages/build_package.js b/packages/build_package.js index 5923e12179..3a976c2ff6 100755 --- a/packages/build_package.js +++ b/packages/build_package.js @@ -163,7 +163,7 @@ if (!args.some(arg => arg === '--no-cleanup')) { // 5. Generate browsers.json const browsersJSON = require(path.join(ROOT_PATH, 'browsers.json')); for (const browser of browsersJSON.browsers) - browser.download = package.browsers.includes(browser.name); + browser.installByDefault = package.browsers.includes(browser.name); await writeToPackage('browsers.json', JSON.stringify(browsersJSON, null, 2)); // 6. Bake commit SHA into the package diff --git a/src/install/installer.ts b/src/install/installer.ts index 186c01c1f1..182c81b3b2 100644 --- a/src/install/installer.ts +++ b/src/install/installer.ts @@ -31,7 +31,7 @@ const fsWriteFileAsync = util.promisify(fs.writeFile.bind(fs)); const PACKAGE_PATH = path.join(__dirname, '..', '..'); -export async function installBrowsersWithProgressBar(browserNames: BrowserName[] = allBrowserNames) { +export async function installBrowsersWithProgressBar(browserNames: BrowserName[] = Registry.currentPackageRegistry().installByDefault()) { // PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD should have a value of 0 or 1 if (getAsBooleanFromENV('PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD')) { browserFetcher.logPolitely('Skipping browsers download because `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD` env variable is set'); @@ -74,7 +74,7 @@ async function validateCache(linksDir: string, browserNames: BrowserName[]) { linkTarget = (await fsReadFileAsync(linkPath)).toString(); const linkRegistry = new Registry(linkTarget); for (const browserName of allBrowserNames) { - if (!linkRegistry.shouldDownload(browserName)) + if (!linkRegistry.shouldRetain(browserName)) continue; const usedBrowserPath = linkRegistry.browserDirectory(browserName); const browserRevision = linkRegistry.revision(browserName); @@ -105,10 +105,8 @@ async function validateCache(linksDir: string, browserNames: BrowserName[]) { } // 3. Install missing browsers for this package. - const myRegistry = new Registry(PACKAGE_PATH); + const myRegistry = Registry.currentPackageRegistry(); for (const browserName of browserNames) { - if (!myRegistry.shouldDownload(browserName)) - continue; await browserFetcher.downloadBrowserWithProgressBar(myRegistry, browserName).catch(e => { throw new Error(`Failed to download ${browserName}, caused by\n${e.stack}`); }); diff --git a/src/utils/registry.ts b/src/utils/registry.ts index 8590784a8a..85808780b1 100644 --- a/src/utils/registry.ts +++ b/src/utils/registry.ts @@ -26,11 +26,13 @@ import { assert, getFromENV } from './utils'; export type BrowserName = 'chromium'|'webkit'|'firefox'|'ffmpeg'; export const allBrowserNames: BrowserName[] = ['chromium', 'webkit', 'firefox', 'ffmpeg']; +const PACKAGE_PATH = path.join(__dirname, '..', '..'); + type BrowserPlatform = 'win32'|'win64'|'mac10.13'|'mac10.14'|'mac10.15'|'mac11'|'mac11-arm64'|'ubuntu18.04'|'ubuntu20.04'; type BrowserDescriptor = { name: BrowserName, revision: string, - download: boolean, + installByDefault: boolean, browserDirectory: string, }; @@ -199,9 +201,17 @@ export function isBrowserDirectory(browserDirectory: string): boolean { return false; } +let currentPackageRegistry: Registry | undefined = undefined; + export class Registry { private _descriptors: BrowserDescriptor[]; + static currentPackageRegistry() { + if (!currentPackageRegistry) + currentPackageRegistry = new Registry(PACKAGE_PATH); + return currentPackageRegistry; + } + constructor(packagePath: string) { const browsersJSON = JSON.parse(fs.readFileSync(path.join(packagePath, 'browsers.json'), 'utf8')); this._descriptors = browsersJSON['browsers'].map((obj: any) => { @@ -212,7 +222,7 @@ export class Registry { return { name, revision, - download: obj.download, + installByDefault: !!obj.installByDefault, browserDirectory, }; }); @@ -283,10 +293,17 @@ export class Registry { return util.format(urlTemplate, downloadHost, browser.revision); } - shouldDownload(browserName: BrowserName): boolean { - // Older versions do not have "download" field. We assume they need all browsers - // from the list. So we want to skip all browsers that are explicitly marked as "download: false". + shouldRetain(browserName: BrowserName): boolean { + // We retain browsers if they are found in the descriptor. + // Note, however, that there are older versions out in the wild that rely on + // the "download" field in the browser descriptor and use its value + // to retain and download browsers. + // As of v1.10, we decided to abandon "download" field. const browser = this._descriptors.find(browser => browser.name === browserName); - return !!browser && browser.download !== false; + return !!browser; + } + + installByDefault(): BrowserName[] { + return this._descriptors.filter(browser => browser.installByDefault).map(browser => browser.name); } }