|
9 | 9 | 'use strict'; |
10 | 10 |
|
11 | 11 | const os = require('os'); |
| 12 | +const puppeteerBrowsers = require('@puppeteer/browsers'); |
12 | 13 |
|
13 | | -let browsers; |
14 | | -if (process.env.BROWSER) { |
15 | | - if (process.env.BROWSER === 'safari') { |
16 | | - browsers = ['Safari']; |
17 | | - } else if (process.env.BROWSER === 'Electron') { |
18 | | - browsers = ['electron']; |
19 | | - } else { |
20 | | - browsers = [process.env.BROWSER]; |
21 | | - } |
22 | | -} else if (os.platform() === 'darwin') { |
23 | | - browsers = ['chrome', 'firefox', 'Safari']; |
24 | | -} else if (os.platform() === 'win32') { |
25 | | - browsers = ['chrome', 'firefox']; |
26 | | -} else { |
27 | | - browsers = ['chrome', 'firefox']; |
| 14 | +async function determineFirefoxVersion(version) { |
| 15 | + const rawVersions = await fetch('https://product-details.mozilla.org/1.0/firefox_versions.json'); |
| 16 | + const versions = await rawVersions.json(); |
| 17 | + return versions.FIREFOX_NIGHTLY; |
| 18 | + // TODO: support stable, beta, nightly, esr. |
| 19 | + // This has issues with the assumptions browsers makes about download urls |
| 20 | + // (or Firefox about directory structure and where it includes the platform) |
| 21 | + // This base url coems close: |
| 22 | + // 'https://archive.mozilla.org/pub/firefox/releases/' + buildId + '/' + platform + '/en-US/'; |
28 | 23 | } |
29 | 24 |
|
30 | | -let reporters = ['mocha']; |
31 | | -if (process.env.CI) { |
32 | | - // stability must be the last reporter as it munges the |
33 | | - // exit code and always returns 0. |
34 | | - reporters.push('stability'); |
| 25 | +async function download(browser, version, cacheDir, platform) { |
| 26 | + if (browser === 'firefox') { |
| 27 | + // TODO: see above, resolve stable, beta, nightly, esr |
| 28 | + const buildId = await determineFirefoxVersion(version); |
| 29 | + await puppeteerBrowsers.install({ |
| 30 | + browser, |
| 31 | + buildId, |
| 32 | + cacheDir, |
| 33 | + platform, |
| 34 | + }); |
| 35 | + return buildId; |
| 36 | + } |
| 37 | + const buildId = await puppeteerBrowsers |
| 38 | + .resolveBuildId(browser, platform, version); |
| 39 | + await puppeteerBrowsers.install({ |
| 40 | + browser, |
| 41 | + buildId, |
| 42 | + cacheDir, |
| 43 | + platform |
| 44 | + }); |
| 45 | + return buildId; |
35 | 46 | } |
36 | 47 |
|
37 | | -// uses Safari Technology Preview. |
38 | | -if (os.platform() === 'darwin' && process.env.BVER === 'unstable' && |
39 | | - !process.env.SAFARI_BIN) { |
40 | | - process.env.SAFARI_BIN = '/Applications/Safari Technology Preview.app' + |
41 | | - '/Contents/MacOS/Safari Technology Preview'; |
42 | | -} |
| 48 | +module.exports = async(config) => { |
| 49 | + const cacheDir = process.cwd() + '/browsers'; |
| 50 | + const platform = puppeteerBrowsers.detectBrowserPlatform(); |
43 | 51 |
|
44 | | -if (!process.env.FIREFOX_BIN) { |
45 | | - process.env.FIREFOX_BIN = process.cwd() + '/browsers/bin/firefox-' |
46 | | - + (process.env.BVER || 'stable'); |
47 | | -} |
48 | | -if (!process.env.CHROME_BIN) { |
49 | | - process.env.CHROME_BIN = process.cwd() + '/browsers/bin/chrome-' |
50 | | - + (process.env.BVER || 'stable'); |
51 | | -} |
| 52 | + let browsers; |
| 53 | + if (process.env.BROWSER) { |
| 54 | + if (process.env.BROWSER === 'safari') { |
| 55 | + browsers = ['Safari']; |
| 56 | + } else if (process.env.BROWSER === 'Electron') { |
| 57 | + browsers = ['electron']; |
| 58 | + } else { |
| 59 | + browsers = [process.env.BROWSER]; |
| 60 | + } |
| 61 | + } else if (os.platform() === 'darwin') { |
| 62 | + browsers = ['chrome', 'firefox', 'Safari']; |
| 63 | + } else if (os.platform() === 'win32') { |
| 64 | + browsers = ['chrome', 'firefox']; |
| 65 | + } else { |
| 66 | + browsers = ['chrome', 'firefox']; |
| 67 | + } |
52 | 68 |
|
53 | | -let chromeFlags = [ |
54 | | - '--use-fake-device-for-media-stream', |
55 | | - '--use-fake-ui-for-media-stream', |
56 | | - '--no-sandbox', |
57 | | - '--headless', '--disable-gpu', '--remote-debugging-port=9222' |
58 | | -]; |
59 | | -if (process.env.CHROMEEXPERIMENT !== 'false') { |
60 | | - chromeFlags.push('--enable-experimental-web-platform-features'); |
61 | | -} |
| 69 | + let reporters = ['mocha']; |
| 70 | + if (process.env.CI) { |
| 71 | + // stability must be the last reporter as it munges the |
| 72 | + // exit code and always returns 0. |
| 73 | + reporters.push('stability'); |
| 74 | + } |
| 75 | + |
| 76 | + // uses Safari Technology Preview. |
| 77 | + if (browsers.includes('Safari') && os.platform() === 'darwin' && |
| 78 | + process.env.BVER === 'unstable' && !process.env.SAFARI_BIN) { |
| 79 | + process.env.SAFARI_BIN = '/Applications/Safari Technology Preview.app' + |
| 80 | + '/Contents/MacOS/Safari Technology Preview'; |
| 81 | + } |
| 82 | + |
| 83 | + if (browsers.includes('firefox') && !process.env.FIREFOX_BIN) { |
| 84 | + const buildId = await download('firefox', process.env.BVER || 'stable', |
| 85 | + cacheDir, platform); |
| 86 | + process.env.FIREFOX_BIN = puppeteerBrowsers |
| 87 | + .computeExecutablePath({browser: 'firefox', buildId, cacheDir, platform}); |
| 88 | + } |
| 89 | + if (browsers.includes('chrome') && !process.env.CHROME_BIN) { |
| 90 | + const buildId = await download('chrome', process.env.BVER || 'stable', |
| 91 | + cacheDir, platform); |
| 92 | + process.env.CHROME_BIN = puppeteerBrowsers |
| 93 | + .computeExecutablePath({browser: 'chrome', buildId, cacheDir, platform}); |
| 94 | + } |
| 95 | + |
| 96 | + let chromeFlags = [ |
| 97 | + '--use-fake-device-for-media-stream', |
| 98 | + '--use-fake-ui-for-media-stream', |
| 99 | + '--no-sandbox', |
| 100 | + '--headless', '--disable-gpu', '--remote-debugging-port=9222' |
| 101 | + ]; |
| 102 | + if (process.env.CHROMEEXPERIMENT !== 'false') { |
| 103 | + chromeFlags.push('--enable-experimental-web-platform-features'); |
| 104 | + } |
62 | 105 |
|
63 | | -module.exports = function(config) { |
64 | 106 | config.set({ |
65 | 107 | basePath: '..', |
66 | 108 | frameworks: ['browserify', 'mocha', 'chai'], |
|
0 commit comments