From a76fbc3b9b82038ab44c04d6379cc2d45e5cecd8 Mon Sep 17 00:00:00 2001 From: Igor Soarez Date: Sat, 14 Nov 2026 09:15:15 +0000 Subject: tabs: one window for every agent; inactive tabs take input; background off by default Measured in Brave on 2026-11-14: an inactive tab takes trusted CDP clicks, key presses, text and mouse moves, and Page.captureScreenshot renders it live. Only mouseWheel hangs, waiting for a frame. The upstream guard that refused input to every hidden page was wrong for inactive tabs, and it is what made a window per session look necessary. - New sessions' tabs open inactive in the user's last focused window, in the session's tab group; a window is created only when none is open. - New groups start collapsed, unless their tab is the one showing, and expand when a tab in them is brought forward. Existing groups keep the user's setting. - Input is refused up front only in a minimized window (untested there). - chrome_scroll scrolls hidden pages by script instead of the wheel. - Focus emulation on attach, so blur-sensitive menus stay open. - Background mode is off by default. Calls still default to background; background:false or chrome_tab activate brings a tab forward. - Agent guidance, tool descriptions and docs say so. --- test-suite/unit/chrome-command.test.mjs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'test-suite/unit/chrome-command.test.mjs') diff --git a/test-suite/unit/chrome-command.test.mjs b/test-suite/unit/chrome-command.test.mjs index dac719a..28bfe8a 100644 --- a/test-suite/unit/chrome-command.test.mjs +++ b/test-suite/unit/chrome-command.test.mjs @@ -174,8 +174,7 @@ test("Doctor warns when this session's Pi tab is hidden, and stays quiet when it await hidden.run("doctor"); const report = hidden.notices.at(-1)[0]; assert.match(report, /⚠ Pi's tab is hidden because its window is covered by another window/); - assert.match(report, /Chrome ignores clicks and typing in hidden tabs/); - assert.match(report, /\/chrome background off/); + assert.match(report, /Clicks, typing and screenshots still work there/); const none = harness({ send: withStatus({ windowId: null, tabId: null }) }); await none.run("doctor"); -- cgit v1.2.3