diff --git a/browsers.json b/browsers.json index b787d21481..56a1e7cd7f 100644 --- a/browsers.json +++ b/browsers.json @@ -6,6 +6,11 @@ "revision": "888113", "installByDefault": true }, + { + "name": "chromium-with-symbols", + "revision": "888113", + "installByDefault": false + }, { "name": "firefox", "revision": "1271", diff --git a/src/server/chromium/chromium.ts b/src/server/chromium/chromium.ts index 4c162b07fc..6ebf5857ba 100644 --- a/src/server/chromium/chromium.ts +++ b/src/server/chromium/chromium.ts @@ -27,7 +27,7 @@ import { ConnectionTransport, ProtocolRequest, WebSocketTransport } from '../tra import { CRDevTools } from './crDevTools'; import { BrowserOptions, BrowserProcess, PlaywrightOptions } from '../browser'; import * as types from '../types'; -import { debugMode, headersArrayToObject, removeFolders } from '../../utils/utils'; +import { assert, debugMode, headersArrayToObject, removeFolders } from '../../utils/utils'; import { RecentLogsCollector } from '../../utils/debugLogger'; import { ProgressController } from '../progress'; import { TimeoutSettings } from '../../utils/timeoutSettings'; @@ -49,8 +49,16 @@ export class Chromium extends BrowserType { } executablePath(channel?: string): string { - if (channel) - return findChromiumChannel(channel); + if (channel) { + let executablePath = undefined; + if ((channel as any) === 'chromium-with-symbols') + executablePath = this._registry.executablePath('chromium-with-symbols'); + else + executablePath = findChromiumChannel(channel); + assert(executablePath, `unsupported chromium channel "${channel}"`); + assert(fs.existsSync(executablePath), `"${channel}" channel is not installed. Try running 'npx playwright install ${channel}'`); + return executablePath; + } return super.executablePath(channel); } diff --git a/src/server/validateDependencies.ts b/src/server/validateDependencies.ts index 8314619fa9..4cbe306c67 100644 --- a/src/server/validateDependencies.ts +++ b/src/server/validateDependencies.ts @@ -38,13 +38,8 @@ export async function validateHostRequirements(registry: registry.Registry, brow } const DL_OPEN_LIBRARIES = { - 'chromium': [], 'webkit': ['libGLESv2.so.2', 'libx264.so'], 'webkit-technology-preview': ['libGLESv2.so.2', 'libx264.so'], - 'firefox': [], - 'firefox-beta': [], - 'clank': [], - 'ffmpeg': [], }; function isSupportedWindowsVersion(): boolean { @@ -245,7 +240,7 @@ async function missingFileDependencies(filePath: string, extraLDPaths: string[]) } async function missingDLOPENLibraries(browserName: registry.BrowserName): Promise { - const libraries = DL_OPEN_LIBRARIES[browserName]; + const libraries: string[] = (DL_OPEN_LIBRARIES as any)[browserName] || []; if (!libraries.length) return []; // NOTE: Using full-qualified path to `ldconfig` since `/sbin` is not part of the diff --git a/src/utils/registry.ts b/src/utils/registry.ts index c380ab99ba..f3b7dcb3d0 100644 --- a/src/utils/registry.ts +++ b/src/utils/registry.ts @@ -22,8 +22,8 @@ import * as util from 'util'; import { getUbuntuVersionSync } from './ubuntuVersion'; import { assert, getFromENV } from './utils'; -export type BrowserName = 'chromium'|'webkit'|'firefox'|'firefox-beta'|'ffmpeg'|'webkit-technology-preview'; -export const allBrowserNames: Set = new Set(['chromium', 'webkit', 'firefox', 'ffmpeg', 'webkit-technology-preview', 'firefox-beta']); +export type BrowserName = 'chromium'|'chromium-with-symbols'|'webkit'|'firefox'|'firefox-beta'|'ffmpeg'|'webkit-technology-preview'; +export const allBrowserNames: Set = new Set(['chromium', 'chromium-with-symbols', 'webkit', 'firefox', 'ffmpeg', 'webkit-technology-preview', 'firefox-beta']); const PACKAGE_PATH = path.join(__dirname, '..', '..'); @@ -47,6 +47,17 @@ const EXECUTABLE_PATHS = { 'win32': ['chrome-win', 'chrome.exe'], 'win64': ['chrome-win', 'chrome.exe'], }, + 'chromium-with-symbols': { + 'ubuntu18.04': ['chrome-linux', 'chrome'], + 'ubuntu20.04': ['chrome-linux', 'chrome'], + 'mac10.13': ['chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'], + 'mac10.14': ['chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'], + 'mac10.15': ['chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'], + 'mac11': ['chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'], + 'mac11-arm64': ['chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'], + 'win32': ['chrome-win', 'chrome.exe'], + 'win64': ['chrome-win', 'chrome.exe'], + }, 'firefox': { 'ubuntu18.04': ['firefox', 'firefox'], 'ubuntu20.04': ['firefox', 'firefox'], @@ -116,6 +127,17 @@ const DOWNLOAD_URLS = { 'win32': '%s/builds/chromium/%s/chromium-win32.zip', 'win64': '%s/builds/chromium/%s/chromium-win64.zip', }, + 'chromium-with-symbols': { + 'ubuntu18.04': '%s/builds/chromium/%s/chromium-with-symbols-linux.zip', + 'ubuntu20.04': '%s/builds/chromium/%s/chromium-with-symbols-linux.zip', + 'mac10.13': '%s/builds/chromium/%s/chromium-with-symbols-mac.zip', + 'mac10.14': '%s/builds/chromium/%s/chromium-with-symbols-mac.zip', + 'mac10.15': '%s/builds/chromium/%s/chromium-with-symbols-mac.zip', + 'mac11': '%s/builds/chromium/%s/chromium-with-symbols-mac.zip', + 'mac11-arm64': '%s/builds/chromium/%s/chromium-with-symbols-mac-arm64.zip', + 'win32': '%s/builds/chromium/%s/chromium-with-symbols-win32.zip', + 'win64': '%s/builds/chromium/%s/chromium-with-symbols-win64.zip', + }, 'firefox': { 'ubuntu18.04': '%s/builds/firefox/%s/firefox-ubuntu-18.04.zip', 'ubuntu20.04': '%s/builds/firefox/%s/firefox-ubuntu-20.04.zip', @@ -301,6 +323,7 @@ export class Registry { const browserDirectory = this.browserDirectory(browserName); switch (browserName) { case 'chromium': + case 'chromium-with-symbols': return [path.join(browserDirectory, 'chrome-linux')]; case 'webkit': case 'webkit-technology-preview': @@ -322,11 +345,11 @@ export class Registry { windowsExeAndDllDirectories(browserName: BrowserName): string[] { const browserDirectory = this.browserDirectory(browserName); - if (browserName === 'chromium') + if (browserName === 'chromium' || browserName === 'chromium-with-symbols') return [path.join(browserDirectory, 'chrome-win')]; - if (browserName === 'firefox') + if (browserName === 'firefox' || browserName === 'firefox-beta') return [path.join(browserDirectory, 'firefox')]; - if (browserName === 'webkit') + if (browserName === 'webkit' || browserName === 'webkit-technology-preview') return [browserDirectory]; return []; } @@ -342,6 +365,7 @@ export class Registry { assert(browser, `ERROR: Playwright does not support ${browserName}`); const envDownloadHost: { [key: string]: string } = { 'chromium': 'PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST', + 'chromium-with-symbols': 'PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST', 'firefox': 'PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST', 'firefox-beta': 'PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST', 'webkit': 'PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST', diff --git a/utils/roll_browser.js b/utils/roll_browser.js index 151d9d02ec..bad15cfc7c 100755 --- a/utils/roll_browser.js +++ b/utils/roll_browser.js @@ -66,6 +66,8 @@ Example: // 2. Update browsers.json. console.log('\nUpdating browsers.json...'); descriptor.revision = String(revision); + if (browserName === 'chromium') + browsersJSON.browsers.find(b => b.name === 'chromium-with-symbols').revision = String(revision); fs.writeFileSync(path.join(ROOT_PATH, 'browsers.json'), JSON.stringify(browsersJSON, null, 2) + '\n'); if (descriptor.installByDefault) {