Skip to content

♻️ Offscreen 与 ServiceWorker 通信统一走 postMessage 通道#1299

Merged
CodFrm merged 4 commits intorelease/v1.4from
fix/offscreen-sw-postmessage-blob
Mar 21, 2026
Merged

♻️ Offscreen 与 ServiceWorker 通信统一走 postMessage 通道#1299
CodFrm merged 4 commits intorelease/v1.4from
fix/offscreen-sw-postmessage-blob

Conversation

@CodFrm
Copy link
Member

@CodFrm CodFrm commented Mar 20, 2026

Summary

  • 原先 Offscreen→SW 走 ExtensionMessage(chrome.runtime,JSON 序列化),Blob 等不可序列化数据会丢失
  • ServiceWorkerMessageSend 升级为完整 Message 接口,支持双向 postMessage 通信
  • 新增 ServiceWorkerClientMessage,Offscreen 端通过 navigator.serviceWorker.controller.postMessage() 发送消息
  • 移除 Offscreen 对 ExtensionMessage 的依赖,所有到 SW 的通信统一走 postMessage(结构化克隆,天然支持 Blob/ArrayBuffer)

Test plan

  • TypeScript 类型检查通过
  • 845 个单元测试全部通过
  • 手动测试 GM_xmlhttpRequest 返回 Blob 响应的场景
  • 手动测试后台脚本/定时脚本的 GM API 调用

CodFrm added 3 commits March 20, 2026 12:12
Offscreen 转发 GM API 请求到 ServiceWorker 时,原先走 ExtensionMessage
(chrome.runtime, JSON 序列化),导致 Blob 等结构化数据丢失。
改为通过 postMessage 通道(结构化克隆)双向传输,所有 GM API 自动受益。
所有 Offscreen→SW 通信统一走 ServiceWorkerClientMessage(postMessage),
不再需要 ExtensionMessage(chrome.runtime)。
扩展 offscreen 页面的 controller 通常为 null,改用
navigator.serviceWorker.ready 获取 registration.active 作为 SW 引用。
@cyfung1031
Copy link
Collaborator

AI的提议吗?不错

@CodFrm
Copy link
Member Author

CodFrm commented Mar 20, 2026

AI的提议吗?不错

也不太算,开发过程中发现的问题 😄

Copy link
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 旨在将 Offscreen 与 Service Worker 的通信统一切换到 postMessage(结构化克隆)通道,以避免 chrome.runtime 消息的 JSON 序列化导致 Blob/ArrayBuffer 等数据丢失,并保持现有消息系统(Server/Client/forwardMessage)调用方式不变。

Changes:

  • Service Worker 侧同时接收 ExtensionMessage(chrome.runtime)ServiceWorkerMessageSend(postMessage) 两种通道的消息,并复用同一个 swMessage 实例。
  • Offscreen 侧移除对 ExtensionMessage 的依赖,改用 ServiceWorkerClientMessage 通过 navigator.serviceWorker 向 SW 发送消息。
  • ServiceWorkerMessageSend 升级实现完整 Message 接口,并新增 ServiceWorkerClientMessage 用于 Offscreen→SW 的 postMessage 发送。

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/service_worker.ts 引入并复用 ServiceWorkerMessageSend,Server 同时监听 runtime 与 postMessage 两通道
src/offscreen.ts Offscreen 端改用 ServiceWorkerClientMessage 向 SW 发送消息(支持结构化克隆)
src/app/service/offscreen/script.ts 构造参数重命名与发送器替换为通用 msgSender
src/app/service/offscreen/index.ts 移除 ServiceWorkerClient 依赖,统一用 sendMessage(msgSender, ...)forwardMessage
packages/message/window_message.ts ServiceWorkerMessageSend 扩展为完整 Message;新增 ServiceWorkerClientMessage

修复 messageHandle 处理 sendMessage 时未传 sender 导致 SenderRuntime
访问 undefined 属性崩溃的问题,传入空对象表示后台脚本来源。
新增 11 个单元测试覆盖双向 postMessage 通道的核心链路。
@CodFrm CodFrm merged commit d990045 into release/v1.4 Mar 21, 2026
4 checks passed
@CodFrm CodFrm deleted the fix/offscreen-sw-postmessage-blob branch March 21, 2026 16:24
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.

3 participants