Skip to content

Commit ad9d6cc

Browse files
authored
feat: introduce browserType.downloadBrowserIfNeeded() (#834)
Fixes #823
1 parent 9ea8f49 commit ad9d6cc

File tree

6 files changed

+40
-4
lines changed

6 files changed

+40
-4
lines changed

docs/api.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3478,6 +3478,7 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
34783478
<!-- GEN:toc -->
34793479
- [browserType.connect(options)](#browsertypeconnectoptions)
34803480
- [browserType.devices](#browsertypedevices)
3481+
- [browserType.downloadBrowserIfNeeded([progress])](#browsertypedownloadbrowserifneededprogress)
34813482
- [browserType.errors](#browsertypeerrors)
34823483
- [browserType.executablePath()](#browsertypeexecutablepath)
34833484
- [browserType.launch([options])](#browsertypelaunchoptions)
@@ -3516,6 +3517,12 @@ const iPhone = webkit.devices['iPhone 6'];
35163517
})();
35173518
```
35183519

3520+
#### browserType.downloadBrowserIfNeeded([progress])
3521+
- `progress` <[function]> If download is initiated, this function is called with two parameters: `downloadedBytes` and `totalBytes`.
3522+
- returns: <[Promise]> promise that resolves when browser is successfully downloaded.
3523+
3524+
Download browser binary if it is missing.
3525+
35193526
#### browserType.errors
35203527
- returns: <[Object]>
35213528
- `TimeoutError` <[function]> A class of [TimeoutError].

download-browser.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ async function downloadBrowser(browser) {
3838
// Do nothing if the revision is already downloaded.
3939
if (revisionInfo.local)
4040
return revisionInfo;
41-
await fetcher.download(revisionInfo.revision, onProgress);
41+
await browserType.downloadBrowserIfNeeded(onProgress);
4242
logPolitely(`${browser} downloaded to ${revisionInfo.folderPath}`);
4343
return revisionInfo;
4444
}

src/server/browserType.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { TimeoutError } from '../errors';
1919
import { Browser, ConnectOptions } from '../browser';
2020
import { BrowserContext } from '../browserContext';
2121
import { BrowserServer } from './browserServer';
22+
import { OnProgressCallback } from './browserFetcher';
2223

2324
export type BrowserArgOptions = {
2425
headless?: boolean,
@@ -44,6 +45,7 @@ export interface BrowserType {
4445
launchServer(options?: LaunchOptions & { port?: number }): Promise<BrowserServer>;
4546
launchPersistent(userDataDir: string, options?: LaunchOptions): Promise<BrowserContext>;
4647
connect(options: ConnectOptions): Promise<Browser>;
48+
downloadBrowserIfNeeded(progress?: OnProgressCallback): Promise<void>;
4749
devices: types.Devices;
4850
errors: { TimeoutError: typeof TimeoutError };
4951
}

src/server/chromium.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import * as fs from 'fs';
1919
import * as os from 'os';
2020
import * as path from 'path';
2121
import * as util from 'util';
22-
import { BrowserFetcher, BrowserFetcherOptions } from '../server/browserFetcher';
22+
import { BrowserFetcher, OnProgressCallback, BrowserFetcherOptions } from '../server/browserFetcher';
2323
import { DeviceDescriptors } from '../deviceDescriptors';
2424
import * as types from '../types';
2525
import { assert } from '../helper';
@@ -194,6 +194,15 @@ export class Chromium implements BrowserType {
194194
return chromeArguments;
195195
}
196196

197+
async downloadBrowserIfNeeded(onProgress?: OnProgressCallback) {
198+
const fetcher = this._createBrowserFetcher();
199+
const revisionInfo = fetcher.revisionInfo();
200+
// Do nothing if the revision is already downloaded.
201+
if (revisionInfo.local)
202+
return;
203+
await fetcher.download(revisionInfo.revision, onProgress);
204+
}
205+
197206
_createBrowserFetcher(options: BrowserFetcherOptions = {}): BrowserFetcher {
198207
const downloadURLs = {
199208
linux: '%s/chromium-browser-snapshots/Linux_x64/%d/%s.zip',

src/server/firefox.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717

1818
import { FFBrowser } from '../firefox/ffBrowser';
19-
import { BrowserFetcher, BrowserFetcherOptions } from './browserFetcher';
19+
import { BrowserFetcher, OnProgressCallback, BrowserFetcherOptions } from './browserFetcher';
2020
import { DeviceDescriptors } from '../deviceDescriptors';
2121
import { launchProcess, waitForLine } from './processLauncher';
2222
import * as types from '../types';
@@ -44,6 +44,15 @@ export class Firefox implements BrowserType {
4444
this._revision = preferredRevision;
4545
}
4646

47+
async downloadBrowserIfNeeded(onProgress?: OnProgressCallback) {
48+
const fetcher = this._createBrowserFetcher();
49+
const revisionInfo = fetcher.revisionInfo();
50+
// Do nothing if the revision is already downloaded.
51+
if (revisionInfo.local)
52+
return;
53+
await fetcher.download(revisionInfo.revision, onProgress);
54+
}
55+
4756
name() {
4857
return 'firefox';
4958
}

src/server/webkit.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { BrowserFetcher, BrowserFetcherOptions } from './browserFetcher';
18+
import { BrowserFetcher, OnProgressCallback, BrowserFetcherOptions } from './browserFetcher';
1919
import { DeviceDescriptors } from '../deviceDescriptors';
2020
import { TimeoutError } from '../errors';
2121
import * as types from '../types';
@@ -52,6 +52,15 @@ export class WebKit implements BrowserType {
5252
return 'webkit';
5353
}
5454

55+
async downloadBrowserIfNeeded(onProgress?: OnProgressCallback) {
56+
const fetcher = this._createBrowserFetcher();
57+
const revisionInfo = fetcher.revisionInfo();
58+
// Do nothing if the revision is already downloaded.
59+
if (revisionInfo.local)
60+
return;
61+
await fetcher.download(revisionInfo.revision, onProgress);
62+
}
63+
5564
async launch(options?: LaunchOptions & { slowMo?: number }): Promise<WKBrowser> {
5665
const { browserServer, transport } = await this._launchServer(options, 'local');
5766
const browser = await WKBrowser.connect(transport!, options && options.slowMo);

0 commit comments

Comments
 (0)