Chromium mojo


参考来自:https://blog.csdn.net/qq_27022241/article/details/10390679

记录下虽然还不知道对不对 

当前使用的是无响应的

render 端

定义接口

chromium\src\example\public\mojom\ping_responder.mojom    定义了mojom文件 来定义一个简单的Logger接口

module example.mojom;

interface PingResponder {
  Ping() => (int32 random);
};

chromium\src\example\public\mojom\BUILD.gn          GN目标生成绑定

import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") {
  sources = [ "ping_responder.mojom" ]
}

确保所有需要此接口的目标都依赖于此接口,在对应模块下的BUILD.gn中添加像这样的一行:

    "//example/public/mojom",

在例子中,因为renderer和browser进程中都需要这个接口 因此两个进程都要在各自的模块下添加依赖

创建管道&发送消息&发送一个PendingReceiver 至Browser

我是在chromium\src\third_party\blink\renderer\core\html\canvas\html_canvas_element.cc/chromium\src\third_party\blink\renderer\core\html\canvas\html_canvas_element.h中整的

这个是成员变量

chromium\src\third_party\blink\renderer\core\html\canvas\html_canvas_element.h

#include "example/public/mojom/ping_responder.mojom.h"
....
//创建管道 mojo::Remote<example::mojom::PingResponder> ping_responder; mojo::PendingReceiver<example::mojom::PingResponder> receiver = ping_responder.BindNewPipeAndPassReceiver();

chromium\src\third_party\blink\renderer\core\html\canvas\html_canvas_element.cc

void OnPong(int32_t num) {}
//发送消息
ping_responder->Ping(base::BindOnce(&OnPong));

在third_party/blink/renderer/core/BUILD.gn    添加依赖

"//example/public/mojom",

browser端

1.实现接口

chromium\src\content\browser\BUILD.gn

    "//example/public/mojom",

chromium\src\content\browser\renderer_host\render_frame_host_impl.cc

PingResponderImpl::PingResponderImpl(mojo::PendingReceiver<example::mojom::PingResponder> receiver)
    : receiver_(this, std::move(receiver)) {}

PingResponderImpl::~PingResponderImpl() {}

// example::mojom::PingResponder:
void PingResponderImpl::Ping(PingCallback callback) {
  // Respond with a random 4, chosen by fair dice roll.
  std::move(callback).Run(4);
}

chromium\src\content\browser\renderer_host\render_frame_host_impl.h

class PingResponderImpl : example::mojom::PingResponder {
 public:
  explicit PingResponderImpl(mojo::PendingReceiver<example::mojom::PingResponder> receiver) ;
  PingResponderImpl(const PingResponderImpl&) = delete;
  PingResponderImpl& operator=(const PingResponderImpl&) = delete;

  ~PingResponderImpl() override ;

  // example::mojom::PingResponder:
  void Ping(PingCallback callback) override ;

 private:
  mojo::Receiver<example::mojom::PingResponder> receiver_;
};

2.注册接口

chromium\src\content\browser\renderer_host\render_frame_host_impl.h

#include "example/public/mojom/ping_responder.mojom.h"
...

class CONTENT_EXPORT RenderFrameHostImpl
...
public:
void GetPingResponder(mojo::PendingReceiver<example::mojom::PingResponder> receiver);
private
  std::unique_ptr<PingResponderImpl> ping_responder_;
}

 

chromium\src\content\browser\renderer_host\render_frame_host_impl.cc

void RenderFrameHostImpl::GetPingResponder(
    mojo::PendingReceiver<example::mojom::PingResponder> receiver) {
  ping_responder_ = std::make_unique<PingResponderImpl>(std::move(receiver));
}

chromium\src\content\browser\browser_interface_binders.cc

void PopulateFrameBinders(RenderFrameHostImpl* host, mojo::BinderMap* map) {
...

  map->Add<example::mojom::PingResponder>(base::BindRepeating(
        &RenderFrameHostImpl::GetPingResponder, base::Unretained(host)));

编译

1.编译生成接口对应的源文件
​ 使用ninja编译目标:

//在src/out/default目录下执行
ninja example/public/mojom

​ 执行完毕后,将会在chromium\src\out\Default\gen\example\public\mojom中生成相应的文件

Chromium  mojo

 

 

2.编译content模块

​ 使用ninja编译:

// 在src/out//Default目录下执行  
ninja content  

​至此,大功告成,编译后会Log输出“hello”。

 

上一篇:Spring Cloud Gateway网关内容?我觉得还OK


下一篇:GateWay的简介和简单使用