过程
来自:Intro to Mojo & Services
实现:将消息从render 发送到browser 进程的RenderFrameHostImpl 实例处,这个实例和render frame 相关联。
定义接口。
创建一个 mojom
Ping() 返回值会对应到C++中的回调方法 :返回值对应回调方法的 参数。
// src/example/public/mojom/ping_responder.mojom
module example.mojom;
interface PingResponder {
// Receives a "Ping" and responds with a random integer.
Ping() => (int32 random);
};
# src/example/public/mojom/BUILD.gn
import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") {
sources = [ "ping_responder.mojom" ]
}
添加一个pipe 、Remote 。
添加一个 message pipe 以使用这个接口。
通常 Remote 端 为创建管道一方,因为其通常先发送消息。
将下面代码放在renderer 中
创建一个Remote 、PendingReceiver ,后者只是为了编译期强类型,表明端点希望被Receiver 端同接口类型 绑定。
mojo:: Remote< example:: mojom:: PingResponder> ping_responder;
mojo:: PendingReceiver< example:: mojom:: PingResponder> receiver = ping_responder. BindNewPipeAndPassReceiver ( ) ;
这里的Remote 通过BindNewPipeAndPassReceiver 实现了创建pipe、绑定端口。
Remote 可以在构造的时候传入PendingRemote 以实现绑定, 或者后续使用 Bind 绑定PendingRemote 。(PendingRemote 包含了message pipe 的端点)
Remote端通过调用Ping 来发送消息。
实现回调、发送消息。
回调通过 mojom接口 -> 底层通道 -> mojom 接口实例 -> browser 侧。