|
15 | 15 | * restores state. Falls back to clean slate on any failure. |
16 | 16 | */ |
17 | 17 |
|
18 | | -import { chromium, type Browser, type BrowserContext, type BrowserContextOptions, type Page, type Locator, type Cookie } from 'playwright'; |
| 18 | +import { chromium, firefox, webkit, type Browser, type BrowserContext, type BrowserContextOptions, type Page, type Locator, type Cookie } from 'playwright'; |
| 19 | + |
| 20 | +/** |
| 21 | + * Resolve browser engine from BROWSE_BROWSER env var. |
| 22 | + * Supported: chromium (default), firefox, webkit (Safari engine). |
| 23 | + * Edge uses Chromium engine — set BROWSE_BROWSER=chromium (or omit). |
| 24 | + */ |
| 25 | +function getBrowserType() { |
| 26 | + const name = (process.env.BROWSE_BROWSER || 'chromium').toLowerCase(); |
| 27 | + switch (name) { |
| 28 | + case 'firefox': return firefox; |
| 29 | + case 'webkit': |
| 30 | + case 'safari': return webkit; |
| 31 | + case 'chromium': |
| 32 | + case 'chrome': |
| 33 | + case 'edge': |
| 34 | + default: return chromium; |
| 35 | + } |
| 36 | +} |
19 | 37 | import { addConsoleEntry, addNetworkEntry, addDialogEntry, networkBuffer, type DialogEntry } from './buffers'; |
20 | 38 | import { validateNavigationUrl } from './url-validation'; |
21 | 39 |
|
@@ -62,7 +80,9 @@ export class BrowserManager { |
62 | 80 | private consecutiveFailures: number = 0; |
63 | 81 |
|
64 | 82 | async launch() { |
65 | | - this.browser = await chromium.launch({ headless: true }); |
| 83 | + const browserType = getBrowserType(); |
| 84 | + console.error(`[browse] Launching ${browserType.name()} (headless)`); |
| 85 | + this.browser = await browserType.launch({ headless: true }); |
66 | 86 |
|
67 | 87 | // Chromium crash → exit with clear message |
68 | 88 | this.browser.on('disconnected', () => { |
@@ -464,7 +484,7 @@ export class BrowserManager { |
464 | 484 | // 2. Launch new headed browser (try-catch — if this fails, headless stays running) |
465 | 485 | let newBrowser: Browser; |
466 | 486 | try { |
467 | | - newBrowser = await chromium.launch({ headless: false, timeout: 15000 }); |
| 487 | + newBrowser = await getBrowserType().launch({ headless: false, timeout: 15000 }); |
468 | 488 | } catch (err: unknown) { |
469 | 489 | const msg = err instanceof Error ? err.message : String(err); |
470 | 490 | return `ERROR: Cannot open headed browser — ${msg}. Headless browser still running.`; |
|
0 commit comments