Skip to content

fix connection cleanup#1474

Merged
CodFrm merged 4 commits into
release/v1.4from
fix/connection/cleanup/001
Jun 1, 2026
Merged

fix connection cleanup#1474
CodFrm merged 4 commits into
release/v1.4from
fix/connection/cleanup/001

Conversation

@cyfung1031
Copy link
Copy Markdown
Collaborator

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

Description / 描述

Screenshots / 截图

@cyfung1031 cyfung1031 added the P0 🚑 需要紧急处理的内容 label May 31, 2026
@CodFrm CodFrm requested a review from Copilot June 1, 2026 02:04
@CodFrm
Copy link
Copy Markdown
Member

CodFrm commented Jun 1, 2026

Claude的回复,都是我本地跑了然后提交上来的

Claude有个开源项目活动,还差500 star,想要不在更新日志页面/安装页面引导一下来点star 👀

2383701069368bac0a00f9b5dee41b6b

(OpenAI似乎也有相关的活动)

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

修复连接清理流程:为各 MessageConnect 实现新增可选的 ignoreAlreadyDisconnected 参数,使得在另一端已经断开的情况下重复 disconnect() 不会抛错;并对 service worker 中 GM_xmlhttpRequest 的早期错误路径以及 ExtensionMessage.onConnect 端口捕获逻辑做了小幅重构以更安全地释放引用。

Changes:

  • MessageConnect.disconnect 接口及其 ExtensionMessageConnect / WindowMessageConnect / MockMessageConnect 实现中新增 ignoreAlreadyDisconnected 选项。
  • 内容侧 GM_xmlhttpRequest 清理函数改为 connect?.disconnect(true),避免在服务端先断开时抛错。
  • service worker 中 throwErrorFn 改为捕获非空 conn 并使用本地 myConn 释放;ExtensionMessage.onConnect 使用 myPort 局部变量避免 port! 断言。
  • MockMessageConnect 在已断开状态下对 sendMessage / onMessage / onDisconnect 抛出明确错误。

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.

Show a summary per file
File Description
packages/message/types.ts MessageConnect.disconnect 接口新增可选参数 ignoreAlreadyDisconnected
packages/message/window_message.ts WindowMessageConnect.disconnect 支持忽略已断开状态
packages/message/extension_message.ts 重构 onConnect 中 port 捕获,cleanup 改用闭包内 this.con,disconnect 增加忽略参数
packages/message/mock_message.ts MockMessageConnect 支持已断开状态的安全访问,disconnect 增加忽略参数
src/app/service/content/gm_api/gm_xhr.ts 清理函数改用 connect?.disconnect(true) 以容忍服务端先断开
src/app/service/service_worker/gm_api/gm_api.ts 重构 throwErrorFn:参数改为非空,用本地 myConn 释放连接引用

@CodFrm
Copy link
Copy Markdown
Member

CodFrm commented Jun 1, 2026

Code Review

整体是一个正确且有价值的修复。核心收益:修了一个真实的旧崩溃——旧 ExtensionMessageConnect.cleanup(con) 在自身 disconnect() 触发时(经 listenerMgr.emit('cleanup') 无参调用)会因 conundefinedcon.onMessage.removeListenerTypeError,连带导致 chrome 监听器未移除、onDisconnect 不派发;新代码改用 this.con 捕获已彻底修好。onConnect 的首消息去重守卫、MockMessageConnect 的 null-safe 化、gm_api.tsconn→myConn 纯重构均正确。tsc 通过,message 相关测试全绿。

下面是审查发现,按严重度排序。


1. (主要)abort() 路径的 disconnect() 漏跟进 ignoreAlreadyDisconnected=true

src/app/service/content/gm_api/gm_xhr.ts:728

abort: () => {
  if (connect) {
    connect.disconnect();   // ← 未传 true
    connect = null;
  }
  ...

本 PR 给 refCleanup(gm_xhr.ts:309)加了 disconnect(true),但同一函数内 abort() 的断开点漏改。gm_xhr 没有注册任何 onDisconnectconnect 变量只在 refCleanup(经 onloadend 触发)里才置 null。

触发场景:MV3 service worker 在请求进行中被回收 → content 端口收到 onDisconnectExtensionMessageConnect.cleanupthis.con 置 null;但因没有 onloadend,connect 变量仍非空。用户脚本随后调用 xhr.abort()connect.disconnect()!this.con 命中 → 抛 Attempted to disconnect on a disconnected port.,错误冒泡进用户脚本。

修复connect.disconnect(true);

2. (主要)GM_download 的 abort() 同样漏改

src/app/service/content/gm_api/gm_api.ts:1192

abort: () => {
  aborted = true;
  connect?.disconnect();   // ← 未传 true;?. 只挡 JS 变量为 null,挡不住底层 this.con 已断开
  nativeAbort?.();
},

该路径的 onDisconnect 回调只调用 releaseResources()(不会把 connect 置 null),所以远端断开后 connect 变量仍非空。下载进行中 SW 重启/扩展更新导致端口断开后,用户调用 abort() 会抛同样的错误。

修复connect?.disconnect(true);

这两处与本 PR 第 309 行修复的是同一类 bug,建议一并处理,否则修复只覆盖了一半路径。

3. (低/一致性)SW 侧 doLoadEnd 未传 true

src/app/service/service_worker/gm_api/gm_api.ts:790myConn?.disconnect() 与本 PR “容忍已断开” 的意图不一致。实际可达性低(同一微任务内 sendMessage(onloadend)disconnect() 同步连续执行,content 来不及在中间断开),几乎不会触发;建议为一致性同样传 true

4. (外观)三个实现的 disconnect 签名默认值写法不一致

WindowMessageConnectignoreAlreadyDisconnected: boolean = falseExtension/Mock?: boolean。行为等价,建议统一。


最值得处理的是 1 / 2。其余改动未发现新引入的缺陷。

@cyfung1031
Copy link
Copy Markdown
Collaborator Author

fixed in 773b087

可以合并

@CodFrm CodFrm merged commit 5022902 into release/v1.4 Jun 1, 2026
2 of 4 checks passed
@CodFrm CodFrm deleted the fix/connection/cleanup/001 branch June 1, 2026 03:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P0 🚑 需要紧急处理的内容

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants