2019-11-19 05:18:28 +03:00
/ * *
* Copyright 2017 Google Inc . All rights reserved .
*
* 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 .
* /
// playwright-core should not install anything.
if ( require ( './package.json' ) . name === 'playwright-core' )
return ;
2019-11-21 03:39:12 +03:00
const browserSkips = { Chromium : false , Firefox : false , WebKit : false } ;
2019-11-19 05:18:28 +03:00
for ( const browser of [ 'Chromium' , 'Firefox' , 'WebKit' ] ) {
const templates = [
` PLAYWRIGHT_SKIP_ ${ browser } _DOWNLOAD ` ,
` NPM_CONFIG_PLAYWRIGHT_SKIP_ ${ browser } _DOWNLOAD ` ,
` NPM_PACKAGE_CONFIG_PLAYWRIGHT_SKIP_ ${ browser } _DOWNLOAD ` ,
] ;
const varNames = [ ... templates . map ( n => n . toUpperCase ( ) ) , ... templates . map ( n => n . toLowerCase ( ) ) ] ;
for ( const varName of varNames ) {
if ( process . env [ varName . toUpperCase ( ) ] ) {
logPolitely ( ` **INFO** Skipping ${ browser } download. " ${ varName } " environment variable was found. ` ) ;
2019-11-21 03:39:12 +03:00
browserSkips [ browser ] = true ;
break ;
2019-11-19 05:18:28 +03:00
}
}
}
const downloadHost = process . env . PLAYWRIGHT _DOWNLOAD _HOST || process . env . npm _config _playwright _download _host || process . env . npm _package _config _playwright _download _host ;
if ( require ( 'fs' ) . existsSync ( require ( 'path' ) . join ( _ _dirname , 'src' ) ) ) {
try {
require ( 'child_process' ) . execSync ( 'npm run build' , {
stdio : 'ignore'
} ) ;
} catch ( e ) {
}
}
( async function ( ) {
const { generateWebKitProtocol , generateChromeProtocol } = require ( './utils/protocol-types-generator/' ) ;
2019-11-21 03:39:12 +03:00
if ( ! browserSkips . Chromium ) {
const chromeRevision = await downloadBrowser ( 'chromium' , require ( './chromium' ) . createBrowserFetcher ( { host : downloadHost } ) ) ;
await generateChromeProtocol ( chromeRevision ) ;
}
2019-11-19 05:18:28 +03:00
2019-11-21 03:39:12 +03:00
if ( ! browserSkips . Firefox )
await downloadBrowser ( 'firefox' , require ( './firefox' ) . createBrowserFetcher ( { host : downloadHost } ) ) ;
2019-11-19 05:18:28 +03:00
2019-11-21 03:39:12 +03:00
if ( ! browserSkips . WebKit ) {
const webkitRevision = await downloadBrowser ( 'webkit' , require ( './webkit' ) . createBrowserFetcher ( { host : downloadHost } ) ) ;
await generateWebKitProtocol ( webkitRevision ) ;
}
2019-11-19 05:18:28 +03:00
} ) ( ) ;
function getRevision ( browser ) {
if ( browser === 'chromium' )
return process . env . PLAYWRIGHT _CHROMIUM _REVISION || process . env . npm _config _playwright _chromium _revision || process . env . npm _package _config _playwright _chromium _revision || require ( './package.json' ) . playwright . chromium _revision ;
if ( browser === 'firefox' )
return process . env . PLAYWRIGHT _FIREFOX _REVISION || process . env . npm _config _playwright _firefox _revision || process . env . npm _package _config _playwright _firefox _revision || require ( './package.json' ) . playwright . firefox _revision ;
if ( browser === 'webkit' )
return process . env . PLAYWRIGHT _WEBKIT _REVISION || process . env . npm _config _playwright _webkit _revision || process . env . npm _package _config _playwright _webkit _revision || require ( './package.json' ) . playwright . webkit _revision ;
}
async function downloadBrowser ( browser , browserFetcher ) {
const revision = getRevision ( browser ) ;
const revisionInfo = browserFetcher . revisionInfo ( revision ) ;
// Do nothing if the revision is already downloaded.
if ( revisionInfo . local )
return revisionInfo ;
// Override current environment proxy settings with npm configuration, if any.
const NPM _HTTPS _PROXY = process . env . npm _config _https _proxy || process . env . npm _config _proxy ;
const NPM _HTTP _PROXY = process . env . npm _config _http _proxy || process . env . npm _config _proxy ;
const NPM _NO _PROXY = process . env . npm _config _no _proxy ;
if ( NPM _HTTPS _PROXY )
process . env . HTTPS _PROXY = NPM _HTTPS _PROXY ;
if ( NPM _HTTP _PROXY )
process . env . HTTP _PROXY = NPM _HTTP _PROXY ;
if ( NPM _NO _PROXY )
process . env . NO _PROXY = NPM _NO _PROXY ;
let progressBar = null ;
let lastDownloadedBytes = 0 ;
function onProgress ( downloadedBytes , totalBytes ) {
if ( ! progressBar ) {
const ProgressBar = require ( 'progress' ) ;
progressBar = new ProgressBar ( ` Downloading ${ browser } ${ revision } - ${ toMegabytes ( totalBytes ) } [:bar] :percent :etas ` , {
complete : '=' ,
incomplete : ' ' ,
width : 20 ,
total : totalBytes ,
} ) ;
}
const delta = downloadedBytes - lastDownloadedBytes ;
lastDownloadedBytes = downloadedBytes ;
progressBar . tick ( delta ) ;
}
try {
await browserFetcher . download ( revisionInfo . revision , onProgress ) ;
} catch ( error ) {
console . error ( ` ERROR: Failed to download ${ browser } ${ revision } ! Set "PLAYWRIGHT_SKIP_ ${ browser . toUpperCase ( ) } _DOWNLOAD" env variable to skip download. ` ) ;
console . error ( error ) ;
process . exit ( 1 ) ;
}
logPolitely ( ` ${ browser } downloaded to ${ revisionInfo . folderPath } ` ) ;
const localRevisions = await browserFetcher . localRevisions ( ) ;
// Remove previous chromium revisions.
const cleanupOldVersions = localRevisions . filter ( revision => revision !== revisionInfo . revision ) . map ( revision => browserFetcher . remove ( revision ) ) ;
await Promise . all ( [ ... cleanupOldVersions ] ) ;
if ( browser === 'firefox' ) {
const installFirefoxPreferences = require ( './misc/install-preferences' ) ;
await installFirefoxPreferences ( revisionInfo . executablePath ) ;
}
return revisionInfo ;
}
function toMegabytes ( bytes ) {
const mb = bytes / 1024 / 1024 ;
return ` ${ Math . round ( mb * 10 ) / 10 } Mb ` ;
}
function logPolitely ( toBeLogged ) {
const logLevel = process . env . npm _config _loglevel ;
const logLevelDisplay = [ 'silent' , 'error' , 'warn' ] . indexOf ( logLevel ) > - 1 ;
if ( ! logLevelDisplay )
console . log ( toBeLogged ) ;
}