Skip to content

🔧 通用修复与基础设施改进#1328

Open
CodFrm wants to merge 5 commits intorelease/v1.4from
fix/general-improvements
Open

🔧 通用修复与基础设施改进#1328
CodFrm wants to merge 5 commits intorelease/v1.4from
fix/general-improvements

Conversation

@CodFrm
Copy link
Copy Markdown
Member

@CodFrm CodFrm commented Apr 4, 2026

Checklist / 检查清单

  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

Description / 描述

develop/agent 分支提取的非 Agent 相关通用修复与改进:

Bug fix:

  • confirm/App.tsx: 定时器从 setTimeout 递归改为 useEffect + setInterval,修复内存泄漏和渲染循环;提取 PermissionConfirmRequest 组件
  • utils.ts: sourceMapTo 添加 chrome.runtime?.getURL 防御,sandbox 环境中 chrome.runtime 不可用时降级
  • packages/message/server.ts: SenderRuntime.getExtMessageSender() 添加 sender null 检查,防止 postMessage 通道(Offscreen→SW)崩溃
  • packages/message/window_message.ts: connect() 使用 WindowPostMessage 包装,修复 sandbox(origin: null) → offscreen 消息被丢弃

基础设施:

  • CI: build.yaml / test.yaml 支持 feature/* 分支触发
  • vitest.config.ts: 修正 exclude 模式,确保子目录 node_modules/.claude 也被排除
  • .prettierignore: 忽略 *.mdexample/

Screenshots / 截图

N/A

CodFrm added 4 commits April 4, 2026 12:24
- 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 原始格式
@CodFrm CodFrm requested a review from Copilot April 4, 2026 04:44
@CodFrm CodFrm changed the title 🔧 通用基础设施改进:CI feature 分支、vitest exclude、message 防御性修复 🔧 通用修复与基础设施改进 Apr 4, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

该 PR 从 develop/agent 中抽取与 Agent 无关的通用基础设施与消息通道稳定性改进,目标是让 CI 分支触发更完整、单测排除规则更准确,并修复跨环境(sandbox/offscreen/SW)消息传递的崩溃与丢包问题。

Changes:

  • CI:GitHub Actions 的 build/test 工作流支持 feature/* 分支触发。
  • Vitest:修正 exclude glob,确保子目录下的 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 sourceMapTochrome.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 新增忽略 *.mdexample/
.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,

Comment on lines 88 to +97
getExtMessageSender(): ExtMessageSender {
const sender = this.sender as RuntimeMessageSender;
if (!sender) {
// postMessage 通道(如 Offscreen→SW)没有 RuntimeMessageSender
return {
windowId: -1,
tabId: -1,
frameId: undefined,
documentId: undefined,
};
Copy link

Copilot AI Apr 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里新增了 sender 为空的兜底分支,但现有单测(packages/message/server.test.ts)只覆盖了 sender 为对象/无 tab 的情况,没有覆盖 null/undefined sender 时不崩溃并返回默认值的行为。建议补充对应测试用例以防回归。

Copilot uses AI. Check for mistakes.
Comment on lines 100 to 106
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)));
});
Copy link

Copilot AI Apr 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里修复了 connect() 返回的 WindowMessageConnect 需要用 WindowPostMessage 包装以确保 sendMessage 带 "" 的 targetOrigin;但当前 window_message.test.ts 主要覆盖 SW 通道,不覆盖 WindowMessage.connect 的行为。建议增加单测验证 connect 后的 con.sendMessage 会调用 target.postMessage(message, ""),避免该回归再次出现。

Copilot uses AI. Check for mistakes.
Comment on lines +8 to +11

# Docs & examples
*.md
example/
Copy link

Copilot AI Apr 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 描述主要聚焦 CI/vitest/message 修复,但这里额外改动了 Prettier 忽略规则(忽略所有 *.md 以及 example/)。建议在 PR 描述中补充该变更的动机/影响范围,避免后续格式化策略产生误解。

Copilot uses AI. Check for mistakes.
根据 PR #1328 Copilot 评审意见,补充两个单测:
- SenderRuntime.getExtMessageSender() 在 sender 为 null/undefined/空对象时不崩溃并返回默认值
- WindowMessage.connect() 返回的连接 sendMessage 带 "*" targetOrigin
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants