ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Chromium mojo

2021-12-04 18:03:54  阅读:433  来源: 互联网

标签:src mojom chromium example public PingResponderImpl 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中生成相应的文件

 

 

2.编译content模块

​ 使用ninja编译:

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

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

 

标签:src,mojom,chromium,example,public,PingResponderImpl,Chromium,mojo
来源: https://www.cnblogs.com/Galesaur-wcy/p/15642737.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有