【chromium】chromium IPC:mojo、mojom 实例;form:Intro to Mojo & Services

本文详细解析了Chromium中使用Mojo IPC框架,从渲染器进程向浏览器进程发送消息的过程。首先定义了一个mojom接口,接着在渲染器进程中创建Remote和PendingReceiver,通过Remote的Ping方法发送消息,并设置回调处理响应。在浏览器进程中,实现了接口的接收端PingResponderImpl,接收PendingReceiver并响应消息。整个过程中,确保Remote和Receiver的生命周期得以维持,以保证消息的正确传递。

文章目录

过程

来自:Intro to Mojo & Services

  • 实现:将消息从render 发送到browser 进程的RenderFrameHostImpl 实例处,这个实例和render frame 相关联。
  1. 定义接口。
  • 创建一个 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);
};
  • 加上相应构建规则,以实现对上述定义的 C++绑定
# src/example/public/mojom/BUILD.gn
import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") {
  sources = [ "ping_responder.mojom" ]
}
  1. 添加一个pipe 、Remote
  • 添加一个 message pipe 以使用这个接口。
    • 通常 Remote 端 为创建管道一方,因为其通常先发送消息。
  • 将下面代码放在renderer 中
    • 创建一个RemotePendingReceiver ,后者只是为了编译期强类型,表明端点希望被Receiver 端同接口类型 绑定。
// src/third_party/blink/example/public/ping_responder.h
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 的端点)
  1. Remote端通过调用Ping 来发送消息。
  • 实现回调、发送消息。
    • 回调通过 mojom接口 -> 底层通道 -> mojom 接口实例 -> browser 侧。
// src/third_party/blink/example/public/ping_responder.h

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值