feat(browser_list): añade campo headless por master

browser_list ahora reporta si cada Chromium master se lanzo en modo headless,
detectado por el flag de arranque (--headless / --headless=new / --headless=old)
leido del cmdline. Una sola llamada devuelve navegadores activos + CDP + headless,
sin tener que conectar a cada pagina para fingerprintear.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Egutierrez
2026-06-16 20:05:51 +02:00
parent c56004da5c
commit 91973ed6f9
2 changed files with 44 additions and 1 deletions
+28
View File
@@ -195,3 +195,31 @@ func TestParseCmdline(t *testing.T) {
t.Errorf("cmdline vacio debe devolver nil")
}
}
// TestIsHeadless valida la deteccion de modo headless por el flag de lanzamiento:
// --headless, --headless=new y --headless=old cuentan; su ausencia es headed.
func TestIsHeadless(t *testing.T) {
cases := []struct {
name string
args []string
want bool
}{
{"sin flag (headed)", []string{"/usr/lib/chromium/chromium", "--user-data-dir=/tmp/x"}, false},
{"--headless legacy", []string{"/usr/lib/chromium/chromium", "--headless", "--user-data-dir=/tmp/x"}, true},
{"--headless=new", []string{"/usr/lib/chromium/chromium", "--headless=new"}, true},
{"--headless=old", []string{"/usr/lib/chromium/chromium", "--headless=old"}, true},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
if got := isHeadless(c.args); got != c.want {
t.Errorf("isHeadless(%v) = %v, want %v", c.args, got, c.want)
}
})
}
// El master headed real (cmdline colapsado por espacios) debe reportar headless=false.
headed := parseCmdline([]byte("/usr/lib/chromium/chromium --remote-debugging-port=9333 --user-data-dir=/tmp/browser_mcp_userdata"))
if m, ok := parseChromiumMaster(1, headed); !ok || m.Headless {
t.Errorf("master headed: ok=%v headless=%v, want ok=true headless=false", ok, m.Headless)
}
}