Files

60 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WASM / Worker / postMessage 处理
本文件用于网页端 JS 补环境中遇到 Worker、WASM、iframe 或 postMessage 的情况。范围仍然限定在网页端 JS 运行链路,不扩展到 Native 逆向。
## 判断信号
- 目标 JS 调用 `new Worker()`、`SharedWorker()`。
- 入口函数返回 Promise,实际签名在异步消息中完成。
- trace 出现 `postMessage`、`onmessage`、`MessageChannel`。
- Network 中额外加载 `.wasm` 或 worker chunk。
- 加密入口只负责封装消息,真正结果从回调返回。
## 处理顺序
1. 记录主线程调用 `postMessage` 的消息体。
2. 收集 Worker JS、动态 chunk、WASM 文件和初始化参数。
3. 确认 Worker 返回消息格式:成功、失败、初始化完成、签名结果。
4. 如果只是消息转发,优先在 Node 中模拟消息通道,不要直接改算法。
5. 如果 WASM 参与网页签名,只记录 JS 调用边界和导出函数名;不要扩大到 Native 工具链。
6. 读取 `webapi-env-detection-matrix.md`,把 Worker / iframe / postMessage 放入 WebAPI 环境检测矩阵;不只验证 API 存在,还要验证浏览器行为。
7. 用 fixtures 验证异步结果,不以 Promise resolved 为完成。
## Worker / postMessage 必查行为
- Worker scope 必须有独立 `performance`、`timeOrigin`、`performance.now()` 序列;不得无证据复用主线程 performance。
- Worker scope 的 `self` / `globalThis` 必须指向 WorkerGlobalScope 自身;`window`、`document`、`top`、`parent`、`frames`、`localStorage` 等 Window-only API 必须按浏览器 baseline 缺失。
- Worker 的 ECMAScript/WebAPI 构造器和对象实例不得直接复用主 Window Realm 的引用。应验证 `Object`、`Function`、`Array`、`Promise`、`Event`、`EventTarget`、`URL`、`Blob`、`Headers`、`Request`、`Response`、`XMLHttpRequest`、`navigator`、`performance`、`crypto` 的 identity 与 `instanceof`。
- Worker scope 的 `setTimeout` / `clearTimeout` 必须绑定 Worker 私有状态;`Worker.prototype.terminate()` 后 pending timer 和延迟 `postMessage` 必须清理或丢弃。
- 同一 turn 内调用 `terminate()` 后,尚未入队与已经入队但未派发的 Worker message 都要按目标浏览器 baseline 处理;至少分别测试“立即 terminate”和“延迟 terminate”。
- `WorkerGlobalScope.self.postMessage()` 与 `MessagePort.prototype.postMessage()` 必须以后续 task 派发;不得同步触发对端 listener。
- `MessagePort.start()`、设置 `onmessage` 的隐式 start、`close()` 的发送端/接收端组合、entangled peer 解绑和 transfer 后原端口失效必须分别检测。
- sender 已 close、receiver 已 close、双方 close、消息已排队后 close、transfer 后再次 postMessage 都必须有浏览器 baseline;不能只检查 peer 是否 closed。
- `addEventListener` / `removeEventListener` / `dispatchEvent` 必须覆盖 listener object、capture、once、passive、stopImmediatePropagation 和 `handleEvent`。
- `MessagePort.prototype.postMessage(fn)`、`structuredClone(fn)` 的 `DataCloneError` name / message / stack 不能暴露 JS fallback 源码。
- iframe 参与消息链时,单独检查 `contentWindow`、`contentDocument`、`defaultView`、`srcdoc`、`document.write/close`、Window/IframeWindow ownKeys / ownNames。
- 如果真实浏览器进入 final writer,而 Node 停在 continuation / reload writer,必须把 Worker / performance / iframe / postMessage 时序列入 writer 分支 diff。
## 记录模板
```markdown
## Worker/WASM 消息链
- 主线程文件:
- Worker 文件:
- WASM 文件:
- 初始化消息:
- 签名请求消息:
- 签名响应消息:
- 依赖的浏览器环境:
- Node 模拟策略:真实 Worker / vm 模拟 / 手动封装消息通道
- 任务队列语义:同步 / 后续 task / microtask / timer
- Worker performance baseline:
- terminate 后 timer / postMessage 行为:
- MessagePort sender/receiver close、start、transfer:
- Worker Realm 构造器与对象 identity:
- iframe realm / ownKeys 状态:
- WebAPI 环境检测矩阵:
- 阻塞点:
```