Skip to content

perf(dom-fence): 缩小观察范围并降低空闲维护 - #428

Open
wang-kaopu wants to merge 12 commits into
mainfrom
perf/dom-fence-observer-idle
Open

wang-kaopu wants to merge 12 commits into
mainfrom
perf/dom-fence-observer-idle

Conversation

@wang-kaopu

@wang-kaopu wang-kaopu commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #421
Closes #426

修改内容

缩小 MutationObserver 的观察范围

  • 优先观察最外层 [data-chat-flow] Transcript Roots,覆盖嵌套 group 和多个独立会话根节点。
  • 补充 Transcript 外部的独立 assistant-step 行,保留侧边栏会话的动态围栏发现。
  • 没有有效 Transcript Root 时回退观察 document,兼容旧宿主和无消息行的文本投影。
  • 已观察 Transcript Root 时,每 200ms 检查根节点集合;根节点被替换或外部 Assistant Row 新增后,重新绑定观察器并扫描新节点。
  • 使用 document fallback 时,通过已有 MutationObserver 识别 Transcript Root 的新增和属性变化,不轮询整个 document。
  • 重新绑定前处理旧观察器中尚未交付的 MutationRecord,避免丢失变更。

降低空闲维护成本

  • 将完整挂载维护周期调整为 15 秒。
  • 保留每 5 秒一次的分批轮转发现。
  • 日常围栏更新继续由 MutationObserver、ChatSnapshot 通知和 rAF 增量处理。
  • ChatSnapshot 绑定暂时不可用时,使用一次性重试;订阅成功后停止重试。
  • 页面进入后台时暂停周期任务和 rAF 维护;恢复前台时重新检查根节点并执行完整维护。
  • 单独观察已挂载代码块的 style 变化,宿主重置隐藏样式时立即恢复,保留 PR perf(dom-fence): limit observer maintenance to affected roots #341 的修复能力。

回归测试

  • 验证最外层 Transcript Root 覆盖嵌套 group 和多个独立根节点。
  • 验证无关页面 DOM 变化不会触发围栏维护。
  • 验证 Transcript Root 替换后重新绑定并接管新围栏。
  • 验证主 Transcript 存在时仍能发现外部侧边栏 Assistant Row。
  • 验证 document fallback 下的 anchorless streaming 不触发额外文档扫描。
  • 验证 ChatSnapshot 绑定恢复后能够重新订阅。
  • 验证宿主重置代码块样式后立即恢复。
  • 验证 15 秒完整维护安全任务仍然执行。

涉及文件

  • src/client/dom-fence.tsx
  • tests/dom-fence.spec.tsx
  • tests/dom-fence-maintenance.spec.tsx
  • tests/dom-fence-ordinals.spec.tsx

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant