Files
trade-message-center/.trellis/tasks/09-14-centralize-dom-interactions/implement.md
T

2.4 KiB

实施计划

1. 建立 DOM 适配目录

  • 新建 src/onetalk/main-page/dom/,按设计中的五类 DOM 责任迁移实现。
  • 在移动前,对每个被改动的导出符号执行 GitNexus upstream impact;风险为 HIGH 或 CRITICAL 时先报告并复核范围。
  • 保持函数名与返回值稳定;只在 page-context.tsimage-send.ts 保留领域编排,改为调用 DOM adapter。

2. 更新组合与测试导入

  • 更新 page-script-entry.tspage-bridge/main.tspage-context.tsimage-send.ts 的内部导入,确保没有残留的非 observer 直接 document.querySelector*、元素创建/挂载或 document click 订阅。
  • 更新 onetalk-action-status-tooltiponetalk-conversation-id-copyonetalk-page-contextonetalk-send-pageonetalk-page-bridgeonetalk-image-sendonetalk-file-send 的必要导入与 fixture。
  • 不修改 main-page/buyer-fact-observer/main-page/contact-observer/ 或其测试。

3. 引入并使用 Testing Library

  • apps/chrome-extension/package.jsondevDependencies 添加 @testing-library/dom@testing-library/user-eventjsdom
  • 新增最小测试 helper,负责创建/销毁真实 document 和恢复全局状态;不替换所有现有 fixture。
  • 让复制控件测试通过 Testing Library 按 role/name 定位按钮,并用 userEvent.click 验证 Clipboard 调用与成功/失败反馈。

4. 验证与审查

  • 运行受影响的 focused tests,单次 Node test 命令不超过 60 秒。
  • 运行 pnpm --filter @trade-message-center/chrome-extension typecheck、扩展 build 和完整扩展 test。
  • 搜索非 observer 的 MAIN-page source,确认 DOM API 只在 main-page/dom/ 和明确保留的 Popup 中出现。
  • 执行 GitNexus detect_changes(),确认只影响 DOM adapter、调用方、测试和依赖清单;审查没有改变 bridge、发送或观察语义。

Risk points

  • readSelectedConversationIds 供 page bridge、买家事实和联系人资料路径调用;只抽取 DOM 读取,不得改其零/多选结果。
  • 复制控件自身使用 MutationObserver 来适配 SPA 重绘,但其文件不是被冻结的 observer 目录,仍随控件迁移。
  • React file uploader 查找依赖宿主内部 fiber,迁移必须保持 null/多候选和发送失败语义。
  • Node 内置 test runner 没有浏览器 DOM;新测试 runtime 必须局部化,不能污染其它测试的全局对象。