From 75ee7eb26752e0469073efee934197a820d161fc Mon Sep 17 00:00:00 2001 From: Jake Writer Date: Fri, 31 Jul 2026 00:19:20 -0600 Subject: [PATCH] fix(virtdisplay): keep 1x1x24 as the headless="virtual" default Reverts the default half of 4b20b77. That commit raised Xvfb's root window from 1x1x24 to 1920x1080x24 for #458, on the reasoning that a 1x1 root "breaks anything that measures the screen". That reasoning does not hold here: - screen.* never comes from the root window. It comes from the generated fingerprint, applied per context in the browser, and clamp_screen_to_display() is skipped outright for virtual displays (the `not virtual_display` guard in utils.py), so a 1x1 root cannot clamp a generated screen down to 1x1. - #458's actual symptom -- blank/dark screenshots -- does not reproduce on 152.0.4-beta.28. Measured at both geometries on the same build, same page: Xvfb 1x1x24 493 distinct colours, 57.5% dominant -> renders Xvfb 1920x1080x24 493 distinct colours, 55.8% dominant -> renders Identical. Firefox composites offscreen, so the root window size does not gate rendering. A full-page screenshot of example.com under 1x1x24 is pixel-correct. 1x1x24 is Camoufox's long-standing default and has run that way for years. CAMOUFOX_VIRTUAL_DISPLAY_SIZE is kept as an escape hatch for anyone who does want a real framebuffer, and still validates its input. The Composite half of 4b20b77 was already reverted separately in 75d09a3. Co-Authored-By: Claude Opus 5 (1M context) --- pythonlib/camoufox/virtdisplay.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pythonlib/camoufox/virtdisplay.py b/pythonlib/camoufox/virtdisplay.py index 650911a..d8a8d2d 100644 --- a/pythonlib/camoufox/virtdisplay.py +++ b/pythonlib/camoufox/virtdisplay.py @@ -18,15 +18,17 @@ DISPLAYFD_READ_TIMEOUT_S = 10.0 # Xvfb screen geometry for headless="virtual". # -# This used to be hardcoded to 1x1x24. A 1x1 root window is not a plausible -# desktop: it breaks anything that measures the screen, and it is why -# clamp_screen_to_display() has to special-case virtual displays (otherwise a -# generated fingerprint gets clamped to 1x1). Default to an ordinary desktop -# size instead. The framebuffer cost is trivial -- 1920*1080*4 bytes is ~8MB. +# 1x1x24 is Camoufox's long-standing default and stays the default. The root +# window size is not observable as a fingerprint: screen.* comes from the +# generated fingerprint, applied per context in the browser, and +# clamp_screen_to_display() is skipped entirely for virtual displays (see the +# `not virtual_display` guard in utils.py), so a 1x1 root never clamps a +# generated screen down to 1x1. # # Override with CAMOUFOX_VIRTUAL_DISPLAY_SIZE="xx", e.g. -# "2560x1440x24". Depth may be omitted. -DEFAULT_SCREEN = "1920x1080x24" +# "1920x1080x24", for the cases that do want a real framebuffer to draw into. +# Depth may be omitted. +DEFAULT_SCREEN = "1x1x24" SCREEN_ENV_VAR = "CAMOUFOX_VIRTUAL_DISPLAY_SIZE" # The Composite extension, disabled by default (Xvfb's `-extension COMPOSITE`).