| const path = require('path'); | |
| const fs = require('fs'); | |
| const puppeteer = require('puppeteer'); | |
| const childProcess = require('child_process'); | |
| const CHROMIUM_DEFAULT_PATH = path.resolve(__dirname, '..', '..', '..', '..', '..', '..', 'out', 'Release', 'chrome'); | |
| (async function() { | |
| const targetRevision = process.argv[2]; | |
| if (!targetRevision || String(parseInt(targetRevision, 10)) !== targetRevision) { | |
| console.log('The first argument should be a Chromium revision number, like 338865'); | |
| return; | |
| } | |
| const info = await downloadChrome(targetRevision); | |
| childProcess.exec(`${info.executablePath} --remote-debugging-port=9227 --user-data-dir=user-data-dir about:blank`); | |
| const browser = await puppeteer.launch({ | |
| executablePath: process.env.CHROMIUM_PATH || CHROMIUM_DEFAULT_PATH, | |
| dumpio: true, | |
| defaultViewport: null, | |
| ignoreDefaultArgs: true, | |
| args: puppeteer.defaultArgs({ | |
| headless: false, | |
| args: ['--no-default-browser-check', `--custom-devtools-frontend=http://localhost:9227/devtools/`], | |
| userDataDir: 'debugging-user-data-dir' | |
| }).filter(x => !x.startsWith('--enable-automation')) | |
| }); | |
| const page = (await browser.pages())[0]; | |
| await page.goto('http://localhost:9227'); | |
| const chromeVersion = await page.evaluate(async () => { | |
| const data = await fetch('json/version'); | |
| const json = await data.json(); | |
| const userAgent = json['User-Agent']; | |
| const start = userAgent.indexOf('Chrome/') + 'Chrome/'.length; | |
| return userAgent.substring(start, userAgent.indexOf(' ', start)); | |
| }); | |
| console.log(`Launched Chromium ${chromeVersion}`); | |
| await page.bringToFront(); | |
| await page.waitForSelector('a'); | |
| const realURL = await page.evaluate(() => document.querySelector('a').href); | |
| const path = realURL.substring('http://localhost:9227/devtools/'.length); | |
| const url = `devtools://devtools/custom/${path}&remoteVersion=${chromeVersion}`; | |
| await page.goto(url); | |
| })(); | |
| async function downloadChrome(revision) { | |
| const fetcher = puppeteer.createBrowserFetcher(); | |
| let progressBar = null; | |
| let lastDownloadedBytes = 0; | |
| return await fetcher.download(revision, (downloadedBytes, totalBytes) => { | |
| if (!progressBar) { | |
| const ProgressBar = require('progress'); | |
| progressBar = new ProgressBar(`Downloading Chromium r${revision} - ${toMegabytes(totalBytes)} [:bar] :percent :etas `, { | |
| complete: '=', | |
| incomplete: ' ', | |
| width: 20, | |
| total: totalBytes, | |
| }); | |
| } | |
| const delta = downloadedBytes - lastDownloadedBytes; | |
| lastDownloadedBytes = downloadedBytes; | |
| progressBar.tick(delta); | |
| }); | |
| } | |
| function toMegabytes(bytes) { | |
| const mb = bytes / 1024 / 1024; | |
| return `${Math.round(mb * 10) / 10} Mb`; | |
| } |