Skip to content

Commit 7da1b89

Browse files
committed
🧪 补充 message 包单测:sender 兜底 + connect targetOrigin
根据 PR #1328 Copilot 评审意见,补充两个单测: - SenderRuntime.getExtMessageSender() 在 sender 为 null/undefined/空对象时不崩溃并返回默认值 - WindowMessage.connect() 返回的连接 sendMessage 带 "*" targetOrigin
1 parent 6c8a73e commit 7da1b89

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

packages/message/server.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,32 @@ describe("Server", () => {
540540
const extSender = capturedSender!.getExtMessageSender();
541541
expect(extSender.tabId).toBe(-1);
542542
});
543+
544+
it.concurrent("sender 为 null/undefined 时不崩溃并返回默认值", async () => {
545+
// postMessage 通道(如 Offscreen→SW)传入空对象作为 sender,
546+
// SenderRuntime.getExtMessageSender() 应该返回默认兜底值
547+
const senderNull = new SenderRuntime(null as unknown as RuntimeMessageSender);
548+
const extNull = senderNull.getExtMessageSender();
549+
expect(extNull.windowId).toBe(-1);
550+
expect(extNull.tabId).toBe(-1);
551+
expect(extNull.frameId).toBeUndefined();
552+
expect(extNull.documentId).toBeUndefined();
553+
554+
const senderUndefined = new SenderRuntime(undefined as unknown as RuntimeMessageSender);
555+
const extUndefined = senderUndefined.getExtMessageSender();
556+
expect(extUndefined.windowId).toBe(-1);
557+
expect(extUndefined.tabId).toBe(-1);
558+
expect(extUndefined.frameId).toBeUndefined();
559+
expect(extUndefined.documentId).toBeUndefined();
560+
561+
// 空对象(ServiceWorkerMessageSend 实际传入的值)也应正常处理
562+
const senderEmpty = new SenderRuntime({} as RuntimeMessageSender);
563+
const extEmpty = senderEmpty.getExtMessageSender();
564+
expect(extEmpty.windowId).toBe(-1);
565+
expect(extEmpty.tabId).toBe(-1);
566+
expect(extEmpty.frameId).toBeUndefined();
567+
expect(extEmpty.documentId).toBeUndefined();
568+
});
543569
});
544570

545571
describe("Connect 功能测试", () => {

packages/message/window_message.test.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { describe, it, expect, beforeEach, vi, afterEach } from "vitest";
2-
import { ServiceWorkerMessageSend, ServiceWorkerClientMessage, type WindowMessageBody } from "./window_message";
2+
import {
3+
ServiceWorkerMessageSend,
4+
ServiceWorkerClientMessage,
5+
WindowMessage,
6+
type WindowMessageBody,
7+
} from "./window_message";
38
import { Server } from "./server";
49
import type { MessageConnect } from "./types";
510

@@ -160,6 +165,38 @@ describe("ServiceWorkerClientMessage", () => {
160165
});
161166
});
162167

168+
describe("WindowMessage.connect", () => {
169+
it("connect 返回的连接 sendMessage 应带 '*' targetOrigin", async () => {
170+
// 模拟 target window,验证 postMessage 被调用时带 "*"
171+
const targetPostMessage = vi.fn();
172+
const sourceWindow = {
173+
addEventListener: vi.fn(),
174+
} as unknown as Window;
175+
const targetWindow = {
176+
postMessage: targetPostMessage,
177+
} as unknown as Window;
178+
179+
const wm = new WindowMessage(sourceWindow, targetWindow);
180+
181+
const con = await wm.connect({ action: "test/connect", data: "init" });
182+
183+
// connect() 本身会调用一次 postMessage(发送 connect 消息)
184+
expect(targetPostMessage).toHaveBeenCalledTimes(1);
185+
expect(targetPostMessage).toHaveBeenCalledWith(expect.objectContaining({ type: "connect" }), "*");
186+
187+
targetPostMessage.mockClear();
188+
189+
// 通过返回的连接发送消息,也应该带 "*"
190+
con.sendMessage({ action: "test/msg", data: "hello" });
191+
192+
expect(targetPostMessage).toHaveBeenCalledTimes(1);
193+
expect(targetPostMessage).toHaveBeenCalledWith(
194+
expect.objectContaining({ type: "connectMessage", data: { action: "test/msg", data: "hello" } }),
195+
"*"
196+
);
197+
});
198+
});
199+
163200
describe("ServiceWorkerMessageSend ↔ ServiceWorkerClientMessage 双向通信", () => {
164201
// 辅助函数: 将两端连接起来,模拟 postMessage 通道
165202
function createWiredPair() {

0 commit comments

Comments
 (0)