Conversation
- CI: build/test 流水线支持 feature/* 分支触发 - vitest: 修正 exclude 模式,确保子目录 node_modules/.claude 被排除 - message/server: SenderRuntime.getExtMessageSender 添加 null 检查, 防止 postMessage 通道(Offscreen→SW)因无 RuntimeMessageSender 崩溃 - message/window_message: connect() 使用 WindowPostMessage 包装, 确保 sandbox(origin:null)→offscreen 的消息不被丢弃
- confirm/App.tsx: 定时器从 setTimeout 递归改为 useEffect+setInterval, 修复内存泄漏和渲染循环;提取 PermissionConfirmRequest 组件 - utils.ts: sourceMapTo 添加 chrome.runtime?.getURL 防御, sandbox 环境中 chrome.runtime 不可用时降级为脚本名 - 5 处 eslint-disable react-hooks/exhaustive-deps 注释 - prettier 格式化:CSS/HTML/JSON 文件统一缩进和引号 - .prettierignore: 忽略 *.md 和 example/ - manifest.json: 纯格式化(prettier) - playwright.config.ts: 本地也启用 retry
- 移除 6 处 react-hooks/exhaustive-deps 的 eslint-disable(仅 warn 无需抑制) - 还原 playwright retries 为 CI ? 1 : 0
CSS/HTML/JSON/manifest 等文件还原为 release/v1.4 原始格式
There was a problem hiding this comment.
Pull request overview
该 PR 从 develop/agent 中抽取与 Agent 无关的通用基础设施与消息通道稳定性改进,目标是让 CI 分支触发更完整、单测排除规则更准确,并修复跨环境(sandbox/offscreen/SW)消息传递的崩溃与丢包问题。
Changes:
- CI:GitHub Actions 的 build/test 工作流支持
feature/*分支触发。 - Vitest:修正
excludeglob,确保子目录下的node_modules/.claude被正确排除。 - Message/页面:增强 sender 为空的防御性处理;修复
WindowMessage.connect()返回连接后续sendMessage未带targetOrigin="*"导致 sandbox→offscreen 消息被丢弃的问题;优化权限确认页倒计时实现。
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| vitest.config.ts | 调整 Vitest exclude 模式,避免子目录未被排除导致误扫测试文件 |
| src/pkg/utils/utils.ts | sourceMapTo 在 chrome.runtime 不可用时降级,避免 sandbox 环境报错 |
| src/pages/confirm/App.tsx | 重构倒计时为 useEffect + setInterval,拆分组件并按 uuid 参数渲染 |
| packages/message/window_message.ts | connect() 返回的连接用 WindowPostMessage 包装,确保后续 sendMessage 带 * |
| packages/message/server.ts | SenderRuntime.getExtMessageSender() 增加 sender 为空的兜底返回 |
| .prettierignore | 新增忽略 *.md 与 example/ |
| .github/workflows/test.yaml | test 工作流 push 分支新增 feature/* |
| .github/workflows/build.yaml | build 工作流 push 分支新增 feature/* |
Comments suppressed due to low confidence (1)
src/pages/confirm/App.tsx:33
- 这里在 useEffect 里用匿名函数注册 beforeunload,但没有在 cleanup 中 removeEventListener;且 effect 依赖 [uuid, t],当语言切换导致 t 变化时会重复注册,可能触发多次 confirm/造成泄漏。建议提取稳定的 handler,并在 return cleanup 中移除监听(或使用 { once: true })。
useEffect(() => {
window.addEventListener("beforeunload", () => {
permissionClient.confirm(uuid, {
allow: false,
type: 0,
| getExtMessageSender(): ExtMessageSender { | ||
| const sender = this.sender as RuntimeMessageSender; | ||
| if (!sender) { | ||
| // postMessage 通道(如 Offscreen→SW)没有 RuntimeMessageSender | ||
| return { | ||
| windowId: -1, | ||
| tabId: -1, | ||
| frameId: undefined, | ||
| documentId: undefined, | ||
| }; |
There was a problem hiding this comment.
这里新增了 sender 为空的兜底分支,但现有单测(packages/message/server.test.ts)只覆盖了 sender 为对象/无 tab 的情况,没有覆盖 null/undefined sender 时不崩溃并返回默认值的行为。建议补充对应测试用例以防回归。
| data, | ||
| }; | ||
| this.target.postMessage(body, "*"); | ||
| resolve(new WindowMessageConnect(body.messageId, this.EE, this.target)); | ||
| // 使用 WindowPostMessage 包装,确保后续 sendMessage 也带 "*" targetOrigin | ||
| // 否则沙箱(origin: null)→ offscreen(origin: chrome-extension://)的消息会被丢弃 | ||
| resolve(new WindowMessageConnect(body.messageId, this.EE, new WindowPostMessage(this.target))); | ||
| }); |
There was a problem hiding this comment.
这里修复了 connect() 返回的 WindowMessageConnect 需要用 WindowPostMessage 包装以确保 sendMessage 带 "" 的 targetOrigin;但当前 window_message.test.ts 主要覆盖 SW 通道,不覆盖 WindowMessage.connect 的行为。建议增加单测验证 connect 后的 con.sendMessage 会调用 target.postMessage(message, ""),避免该回归再次出现。
|
|
||
| # Docs & examples | ||
| *.md | ||
| example/ |
There was a problem hiding this comment.
PR 描述主要聚焦 CI/vitest/message 修复,但这里额外改动了 Prettier 忽略规则(忽略所有 *.md 以及 example/)。建议在 PR 描述中补充该变更的动机/影响范围,避免后续格式化策略产生误解。
根据 PR #1328 Copilot 评审意见,补充两个单测: - SenderRuntime.getExtMessageSender() 在 sender 为 null/undefined/空对象时不崩溃并返回默认值 - WindowMessage.connect() 返回的连接 sendMessage 带 "*" targetOrigin
Checklist / 检查清单
Description / 描述
从
develop/agent分支提取的非 Agent 相关通用修复与改进:Bug fix:
setTimeout递归改为useEffect+setInterval,修复内存泄漏和渲染循环;提取PermissionConfirmRequest组件sourceMapTo添加chrome.runtime?.getURL防御,sandbox 环境中chrome.runtime不可用时降级SenderRuntime.getExtMessageSender()添加 sender null 检查,防止 postMessage 通道(Offscreen→SW)崩溃connect()使用WindowPostMessage包装,修复 sandbox(origin: null) → offscreen 消息被丢弃基础设施:
build.yaml/test.yaml支持feature/*分支触发*.md和example/Screenshots / 截图
N/A