From 328455de3229601f95bcff4105687ff1017528c6 Mon Sep 17 00:00:00 2001 From: Steve Dudenhoeffer Date: Sun, 15 Feb 2026 16:22:49 +0000 Subject: [PATCH] fix: ShowBrowser merge behavior and consistent browser defaults - Change ShowBrowser from bool to *bool so nil means "don't override" in mergeOptions(), fixing the bug where it always overwrote the base - Add Bool() helper for convenient *bool construction - Align NewInteractiveBrowser default from Chromium to Firefox to match NewBrowser - Update README example and CLI flags for the *bool change Closes #15, #16 Co-Authored-By: Claude Opus 4.6 --- README.md | 2 +- browser_init.go | 7 +++++-- cmd/browser/pkg/browser/flags.go | 4 +++- interactive.go | 2 +- playwright.go | 5 ++++- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1c4e074..2162f0e 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ extractor.BrowserOptions{ Browser: extractor.BrowserFirefox, // or BrowserChromium, BrowserWebKit Timeout: &timeout, // default 30s, 0 for no timeout CookieJar: jar, // load/save cookies automatically - ShowBrowser: true, // show browser window (non-headless) + ShowBrowser: extractor.Bool(true), // show browser window (non-headless) Dimensions: extractor.Size{1280, 720}, DarkMode: true, ServerAddress: "ws://...", // remote Playwright server diff --git a/browser_init.go b/browser_init.go index f8d8f6a..fa3d96a 100644 --- a/browser_init.go +++ b/browser_init.go @@ -70,8 +70,9 @@ func initBrowser(opt BrowserOptions) (*browserInitResult, error) { } if launch { + headless := opt.ShowBrowser == nil || !*opt.ShowBrowser browser, err = bt.Launch(playwright.BrowserTypeLaunchOptions{ - Headless: playwright.Bool(!opt.ShowBrowser), + Headless: playwright.Bool(headless), }) if err != nil { return nil, fmt.Errorf("failed to launch browser: %w", err) @@ -154,7 +155,9 @@ func mergeOptions(base BrowserOptions, opts []BrowserOptions) BrowserOptions { if o.UseLocalOnly { base.UseLocalOnly = true } - base.ShowBrowser = o.ShowBrowser + if o.ShowBrowser != nil { + base.ShowBrowser = o.ShowBrowser + } } return base } diff --git a/cmd/browser/pkg/browser/flags.go b/cmd/browser/pkg/browser/flags.go index 9cba6e4..53cd356 100644 --- a/cmd/browser/pkg/browser/flags.go +++ b/cmd/browser/pkg/browser/flags.go @@ -70,7 +70,9 @@ func FromCommand(ctx context.Context, cmd *cli.Command) (extractor.Browser, erro opts.CookieJar = cookies } - opts.ShowBrowser = cmd.Bool("visible") + if cmd.IsSet("visible") { + opts.ShowBrowser = extractor.Bool(cmd.Bool("visible")) + } return extractor.NewBrowser(ctx, opts) } diff --git a/interactive.go b/interactive.go index cd96b61..cf88442 100644 --- a/interactive.go +++ b/interactive.go @@ -60,7 +60,7 @@ func NewInteractiveBrowser(ctx context.Context, opts ...BrowserOptions) (Interac var thirtySeconds = 30 * time.Second opt := mergeOptions(BrowserOptions{ UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0", - Browser: BrowserChromium, + Browser: BrowserFirefox, Timeout: &thirtySeconds, Dimensions: Size{ Width: 1280, diff --git a/playwright.go b/playwright.go index d4adeff..6972ba7 100644 --- a/playwright.go +++ b/playwright.go @@ -36,6 +36,9 @@ const ( BrowserWebKit BrowserSelection = "webkit" ) +// Bool returns a pointer to the given bool value. +func Bool(v bool) *bool { return &v } + type Size struct { Width int Height int @@ -49,7 +52,7 @@ type BrowserOptions struct { // browser into the cookie jar for each request. CookieJar - ShowBrowser bool // If false, browser will be headless + ShowBrowser *bool // If nil, defaults to false (headless). Set to ptr to override. Dimensions Size DarkMode bool