diff --git a/packages/browsers/src/fetch.ts b/packages/browsers/src/fetch.ts index 3189ea48b3c..d09c9761af7 100644 --- a/packages/browsers/src/fetch.ts +++ b/packages/browsers/src/fetch.ts @@ -63,6 +63,16 @@ export interface Options { downloadedBytes: number, totalBytes: number ) => void; + /** + * Determines the host that will be used for downloading. + * + * @defaultValue Either + * + * - https://storage.googleapis.com/chromium-browser-snapshots or + * - https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central + * + */ + baseUrl?: string; } export type InstalledBrowser = { @@ -82,7 +92,8 @@ export async function fetch(options: Options): Promise { const url = getDownloadUrl( options.browser, options.platform, - options.buildId + options.buildId, + options.baseUrl ); const fileName = url.toString().split('/').pop(); assert(fileName, `A malformed download URL was found: ${url}.`); @@ -131,14 +142,20 @@ export async function canFetch(options: Options): Promise { ); } return await headHttpRequest( - getDownloadUrl(options.browser, options.platform, options.buildId) + getDownloadUrl( + options.browser, + options.platform, + options.buildId, + options.baseUrl + ) ); } function getDownloadUrl( browser: Browser, platform: BrowserPlatform, - buildId: string + buildId: string, + baseUrl?: string ): URL { - return new URL(downloadUrls[browser](platform, buildId)); + return new URL(downloadUrls[browser](platform, buildId, baseUrl)); } diff --git a/packages/puppeteer/src/node/install.ts b/packages/puppeteer/src/node/install.ts index 2ec3c7cebc5..e0261c6f2f1 100644 --- a/packages/puppeteer/src/node/install.ts +++ b/packages/puppeteer/src/node/install.ts @@ -48,6 +48,8 @@ export async function downloadBrowser(): Promise { return; } + let downloadHost = configuration.downloadHost; + let platform = detectBrowserPlatform(); if (!platform) { throw new Error('The current platform is not supported.'); @@ -70,6 +72,19 @@ export async function downloadBrowser(): Promise { PUPPETEER_REVISIONS[product === 'chrome' ? 'chromium' : 'firefox'] || 'latest'; + if (product === 'chrome' && downloadHost) { + // TODO: remove downloadHost in favour of baseDownloadUrl. The "host" of + // Firefox is already a URL and not a host. This would be a breaking change. + if ( + !downloadHost.endsWith('/chromium-browser-snapshots') && + !downloadHost.endsWith('/chromium-browser-snapshots/') + ) { + downloadHost += downloadHost.endsWith('/') + ? 'chromium-browser-snapshots' + : '/chromium-browser-snapshots'; + } + } + const buildId = await resolveBuildId(browser, platform, unresolvedBuildId); try { @@ -79,6 +94,7 @@ export async function downloadBrowser(): Promise { platform, buildId, downloadProgressCallback: makeProgressCallback(browser, buildId), + baseUrl: downloadHost, }); logPolitely(