From 0aeb263d1848395e7d2c8145ec19e7a5613ee65c Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 23 Jul 2020 15:14:50 -0700 Subject: [PATCH] api: export all browsers from every package This makes it easier to reason about our packages. The only difference is what each package downloads. When the browser is not downloaded, it will fail to launch. Each browser gets a 'download' attribute in the browser.json file. --- browsers.json | 9 +- packages/.gitignore | 1 + packages/build_package.js | 40 ++++---- .../{playwright-core => common}/index.d.ts | 2 +- .../{playwright-chromium => common}/index.js | 0 .../{playwright-core => common}/index.mjs | 0 .../install.js | 0 .../esm-playwright-chromium.mjs | 25 +---- .../esm-playwright-firefox.mjs | 25 +---- .../esm-playwright-webkit.mjs | 25 +---- .../installation-tests/esm-playwright.mjs | 27 +----- packages/installation-tests/esm.mjs | 42 +++++++++ .../installation-tests/installation-tests.sh | 92 ++++++++++++++++--- packages/installation-tests/sanity.js | 39 ++++++-- packages/playwright-chromium/index.d.ts | 20 ---- packages/playwright-chromium/index.mjs | 23 ----- packages/playwright-core/index.js | 19 ---- packages/playwright-core/install.js | 17 ---- packages/playwright-firefox/index.d.ts | 20 ---- packages/playwright-firefox/index.js | 19 ---- packages/playwright-firefox/index.mjs | 23 ----- packages/playwright-firefox/install.js | 19 ---- packages/playwright-webkit/index.d.ts | 20 ---- packages/playwright-webkit/index.js | 19 ---- packages/playwright-webkit/index.mjs | 23 ----- packages/playwright-webkit/install.js | 19 ---- packages/playwright/index.d.ts | 22 ----- packages/playwright/index.js | 19 ---- packages/playwright/index.mjs | 25 ----- packages/playwright/install.js | 19 ---- src/install/browserFetcher.ts | 7 +- src/install/browserPaths.ts | 3 +- src/install/installer.ts | 18 ++-- src/rpc/server/playwrightDispatcher.ts | 6 +- src/server/playwright.ts | 15 ++- utils/check_availability.js | 2 +- 36 files changed, 222 insertions(+), 482 deletions(-) create mode 100644 packages/.gitignore rename packages/{playwright-core => common}/index.d.ts (100%) rename packages/{playwright-chromium => common}/index.js (100%) rename packages/{playwright-core => common}/index.mjs (100%) rename packages/{playwright-chromium => common}/install.js (100%) create mode 100644 packages/installation-tests/esm.mjs delete mode 100644 packages/playwright-chromium/index.d.ts delete mode 100644 packages/playwright-chromium/index.mjs delete mode 100644 packages/playwright-core/index.js delete mode 100644 packages/playwright-core/install.js delete mode 100644 packages/playwright-firefox/index.d.ts delete mode 100644 packages/playwright-firefox/index.js delete mode 100644 packages/playwright-firefox/index.mjs delete mode 100644 packages/playwright-firefox/install.js delete mode 100644 packages/playwright-webkit/index.d.ts delete mode 100644 packages/playwright-webkit/index.js delete mode 100644 packages/playwright-webkit/index.mjs delete mode 100644 packages/playwright-webkit/install.js delete mode 100644 packages/playwright/index.d.ts delete mode 100644 packages/playwright/index.js delete mode 100644 packages/playwright/index.mjs delete mode 100644 packages/playwright/install.js diff --git a/browsers.json b/browsers.json index 46b0ad902b8d1..8db931095cf00 100644 --- a/browsers.json +++ b/browsers.json @@ -3,15 +3,18 @@ "browsers": [ { "name": "chromium", - "revision": "791201" + "revision": "791201", + "download": true }, { "name": "firefox", - "revision": "1140" + "revision": "1140", + "download": true }, { "name": "webkit", - "revision": "1317" + "revision": "1317", + "download": true } ] } diff --git a/packages/.gitignore b/packages/.gitignore new file mode 100644 index 0000000000000..53752db253e3b --- /dev/null +++ b/packages/.gitignore @@ -0,0 +1 @@ +output diff --git a/packages/build_package.js b/packages/build_package.js index 9c9359fcdb8a3..f5f4df6e3896d 100755 --- a/packages/build_package.js +++ b/packages/build_package.js @@ -64,8 +64,6 @@ const PACKAGES = { }, }; -const cleanupPaths = []; - // 1. Parse CLI arguments const args = process.argv.slice(2); if (args.some(arg => arg === '--help')) { @@ -81,10 +79,19 @@ if (args.some(arg => arg === '--help')) { process.exit(1); } +const packageName = args[0]; +const outputPath = path.resolve(args[1]); +const packagePath = path.join(__dirname, 'output', packageName); +const package = PACKAGES[packageName]; +if (!package) { + console.log(`ERROR: unknown package ${packageName}`); + process.exit(1); +} + // 2. Setup cleanup if needed if (!args.some(arg => arg === '--no-cleanup')) { process.on('exit', () => { - cleanupPaths.forEach(cleanupPath => rmSync(cleanupPath, {})); + rmSync(packagePath, {}); }); process.on('SIGINT', () => process.exit(2)); process.on('SIGHUP', () => process.exit(3)); @@ -99,19 +106,17 @@ if (!args.some(arg => arg === '--no-cleanup')) { }); } -const packageName = args[0]; -const outputPath = path.resolve(args[1]); -const packagePath = path.join(__dirname, packageName); -const package = PACKAGES[packageName]; -if (!package) { - console.log(`ERROR: unknown package ${packageName}`); - process.exit(1); -} - (async () => { // 3. Copy package files. + rmSync(packagePath, {}); + fs.mkdirSync(packagePath, { recursive: true }); + await copyToPackage(path.join(__dirname, 'common') + path.sep, packagePath + path.sep); + if (fs.existsSync(path.join(__dirname, packageName))) { + // Copy package-specific files, these can overwrite common ones. + await copyToPackage(path.join(__dirname, packageName) + path.sep, packagePath + path.sep); + } for (const file of package.files) - await copyToPackage(file); + await copyToPackage(path.join(ROOT_PATH, file), path.join(packagePath, file)); // 4. Generate package.json const pwInternalJSON = require(path.join(ROOT_PATH, 'package.json')); @@ -144,7 +149,8 @@ if (!package) { // 5. Generate browsers.json const browsersJSON = require(path.join(ROOT_PATH, 'browsers.json')); - browsersJSON.browsers = browsersJSON.browsers.filter(browser => package.browsers.includes(browser.name)); + for (const browser of browsersJSON.browsers) + browser.download = package.browsers.includes(browser.name); await writeToPackage('browsers.json', JSON.stringify(browsersJSON, null, 2)); // 6. Run npm pack @@ -163,15 +169,11 @@ if (!package) { async function writeToPackage(fileName, content) { const toPath = path.join(packagePath, fileName); - cleanupPaths.push(toPath); console.error(`- generating: //${path.relative(ROOT_PATH, toPath)}`); await writeFileAsync(toPath, content); } -async function copyToPackage(fileOrDirectoryName) { - const fromPath = path.join(ROOT_PATH, fileOrDirectoryName); - const toPath = path.join(packagePath, fileOrDirectoryName); - cleanupPaths.push(toPath); +async function copyToPackage(fromPath, toPath) { console.error(`- copying: //${path.relative(ROOT_PATH, fromPath)} -> //${path.relative(ROOT_PATH, toPath)}`); await cpAsync(fromPath, toPath); } diff --git a/packages/playwright-core/index.d.ts b/packages/common/index.d.ts similarity index 100% rename from packages/playwright-core/index.d.ts rename to packages/common/index.d.ts index 4e7b270a0749a..c90fa88e79657 100644 --- a/packages/playwright-core/index.d.ts +++ b/packages/common/index.d.ts @@ -17,6 +17,6 @@ import * as types from './types/types'; export * from './types/types'; -export const webkit: types.BrowserType; export const chromium: types.BrowserType; export const firefox: types.BrowserType; +export const webkit: types.BrowserType; diff --git a/packages/playwright-chromium/index.js b/packages/common/index.js similarity index 100% rename from packages/playwright-chromium/index.js rename to packages/common/index.js diff --git a/packages/playwright-core/index.mjs b/packages/common/index.mjs similarity index 100% rename from packages/playwright-core/index.mjs rename to packages/common/index.mjs diff --git a/packages/playwright-chromium/install.js b/packages/common/install.js similarity index 100% rename from packages/playwright-chromium/install.js rename to packages/common/install.js diff --git a/packages/installation-tests/esm-playwright-chromium.mjs b/packages/installation-tests/esm-playwright-chromium.mjs index 0e2f6fd4e3cb8..a68fed8b76f1d 100644 --- a/packages/installation-tests/esm-playwright-chromium.mjs +++ b/packages/installation-tests/esm-playwright-chromium.mjs @@ -14,28 +14,9 @@ * limitations under the License. */ -import { chromium, selectors, devices, errors } from 'playwright-chromium'; +import { chromium, firefox, webkit, selectors, devices, errors } from 'playwright-chromium'; import playwright from 'playwright-chromium'; import errorsFile from 'playwright-chromium/lib/errors.js'; -if (playwright.chromium !== chromium) - process.exit(1); - -if (playwright.errors !== errors) - process.exit(1); -if (errors.TimeoutError !== errorsFile.TimeoutError) - process.exit(1); - -(async () => { - for (const browserType of [chromium]) { - const browser = await browserType.launch(); - const context = await browser.newContext(); - const page = await context.newPage(); - await page.evaluate(() => navigator.userAgent); - await browser.close(); - } - console.log(`esm SUCCESS`); -})().catch(err => { - console.error(err); - process.exit(1); -}); +import testESM from './esm.mjs'; +testESM({ chromium, firefox, webkit, selectors, devices, errors, playwright, errorsFile }, [chromium]); diff --git a/packages/installation-tests/esm-playwright-firefox.mjs b/packages/installation-tests/esm-playwright-firefox.mjs index d3854688f9f97..74758eec9af02 100644 --- a/packages/installation-tests/esm-playwright-firefox.mjs +++ b/packages/installation-tests/esm-playwright-firefox.mjs @@ -14,28 +14,9 @@ * limitations under the License. */ -import { firefox, selectors, devices, errors } from 'playwright-firefox'; +import { chromium, firefox, webkit, selectors, devices, errors } from 'playwright-firefox'; import playwright from 'playwright-firefox'; import errorsFile from 'playwright-firefox/lib/errors.js'; -if (playwright.firefox !== firefox) - process.exit(1); - -if (playwright.errors !== errors) - process.exit(1); -if (errors.TimeoutError !== errorsFile.TimeoutError) - process.exit(1); - -(async () => { - for (const browserType of [firefox]) { - const browser = await browserType.launch(); - const context = await browser.newContext(); - const page = await context.newPage(); - await page.evaluate(() => navigator.userAgent); - await browser.close(); - } - console.log(`esm SUCCESS`); -})().catch(err => { - console.error(err); - process.exit(1); -}); +import testESM from './esm.mjs'; +testESM({ chromium, firefox, webkit, selectors, devices, errors, playwright, errorsFile }, [firefox]); diff --git a/packages/installation-tests/esm-playwright-webkit.mjs b/packages/installation-tests/esm-playwright-webkit.mjs index dba784d3c6c81..444c55c0f7d63 100644 --- a/packages/installation-tests/esm-playwright-webkit.mjs +++ b/packages/installation-tests/esm-playwright-webkit.mjs @@ -14,28 +14,9 @@ * limitations under the License. */ -import { webkit, selectors, devices, errors } from 'playwright-webkit'; +import { chromium, firefox, webkit, selectors, devices, errors } from 'playwright-webkit'; import playwright from 'playwright-webkit'; import errorsFile from 'playwright-webkit/lib/errors.js'; -if (playwright.webkit !== webkit) - process.exit(1); - -if (playwright.errors !== errors) - process.exit(1); -if (errors.TimeoutError !== errorsFile.TimeoutError) - process.exit(1); - -(async () => { - for (const browserType of [webkit]) { - const browser = await browserType.launch(); - const context = await browser.newContext(); - const page = await context.newPage(); - await page.evaluate(() => navigator.userAgent); - await browser.close(); - } - console.log(`esm SUCCESS`); -})().catch(err => { - console.error(err); - process.exit(1); -}); +import testESM from './esm.mjs'; +testESM({ chromium, firefox, webkit, selectors, devices, errors, playwright, errorsFile }, [webkit]); diff --git a/packages/installation-tests/esm-playwright.mjs b/packages/installation-tests/esm-playwright.mjs index 18be425d2f86b..1e1f5516adb25 100644 --- a/packages/installation-tests/esm-playwright.mjs +++ b/packages/installation-tests/esm-playwright.mjs @@ -18,28 +18,5 @@ import { chromium, firefox, webkit, selectors, devices, errors } from 'playwrigh import playwright from 'playwright'; import errorsFile from 'playwright/lib/errors.js'; -if (playwright.chromium !== chromium) - process.exit(1); -if (playwright.firefox !== firefox) - process.exit(1); -if (playwright.webkit !== webkit) - process.exit(1); - -if (playwright.errors !== errors) - process.exit(1); -if (errors.TimeoutError !== errorsFile.TimeoutError) - process.exit(1); - -(async () => { - for (const browserType of [chromium, firefox, webkit]) { - const browser = await browserType.launch(); - const context = await browser.newContext(); - const page = await context.newPage(); - await page.evaluate(() => navigator.userAgent); - await browser.close(); - } - console.log(`esm SUCCESS`); -})().catch(err => { - console.error(err); - process.exit(1); -}); +import testESM from './esm.mjs'; +testESM({ chromium, firefox, webkit, selectors, devices, errors, playwright, errorsFile }, [chromium, firefox, webkit]); diff --git a/packages/installation-tests/esm.mjs b/packages/installation-tests/esm.mjs new file mode 100644 index 0000000000000..2ae1ece1d2788 --- /dev/null +++ b/packages/installation-tests/esm.mjs @@ -0,0 +1,42 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default async function testESM({ chromium, firefox, webkit, selectors, devices, errors, playwright, errorsFile }, browsers) { + if (playwright.chromium !== chromium) + process.exit(1); + if (playwright.firefox !== firefox) + process.exit(1); + if (playwright.webkit !== webkit) + process.exit(1); + if (playwright.errors !== errors) + process.exit(1); + if (errors.TimeoutError !== errorsFile.TimeoutError) + process.exit(1); + + try { + for (const browserType of browsers) { + const browser = await browserType.launch(); + const context = await browser.newContext(); + const page = await context.newPage(); + await page.evaluate(() => navigator.userAgent); + await browser.close(); + } + console.log(`esm SUCCESS`); + } catch (err) { + console.error(err); + process.exit(1); + } +} diff --git a/packages/installation-tests/installation-tests.sh b/packages/installation-tests/installation-tests.sh index fe13886bd67c6..570748470fca5 100755 --- a/packages/installation-tests/installation-tests.sh +++ b/packages/installation-tests/installation-tests.sh @@ -28,6 +28,7 @@ NODE_VERSION="$(node --version)" function copy_test_scripts { cp "${SCRIPTS_PATH}/sanity.js" . + cp "${SCRIPTS_PATH}/esm.mjs" . cp "${SCRIPTS_PATH}/esm-playwright.mjs" . cp "${SCRIPTS_PATH}/esm-playwright-chromium.mjs" . cp "${SCRIPTS_PATH}/esm-playwright-firefox.mjs" . @@ -43,6 +44,7 @@ function run_tests { test_playwright_webkit_should_work test_playwright_firefox_should_work test_playwright_global_installation + test_playwright_global_installation_cross_package } function test_typescript_types { @@ -77,13 +79,31 @@ function test_playwright_global_installation { exit 1 fi copy_test_scripts - if node sanity.js playwright chromium 2>/dev/null; then - echo "Should not be able to launch chromium without PLAYWRIGHT_BROWSERS_PATH variable!" + node sanity.js playwright none + PLAYWRIGHT_BROWSERS_PATH="${BROWSERS}" node sanity.js playwright +} + +function test_playwright_global_installation_cross_package { + initialize_test "${FUNCNAME[0]}" + + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_FIREFOX_TGZ} + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_WEBKIT_TGZ} + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ${PLAYWRIGHT_CHROMIUM_TGZ} + + local BROWSERS="$(pwd -P)/browsers" + PLAYWRIGHT_BROWSERS_PATH="${BROWSERS}" npm install ${PLAYWRIGHT_TGZ} + if [[ ! -d "${BROWSERS}" ]]; then + echo "Directory for shared browsers was not created!" exit 1 fi - PLAYWRIGHT_BROWSERS_PATH="${BROWSERS}" node sanity.js playwright chromium -} + copy_test_scripts + + # Every package should be able to launch. + PLAYWRIGHT_BROWSERS_PATH="${BROWSERS}" node sanity.js playwright-chromium all + PLAYWRIGHT_BROWSERS_PATH="${BROWSERS}" node sanity.js playwright-firefox all + PLAYWRIGHT_BROWSERS_PATH="${BROWSERS}" node sanity.js playwright-webkit all +} # @see https://github.com/microsoft/playwright/issues/1651 function test_playwright_global_installation_subsequent_installs { @@ -119,9 +139,21 @@ function test_skip_browser_download { function test_playwright_should_work { initialize_test "${FUNCNAME[0]}" - npm install ${PLAYWRIGHT_TGZ} + OUTPUT=$(npm install ${PLAYWRIGHT_TGZ}) + if [[ "${OUTPUT}" != *"chromium"* ]]; then + echo "ERROR: should download chromium" + exit 1 + fi + if [[ "${OUTPUT}" != *"firefox"* ]]; then + echo "ERROR: should download firefox" + exit 1 + fi + if [[ "${OUTPUT}" != *"webkit"* ]]; then + echo "ERROR: should download webkit" + exit 1 + fi copy_test_scripts - node sanity.js playwright chromium firefox webkit + node sanity.js playwright if [[ "${NODE_VERSION}" == *"v14."* ]]; then node esm-playwright.mjs fi @@ -130,9 +162,21 @@ function test_playwright_should_work { function test_playwright_chromium_should_work { initialize_test "${FUNCNAME[0]}" - npm install ${PLAYWRIGHT_CHROMIUM_TGZ} + OUTPUT=$(npm install ${PLAYWRIGHT_CHROMIUM_TGZ}) + if [[ "${OUTPUT}" != *"chromium"* ]]; then + echo "ERROR: should download chromium" + exit 1 + fi + if [[ "${OUTPUT}" == *"firefox"* ]]; then + echo "ERROR: should not download firefox" + exit 1 + fi + if [[ "${OUTPUT}" == *"webkit"* ]]; then + echo "ERROR: should not download webkit" + exit 1 + fi copy_test_scripts - node sanity.js playwright-chromium chromium + node sanity.js playwright-chromium if [[ "${NODE_VERSION}" == *"v14."* ]]; then node esm-playwright-chromium.mjs fi @@ -141,9 +185,21 @@ function test_playwright_chromium_should_work { function test_playwright_webkit_should_work { initialize_test "${FUNCNAME[0]}" - npm install ${PLAYWRIGHT_WEBKIT_TGZ} + OUTPUT=$(npm install ${PLAYWRIGHT_WEBKIT_TGZ}) + if [[ "${OUTPUT}" == *"chromium"* ]]; then + echo "ERROR: should not download chromium" + exit 1 + fi + if [[ "${OUTPUT}" == *"firefox"* ]]; then + echo "ERROR: should not download firefox" + exit 1 + fi + if [[ "${OUTPUT}" != *"webkit"* ]]; then + echo "ERROR: should download webkit" + exit 1 + fi copy_test_scripts - node sanity.js playwright-webkit webkit + node sanity.js playwright-webkit if [[ "${NODE_VERSION}" == *"v14."* ]]; then node esm-playwright-webkit.mjs fi @@ -152,9 +208,21 @@ function test_playwright_webkit_should_work { function test_playwright_firefox_should_work { initialize_test "${FUNCNAME[0]}" - npm install ${PLAYWRIGHT_FIREFOX_TGZ} + OUTPUT=$(npm install ${PLAYWRIGHT_FIREFOX_TGZ}) + if [[ "${OUTPUT}" == *"chromium"* ]]; then + echo "ERROR: should not download chromium" + exit 1 + fi + if [[ "${OUTPUT}" != *"firefox"* ]]; then + echo "ERROR: should download firefox" + exit 1 + fi + if [[ "${OUTPUT}" == *"webkit"* ]]; then + echo "ERROR: should not download webkit" + exit 1 + fi copy_test_scripts - node sanity.js playwright-firefox firefox + node sanity.js playwright-firefox if [[ "${NODE_VERSION}" == *"v14."* ]]; then node esm-playwright-firefox.mjs fi diff --git a/packages/installation-tests/sanity.js b/packages/installation-tests/sanity.js index 4ff42fbadc360..3b414dfadc353 100644 --- a/packages/installation-tests/sanity.js +++ b/packages/installation-tests/sanity.js @@ -15,7 +15,16 @@ */ const requireName = process.argv[2]; -const browsers = process.argv.slice(3); +let success = { + 'playwright': ['chromium', 'firefox', 'webkit'], + 'playwright-chromium': ['chromium'], + 'playwright-firefox': ['firefox'], + 'playwright-webkit': ['webkit'], +}[requireName]; +if (process.argv[3] === 'none') + success = []; +if (process.argv[3] === 'all') + success = ['chromium', 'firefox', 'webkit']; const playwright = require(requireName); @@ -24,12 +33,28 @@ const errors = require(requireName + '/lib/errors'); const installer = require(requireName + '/lib/install/installer'); (async () => { - for (const browserType of browsers) { - const browser = await playwright[browserType].launch(); - const context = await browser.newContext(); - const page = await context.newPage(); - await page.evaluate(() => navigator.userAgent); - await browser.close(); + for (const browserType of success) { + try { + const browser = await playwright[browserType].launch(); + const context = await browser.newContext(); + const page = await context.newPage(); + await page.evaluate(() => navigator.userAgent); + await browser.close(); + } catch (e) { + console.error(`Should be able to launch ${browserType} from ${requireName}`); + console.error(err); + process.exit(1); + } + } + const fail = ['chromium', 'webkit', 'firefox'].filter(x => !success.includes(x)); + for (const browserType of fail) { + try { + await playwright[browserType].launch(); + console.error(`Should not be able to launch ${browserType} from ${requireName}`); + process.exit(1); + } catch (e) { + // All good. + } } console.log(`require SUCCESS`); })().catch(err => { diff --git a/packages/playwright-chromium/index.d.ts b/packages/playwright-chromium/index.d.ts deleted file mode 100644 index a5d8a610be5cb..0000000000000 --- a/packages/playwright-chromium/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as types from './types/types'; - -export * from './types/types'; -export const chromium: types.BrowserType; diff --git a/packages/playwright-chromium/index.mjs b/packages/playwright-chromium/index.mjs deleted file mode 100644 index 8365d8453b7f6..0000000000000 --- a/packages/playwright-chromium/index.mjs +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import playwright from './index.js'; - -export const chromium = playwright.chromium; -export const selectors = playwright.selectors; -export const devices = playwright.devices; -export const errors = playwright.errors; -export default playwright; diff --git a/packages/playwright-core/index.js b/packages/playwright-core/index.js deleted file mode 100644 index bcc6ecaa3de48..0000000000000 --- a/packages/playwright-core/index.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { Playwright } = require('./lib/server/playwright'); - -module.exports = new Playwright(__dirname, require('./browsers.json')['browsers']); diff --git a/packages/playwright-core/install.js b/packages/playwright-core/install.js deleted file mode 100644 index 955ab6083e0b5..0000000000000 --- a/packages/playwright-core/install.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* NOTE: playwright-core does not install browsers by design. */ diff --git a/packages/playwright-firefox/index.d.ts b/packages/playwright-firefox/index.d.ts deleted file mode 100644 index dc34fe5d12436..0000000000000 --- a/packages/playwright-firefox/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as types from './types/types'; - -export * from './types/types'; -export const firefox: types.BrowserType; diff --git a/packages/playwright-firefox/index.js b/packages/playwright-firefox/index.js deleted file mode 100644 index bcc6ecaa3de48..0000000000000 --- a/packages/playwright-firefox/index.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { Playwright } = require('./lib/server/playwright'); - -module.exports = new Playwright(__dirname, require('./browsers.json')['browsers']); diff --git a/packages/playwright-firefox/index.mjs b/packages/playwright-firefox/index.mjs deleted file mode 100644 index 824f5c8af83ce..0000000000000 --- a/packages/playwright-firefox/index.mjs +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import playwright from './index.js'; - -export const firefox = playwright.firefox; -export const selectors = playwright.selectors; -export const devices = playwright.devices; -export const errors = playwright.errors; -export default playwright; diff --git a/packages/playwright-firefox/install.js b/packages/playwright-firefox/install.js deleted file mode 100644 index 13c8ccee30f20..0000000000000 --- a/packages/playwright-firefox/install.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { installBrowsersWithProgressBar } = require('./lib/install/installer'); - -installBrowsersWithProgressBar(__dirname); diff --git a/packages/playwright-webkit/index.d.ts b/packages/playwright-webkit/index.d.ts deleted file mode 100644 index 6da7c60d111de..0000000000000 --- a/packages/playwright-webkit/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as types from './types/types'; - -export * from './types/types'; -export const webkit: types.BrowserType; diff --git a/packages/playwright-webkit/index.js b/packages/playwright-webkit/index.js deleted file mode 100644 index bcc6ecaa3de48..0000000000000 --- a/packages/playwright-webkit/index.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { Playwright } = require('./lib/server/playwright'); - -module.exports = new Playwright(__dirname, require('./browsers.json')['browsers']); diff --git a/packages/playwright-webkit/index.mjs b/packages/playwright-webkit/index.mjs deleted file mode 100644 index 5f44947f37bf3..0000000000000 --- a/packages/playwright-webkit/index.mjs +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import playwright from './index.js'; - -export const webkit = playwright.webkit; -export const selectors = playwright.selectors; -export const devices = playwright.devices; -export const errors = playwright.errors; -export default playwright; diff --git a/packages/playwright-webkit/install.js b/packages/playwright-webkit/install.js deleted file mode 100644 index 13c8ccee30f20..0000000000000 --- a/packages/playwright-webkit/install.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { installBrowsersWithProgressBar } = require('./lib/install/installer'); - -installBrowsersWithProgressBar(__dirname); diff --git a/packages/playwright/index.d.ts b/packages/playwright/index.d.ts deleted file mode 100644 index 4e7b270a0749a..0000000000000 --- a/packages/playwright/index.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as types from './types/types'; - -export * from './types/types'; -export const webkit: types.BrowserType; -export const chromium: types.BrowserType; -export const firefox: types.BrowserType; diff --git a/packages/playwright/index.js b/packages/playwright/index.js deleted file mode 100644 index bcc6ecaa3de48..0000000000000 --- a/packages/playwright/index.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { Playwright } = require('./lib/server/playwright'); - -module.exports = new Playwright(__dirname, require('./browsers.json')['browsers']); diff --git a/packages/playwright/index.mjs b/packages/playwright/index.mjs deleted file mode 100644 index 337c589660d92..0000000000000 --- a/packages/playwright/index.mjs +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import playwright from './index.js'; - -export const chromium = playwright.chromium; -export const firefox = playwright.firefox; -export const webkit = playwright.webkit; -export const selectors = playwright.selectors; -export const devices = playwright.devices; -export const errors = playwright.errors; -export default playwright; diff --git a/packages/playwright/install.js b/packages/playwright/install.js deleted file mode 100644 index 13c8ccee30f20..0000000000000 --- a/packages/playwright/install.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { installBrowsersWithProgressBar } = require('./lib/install/installer'); - -installBrowsersWithProgressBar(__dirname); diff --git a/src/install/browserFetcher.ts b/src/install/browserFetcher.ts index 024ea35b5d413..75ac4fae09522 100644 --- a/src/install/browserFetcher.ts +++ b/src/install/browserFetcher.ts @@ -122,7 +122,8 @@ function revisionURL(browser: BrowserDescriptor, platform = browserPaths.hostPla return util.format(urlTemplate, serverHost, browser.revision); } -export async function downloadBrowserWithProgressBar(browserPath: string, browser: BrowserDescriptor): Promise { +export async function downloadBrowserWithProgressBar(browsersPath: string, browser: BrowserDescriptor): Promise { + const browserPath = browserPaths.browserDirectory(browsersPath, browser); const progressBarName = `${browser.name} v${browser.revision}`; if (await existsAsync(browserPath)) { // Already downloaded. @@ -168,8 +169,8 @@ function toMegabytes(bytes: number) { return `${Math.round(mb * 10) / 10} Mb`; } -export async function canDownload(browserName: BrowserName, browserRevision: string, platform: BrowserPlatform): Promise { - const url = revisionURL({ name: browserName, revision: browserRevision }, platform); +export async function canDownload(browser: BrowserDescriptor, platform: BrowserPlatform): Promise { + const url = revisionURL(browser, platform); let resolve: (result: boolean) => void = () => {}; const promise = new Promise(x => resolve = x); const request = httpRequest(url, 'HEAD', response => { diff --git a/src/install/browserPaths.ts b/src/install/browserPaths.ts index 27eda3f18572c..03e6cb4531c11 100644 --- a/src/install/browserPaths.ts +++ b/src/install/browserPaths.ts @@ -24,7 +24,8 @@ export type BrowserName = 'chromium'|'webkit'|'firefox'; export type BrowserPlatform = 'win32'|'win64'|'mac10.13'|'mac10.14'|'mac10.15'|'ubuntu18.04'|'ubuntu20.04'; export type BrowserDescriptor = { name: BrowserName, - revision: string + revision: string, + download: boolean, }; export const hostPlatform = ((): BrowserPlatform => { diff --git a/src/install/installer.ts b/src/install/installer.ts index 561e3cde23f47..df5d43cb6a8be 100644 --- a/src/install/installer.ts +++ b/src/install/installer.ts @@ -52,8 +52,8 @@ async function validateCache(packagePath: string, browsersPath: string, linksDir let linkTarget = ''; try { linkTarget = (await fsReadFileAsync(linkPath)).toString(); - const browsers = JSON.parse((await fsReadFileAsync(path.join(linkTarget, 'browsers.json'))).toString())['browsers']; - for (const browser of browsers) { + const browsersToDownload = await readBrowsersToDownload(linkTarget); + for (const browser of browsersToDownload) { const usedBrowserPath = browserPaths.browserDirectory(browsersPath, browser); const browserRevision = parseInt(browser.revision, 10); // Old browser installations don't have marker file. @@ -82,14 +82,20 @@ async function validateCache(packagePath: string, browsersPath: string, linksDir } // 3. Install missing browsers for this package. - const myBrowsers = JSON.parse((await fsReadFileAsync(path.join(packagePath, 'browsers.json'))).toString())['browsers'] as browserPaths.BrowserDescriptor[]; - for (const browser of myBrowsers) { - const browserPath = browserPaths.browserDirectory(browsersPath, browser); - await browserFetcher.downloadBrowserWithProgressBar(browserPath, browser); + const myBrowsersToDownload = await readBrowsersToDownload(packagePath); + for (const browser of myBrowsersToDownload) { + await browserFetcher.downloadBrowserWithProgressBar(browsersPath, browser); await fsWriteFileAsync(browserPaths.markerFilePath(browsersPath, browser), ''); } } +async function readBrowsersToDownload(packagePath: string) { + const browsers = JSON.parse((await fsReadFileAsync(path.join(packagePath, 'browsers.json'))).toString())['browsers'] as browserPaths.BrowserDescriptor[]; + // 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". + return browsers.filter(browser => browser.download !== false); +} + function sha1(data: string): string { const sum = crypto.createHash('sha1'); sum.update(data); diff --git a/src/rpc/server/playwrightDispatcher.ts b/src/rpc/server/playwrightDispatcher.ts index 2c0ebff6c383f..1c7efdfacd391 100644 --- a/src/rpc/server/playwrightDispatcher.ts +++ b/src/rpc/server/playwrightDispatcher.ts @@ -28,9 +28,9 @@ export class PlaywrightDispatcher extends Dispatcher ({ name, descriptor })); super(scope, playwright, 'Playwright', { - chromium: new BrowserTypeDispatcher(scope, playwright.chromium!), - firefox: new BrowserTypeDispatcher(scope, playwright.firefox!), - webkit: new BrowserTypeDispatcher(scope, playwright.webkit!), + chromium: new BrowserTypeDispatcher(scope, playwright.chromium), + firefox: new BrowserTypeDispatcher(scope, playwright.firefox), + webkit: new BrowserTypeDispatcher(scope, playwright.webkit), electron: electron ? new ElectronDispatcher(scope, electron) : undefined, deviceDescriptors, selectors: new SelectorsDispatcher(scope, playwright.selectors), diff --git a/src/server/playwright.ts b/src/server/playwright.ts index 9f506bf3951c5..8050d226cefd6 100644 --- a/src/server/playwright.ts +++ b/src/server/playwright.ts @@ -34,24 +34,21 @@ export class Playwright { readonly selectors = selectors; readonly devices: types.Devices; readonly errors: { TimeoutError: typeof TimeoutError }; - readonly chromium: (Chromium|undefined); - readonly firefox: (Firefox|undefined); - readonly webkit: (WebKit|undefined); + readonly chromium: Chromium; + readonly firefox: Firefox; + readonly webkit: WebKit; constructor(packagePath: string, browsers: browserPaths.BrowserDescriptor[]) { this.devices = DeviceDescriptors; this.errors = { TimeoutError }; const chromium = browsers.find(browser => browser.name === 'chromium'); - if (chromium) - this.chromium = new Chromium(packagePath, chromium); + this.chromium = new Chromium(packagePath, chromium!); const firefox = browsers.find(browser => browser.name === 'firefox'); - if (firefox) - this.firefox = new Firefox(packagePath, firefox); + this.firefox = new Firefox(packagePath, firefox!); const webkit = browsers.find(browser => browser.name === 'webkit'); - if (webkit) - this.webkit = new WebKit(packagePath, webkit); + this.webkit = new WebKit(packagePath, webkit!); } } diff --git a/utils/check_availability.js b/utils/check_availability.js index 8ed7fdd1778da..e97362f8f7032 100755 --- a/utils/check_availability.js +++ b/utils/check_availability.js @@ -100,7 +100,7 @@ async function checkRangeAvailability(fromRevision, toRevision, stopWhenAllAvail * @return {boolean} */ async function checkAndDrawRevisionAvailability(table, name, revision) { - const promises = fetcherOptions.map(platform => browserFetcher.canDownload(name, revision, platform)); + const promises = fetcherOptions.map(platform => browserFetcher.canDownload({ name, revision, download: true }, platform)); const availability = await Promise.all(promises); const allAvailable = availability.every(e => !!e); const values = [name + ' ' + (allAvailable ? colors.green + revision + colors.reset : revision)];