[Bug] web_scan 的 active_tab 是"上次操作的tab"而非真实活跃tab(桥接扩展未上报 active 状态)

Author: double-tuCreated Sep 4, 2026Updated Sep 4, 2026

环境

  • macOS + Chrome(MV3 桥接扩展 tmwd_cdp_bridge)+ conductor 模式
  • 本地与上游 main 三文件(ga.py / TMWebDriver.py / background.js)均比对一致,bug 存在于最新版

复现步骤

  1. 打开两个标签页 A、B,先让 GA 操作过 A(例如 execute_js)
  2. 用户手动切换到标签页 B,问 GA"看一下我当前的页面"
  3. GA 调 web_scan,返回的 active_tab 是 A,扫描的也是 A 的内容

根因分析(三层链路,active 信息全程丢失)

1) 桥接扩展推送链路不带 active 字段

  • assets/tmwd_cdp_bridge/background.js:359(ext_ready)和 :414(tabs_update)都只发 {id, url, title}
  • 且只监听 onUpdated(complete) / onRemoved / onCreated没有监听 chrome.tabs.onActivatedwindows.onFocusChanged,切 tab 时不触发任何推送
  • 讽刺的是 cmd:'tabs' 查询处理器(约 :232)其实已经返回 active/windowId 字段——数据在扩展里就有,只是推送链路丢了

2) TMWebDriver.py 不保留 active 信息

  • _register_client(:182)if self.default_session_id is None: self.default_session_id = session_id —— default 只在第一个 tab 注册时固化,之后用户切 tab 不更新
  • session_info 构造时也丢弃了 extra 字段

3) ga.py 把陈旧的 default 当作活跃 tab 报告

  • ga.py:139: "active_tab": driver.default_session_id —— 这其实是"上次操作过的会话",不是用户当前正看的 tab

影响

  • 多 tab 场景下 GA 对"当前页面"的理解系统性错位,用户需手动 switch_tab_id 纠正
  • 侧边栏/对话式交互("看看我正在看的页面")这个最自然的用法直接不可用

修复建议(三处小 patch)

  1. background.jsext_ready/tabs_update 的 tabs.map 加 active: t.active, windowId: t.windowId,并加 chrome.tabs.onActivated.addListener(sendTabsUpdate)chrome.windows.onFocusChanged.addListener(sendTabsUpdate)
  2. TMWebDriver.py:tabs_update / session_info 保留 active 字段;收到 active=true 的更新时同步 default_session_id(或维护单独的 active_session_id)
  3. ga.py:web_scan 无 switch_tab_id 时跟随真实 active session;tabs 列表中给活跃 tab 加标记(如 ★)

如果维护者认可方向,我可以按上面的方案提 PR。