| 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`; |
| } |