iframe-messaging

文档发表:2026-06-25 · 阅读:118 · 更新:2026-08-07

iframe ↔ 宿主消息协议(postMessage 层)

iframe goods 与父窗口通信的唯一消息层。RPC 语义见 bridge-ipc.md,注册协议见 goods-protocol.md。 实测来源: core/shell-rpc.js bootRpcForwarder() + goods/* 源码。新增消息类型须在此登记。

上行(iframe → parent.postMessage)

type字段用途接收端
qqq-rpc{qood, method, id, params}通用 RPC 调用 bridge 方法。method=store.get/set/getLocal/setLocal 特殊路由到全局/项目 SQLite;其余按 . 拆解直达 window.qqqideBridgeparams.__spread=true 时 args 数组解包为多参数shell-rpc.js
qqq-key{accel, scope}快捷键转发(key-hook 分发 Q/W/Space/1/2 等)core/key-hook.js
qqq-file-open{path}打开文件到左编辑组(预览)shell-rpc.js → CustomEvent → tab-manager
qqq-file-open-right{path, readOnly?, search?}打开到右编辑组shell-rpc.js → qqqTabs.openFileInRightGroup
qqq-editor-refresh{path, content}实时刷新已打开编辑器内容(chat.txt 等)shell-rpc.js → qqqEditor.refreshLiveContent
qqq-command{cmd, url?}通用命令,gaea-host 分发(含 workbench.view.explorer 等)shell-rpc.js → CustomEvent → gaea-host.js
qqq-sfx{name}统一音频机器音效请求(父窗口 300ms 去重 + 语义映射)shell-rpc.js → bridge.audio.play。语义表见 audio-api.md
qqq-ai-attach{path, isDir}文件喂给焦点 AI 面板(编辑框 📎 chip)ai-panel/panel-send.js
qqq-floor-indicator`{action: show\hide, html, panel}`跨面板豆腐块渲染(贴面板 sash 边缘 + 1/2/q/w 按键标记)shell-rpc.js
qqqide-theme-request请求父窗口推送当前主题core/qqqide-theme.js

下行(parent → iframe.contentWindow.postMessage)

type字段用途消费方
qqq-rpc-reply{id, result, error}qqq-rpc 回复(id 对应)各 goods rpc() 封装
qqqide-theme-change{dark}主题切换广播q2-roam / rage / git / kope 等全部 goods
qqqide-roam-changed{key, value}Roam OS 级数据跨窗口/跨 iframe 同步q2-roam.js _onRoamChanged
qqq-lang-change语言切换广播(i18n)core/i18n.js translateUi()

约定

  • 一律 '*' targetOrigin(同源 file:// 协议,无安全收益,跨域 iframe 需要)。
  • 上行消息 e.data.type 为前缀字面量;下行 type 命名建议统一 qqqide-*(宿主级)。
  • 新增上行消息:接收逻辑必须写在 shell-rpc.js bootRpcForwarder() 内(唯一消息入口),禁止散落。
  • 快捷键/命令类消息优先走 qqq-key / qqq-command 现有通道,不另造通道。