fix(browse): bump Playwright to ^1.60.0 and pin full Chromium for extension loading#1565
Conversation
…ension loading Two related fixes: 1. Playwright bump ^1.58.2 → ^1.60.0 (Chromium 1208/Chrome 145 → 1223/Chrome 148). Chromium 1208 fails Flutter Web's FlutterLoader environment compatibility check in headless mode, producing blank pages with webgl:false and no flt-glass-pane. Chromium 1223 (1.60.0) renders Flutter 3.41+ apps correctly in headless. Verified empirically: same browse source, same args, only Chromium build differs. 2. launchHeaded() now explicitly passes executablePath: executablePath || chromium.executablePath() to launchPersistentContext. Playwright 1.49 changed headless:true to use chrome-headless-shell (which cannot load extensions). The headed path was unaffected, but we were relying on that implicitly. This pin ensures /open-gstack-browser and /pair-agent keep loading the sidebar extension if Playwright ever changes launchPersistentContext defaults. GSTACK_CHROMIUM_PATH still takes priority in both paths. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
d9286e8 to
ecf7efb
Compare
|
Heads up — this bump also fixes a more severe issue not mentioned in the PR description: Root cause is fd-slicer's stream |
Summary
Two related fixes for the headless browse daemon:
Playwright bump
^1.58.2→^1.60.0: Chromium 1208 (bundled by 1.58.2, Chrome 145) fails Flutter Web'sFlutterLoaderenvironment compatibility check in headless mode, producing blank pages withwebgl: false, noflt-glass-pane, and apageerror: FlutterLoader could not find a build compatible with configuration and environment. Chromium 1223 (bundled by 1.60.0, Chrome 148) renders Flutter 3.41+ apps correctly in headless. Verified empirically against a Flutter 3.41.9 web build: samebrowser-manager.ts, same launch args, only the Chromium build differs.launchHeaded()explicitexecutablePathpin: Playwright 1.49 changedchromium.launch({ headless: true })to usechrome-headless-shellby default.chrome-headless-shellcannot load Chrome extensions —/open-gstack-browserand/pair-agentdepend on the gstack sidebar extension. The headed path (launchPersistentContext({ headless: false })) was unaffected, but we relied on that implicitly. This patch pinsexecutablePath: GSTACK_CHROMIUM_PATH || chromium.executablePath()explicitly so future Playwright changes tolaunchPersistentContextdefaults can't silently break extension loading.Boundaries respected:
GSTACK_CHROMIUM_PATHoverride still takes priority in both pathschrome-headless-shellremains the default for headless$Blaunches (Playwright 1.49+ behavior, unchanged)Test plan
bun test browse/test/browser-manager-unit.test.ts browse/test/browser-manager-custom-chromium.test.ts— 10/10 passbun test browse/test/ test/ make-pdf/test/ --ignore ...) — exit code 0$B goto https://example.comround-trips correctlywebgl: falseon 1.58.2 → full render withwebgl: true,glass: 1,semantics: 10on 1.60.0🤖 Generated with Claude Code