跳转至

restoreExtensionTabs vs ext-context-guard 双 reload

来源

v0.10.47 第三轮独立 agent 跨模块发现。

现象

扩展 update / reload 时,两套机制同时触发 tab reload:

机制 位置 触发
restoreExtensionTabs background/index.ts:328 (v0.10.34 加) onInstalled('update') → 立即 tabs.reload
ext-context-guard ext-context-guard.ts:71 (v0.10.29 加) 5s 周期检测 invalidated → 1.5s 延迟后 location.reload

链条: 1. T=0 用户 reload 扩展 2. T+10ms SW 重启 → onInstalled('update') 触发 restoreExtensionTabs → tabs.reload(tabId) 3. T+? tab 开始 reload,main.html 重新加载 4. T+5s(最坏情况)旧 tab 的 ext-context-guard 5s 周期检测仍跑(已经 reload 过了)→ 检测到新 context valid → 不触发

实际上 v0.10.34 的主动 reload 让旧 context 立即重新加载,新 context valid,guard 检测不到 invalidated → 不会双 reload

重新评估

agent 报告说"两次 reload",但实际上: - v0.10.34 SW reload 让 tab 立即拿到新 context(毫秒级) - guard 5s 周期检测下次跑时新 context 已 valid → 不触发

所以这其实不是 bug。可能 agent 看代码没看到 v0.10.34 reload 的即时效果。

但有一个小风险

如果 v0.10.34 reload 失败(chrome.tabs.reload 抛错被 try-catch 吞),那 guard 5s 后会兜底 reload。这是设计 — 双轨保险。

处置

结论:不是 bug,是双轨保险设计。

但如果未来想优化"在 v0.10.34 主动 reload 成功后让 guard 跳过",可以加 storage flag:

// background restoreExtensionTabs 后
await storage.setItem('local:lastForceReload', Date.now());

// guard 检测前
const last = await storage.getItem('local:lastForceReload');
if (last && Date.now() - last < 10000) return;  // 10s 内有主动 reload,跳过

但当前没必要 — 双 reload 概率极低,影响小。

优先级:极低

仅在未来发现"用户报告频繁意外 reload"时再处理。

2026-05-28 评估结论:discarded

判定:agent 误报,不是 bug。

理由: - v0.10.34 SW 重启时 restoreExtensionTabs 主动 tabs.reload(tabId) 是毫秒级 - ext-context-guard 5s 周期检测下次跑时,新 context 已 valid → 不触发兜底 reload - 即使主动 reload 偶尔失败被 try-catch 吞,guard 5s 兜底 — 这是双轨保险设计,不是浪费

未来若想严格"互斥"(v0.10.34 reload 成功后让 guard 跳过),可加 storage flag。但当前无必要:双 reload 概率极低,影响小。