| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright 2017 Google Inc. All rights reserved. | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  |  * Modifications copyright (c) Microsoft Corporation. | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  |  // This file is only run when someone clones the github repo for development
 | 
					
						
							| 
									
										
										
										
											2020-01-10 06:49:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  | try { | 
					
						
							|  |  |  |   require('child_process').execSync('npm run build', { | 
					
						
							|  |  |  |     stdio: 'ignore' | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } catch (e) { | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (async function() { | 
					
						
							| 
									
										
										
										
											2019-12-15 04:14:00 +08:00
										 |  |  |   let protocolGenerator; | 
					
						
							|  |  |  |   try { | 
					
						
							|  |  |  |     protocolGenerator = require('./utils/protocol-types-generator'); | 
					
						
							|  |  |  |   } catch (e) { | 
					
						
							|  |  |  |     // Release mode
 | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  |   try { | 
					
						
							| 
									
										
										
										
											2019-12-05 09:58:38 +08:00
										 |  |  |     const chromeRevision = await downloadBrowser('chromium', require('./chromium')); | 
					
						
							| 
									
										
										
										
											2019-12-15 04:14:00 +08:00
										 |  |  |     if (protocolGenerator) | 
					
						
							| 
									
										
										
										
											2020-01-14 02:13:28 +08:00
										 |  |  |       protocolGenerator.generateChromiunProtocol(chromeRevision); | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  |   } catch (e) { | 
					
						
							|  |  |  |     console.warn(e.message); | 
					
						
							| 
									
										
										
										
											2019-11-21 08:39:12 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  |   try { | 
					
						
							| 
									
										
										
										
											2019-12-05 09:58:38 +08:00
										 |  |  |     const firefoxRevision = await downloadBrowser('firefox', require('./firefox')); | 
					
						
							| 
									
										
										
										
											2019-12-15 04:14:00 +08:00
										 |  |  |     if (protocolGenerator) | 
					
						
							|  |  |  |       protocolGenerator.generateFirefoxProtocol(firefoxRevision); | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  |   } catch (e) { | 
					
						
							|  |  |  |     console.warn(e.message); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   try { | 
					
						
							| 
									
										
										
										
											2019-12-05 09:58:38 +08:00
										 |  |  |     const webkitRevision = await downloadBrowser('webkit', require('./webkit')); | 
					
						
							| 
									
										
										
										
											2019-12-15 04:14:00 +08:00
										 |  |  |     if (protocolGenerator) | 
					
						
							|  |  |  |       protocolGenerator.generateWebKitProtocol(webkitRevision); | 
					
						
							| 
									
										
										
										
											2019-11-22 13:17:23 +08:00
										 |  |  |   } catch (e) { | 
					
						
							|  |  |  |     console.warn(e.message); | 
					
						
							| 
									
										
										
										
											2019-11-21 08:39:12 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  | })(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-05 09:58:38 +08:00
										 |  |  | async function downloadBrowser(browser, playwright) { | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  |   let progressBar = null; | 
					
						
							|  |  |  |   let lastDownloadedBytes = 0; | 
					
						
							|  |  |  |   function onProgress(downloadedBytes, totalBytes) { | 
					
						
							|  |  |  |     if (!progressBar) { | 
					
						
							|  |  |  |       const ProgressBar = require('progress'); | 
					
						
							| 
									
										
										
										
											2019-12-06 00:30:58 +08:00
										 |  |  |       progressBar = new ProgressBar(`Downloading ${browser} ${playwright._revision} - ${toMegabytes(totalBytes)} [:bar] :percent :etas `, { | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  |         complete: '=', | 
					
						
							|  |  |  |         incomplete: ' ', | 
					
						
							|  |  |  |         width: 20, | 
					
						
							|  |  |  |         total: totalBytes, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const delta = downloadedBytes - lastDownloadedBytes; | 
					
						
							|  |  |  |     lastDownloadedBytes = downloadedBytes; | 
					
						
							|  |  |  |     progressBar.tick(delta); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-10 06:49:22 +08:00
										 |  |  |   const fetcher = playwright.createBrowserFetcher(); | 
					
						
							|  |  |  |   const revisionInfo = fetcher.revisionInfo(); | 
					
						
							| 
									
										
										
										
											2019-12-05 09:58:38 +08:00
										 |  |  |   // Do nothing if the revision is already downloaded.
 | 
					
						
							|  |  |  |   if (revisionInfo.local) | 
					
						
							|  |  |  |     return revisionInfo; | 
					
						
							| 
									
										
										
										
											2020-01-10 06:49:22 +08:00
										 |  |  |   await fetcher.download(revisionInfo.revision, onProgress); | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  |   logPolitely(`${browser} downloaded to ${revisionInfo.folderPath}`); | 
					
						
							| 
									
										
										
										
											2019-12-05 09:58:38 +08:00
										 |  |  |   const browserFetcher = playwright.createBrowserFetcher(); | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  |   const localRevisions = await browserFetcher.localRevisions(); | 
					
						
							| 
									
										
										
										
											2020-01-10 06:49:22 +08:00
										 |  |  |   // Remove previous revisions.
 | 
					
						
							| 
									
										
										
										
											2019-11-19 10:18:28 +08:00
										 |  |  |   const cleanupOldVersions = localRevisions.filter(revision => revision !== revisionInfo.revision).map(revision => browserFetcher.remove(revision)); | 
					
						
							|  |  |  |   await Promise.all([...cleanupOldVersions]); | 
					
						
							|  |  |  |   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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |