|
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