基于chromium103版本

1. 自定义扩展API接口

chromium默认扩展api接口中有chrome.runtime.*,和chrome.send.*等,现在我们就仿照chrome.runtime方式来定义自己的接口,供给插件或者网页使用。

其实chromium 增加自定义 api 接口,在原生代码中添加有两种方式,一种是使用json定义,另外一种是使用idl定义。json方式比较繁琐,不太便利,新版本chromium基本推荐使用IDL方式来定义接口。

原生的api接口代码根据作用不同,分布在不同位置:

chrome使用的API所在位置(文件路径在src/chrome/browser/extensions/):

1 chrome\browser\extensions\api
2 chrome\browser\extensions\*
3 chrome\common\extensions\api
4 chrome\common\extensions\*

chrome公共使用所在位置(文件路径在src/extensions/browser/):

1 extensions\*
2 extensions\browser\api
3 extensions\common\api
4 extensions\common\mojom

2. 自定义一个接口myInterface.print

3.  新增一个myInterface.idl文件

src\chrome\common\extensions\api\myInterface.idl

 1 // Use the <code>chrome.myInterface</code> API to myInterface
2 namespace myInterface{
3 // myInterface State.
4 enum EchoState {
5 OK,
6 ERROR
7 };
8 callback EchoStateCallback = void(EchoState state, DOMString out);
9
10 interface Functions {
11 // pring string.
12 static void print(DOMString input, EchoStateCallback callback);
13 };
14 };

4. 实现C++接口头文件(在下面文件路径新增一个myInterface.h)

src\chrome\browser\extensions\api\myInterface\myInterface_api.h

 1 #ifndef CHROME_BROWSER_EXTENSIONS_API_MYINTERFACE_MYINTERFACE_API_H_
2 #define CHROME_BROWSER_EXTENSIONS_API_MYINTERFACE_MYINTERFACE_API_H_
3
4 #include "extensions/browser/extension_function.h"
5
6 namespace extensions {
7
8 class MyInterfacePrintFunction : public ExtensionFunction {
9 public:
10 MyInterfacePrintFunction () = default;
11 MyInterfacePrintFunction (
12 const MyInterfacePrintFunction &) = delete;
13 MyInterfacePrintFunction & operator=(
14 const MyInterfacePrintFunction &) = delete;
15 DECLARE_EXTENSION_FUNCTION("myInterface.print", MYINTERFACE_PRINT)
16
17 protected:
18 ~MyInterfacePrintFunction () override = default;
19
20 // ExtensionFunction overrides.
21 ResponseAction Run() override;
22 };
23
24
25 } // namespace extensions
26
27 #endif // CHROME_BROWSER_EXTENSIONS_API_MYINTERFACE_MYINTERFACE_API_H_

5. 实现C++接口CC文件(在下面文件路径新增一个myInterface.cc)

src\chrome\browser\extensions\api\myInterface\myInterface_api.cc

 1 #include "chrome/browser/extensions/api/myInterface/myInterface_api.h"
2 // 这个是自动生成的,在目录"gen\chrome\common\extensions\api"下
3 #include "chrome/common/extensions/api/myInterface.h"
4
5 namespace extensions {
6
7 //MyInterfacePrintFunction
8 ExtensionFunction::ResponseAction MyInterfacePrintFunction::Run() {
9 std::unique_ptr<api::myInterface::print::Params> param =
10 api::myInterface::print::Params::Create(*args_);
11 EXTENSION_FUNCTION_VALIDATE(param.get());
12
13 return RespondNow(ArgumentList(
14 api::myInterface::print::Results::Create(api::myInterface::EchoState::ECHO_STATE_OK, "echo " + param->input)));
15 }
16
17 } // namespace extensions

6. 添加编译文件

src\chrome\browser\extensions\BUILD.gn

1 "api/myInterface/myInterface_api.cc",
2 "api/myInterface/myInterface_api.h",

7. 设置 api 接口权限

在 _api_features.json 文件末尾添加如下内容:

src\chrome\common\extensions\api\_api_features.json

1 ,
2 "myInterface": [{
3 "channel": "stable",
4 "contexts": ["blessed_extension"]
5 }, {
6 "contexts": "all",
7 "channel": "stable",
8 "matches": ["<all_urls>"]
9 }]

在 _permission_features.json文件末尾添加如下内容:

src\chrome\common\extensions\api\_permission_features.json

1 ,
2 "myInterface": {
3 "channel": "stable",
4 "extension_types": ["extension", "legacy_packaged_app", "hosted_app", "platform_app"]
5 }

8. 添加接口定义文件编译项

在api_sources.gni添加中接口定义文件:
src\chrome\common\extensions\api\api_sources.gni

1 schema_sources_ = [
2 ...
3 myInterface.idl,
4 ]

在 src\chrome\common\extensions\api\generated_externs_list.txt 末尾添加 afree.idl

9. 添加注册信息及常量定义

在src\chrome\common\extensions\permissions\chrome_api_permissions.cc文件中,找到constexpr APIPermissionInfo::InitInfo permissions_to_register[] =,添加如下内容:

constexpr APIPermissionInfo::InitInfo permissions_to_register[] = {
...
{APIPermissionID::kMyInterface, "myInterface"},
};

在 src\extensions\browser\extension_function_histogram_value.h 文件宏定义末尾根据具体宏定义的值添加自己的宏定义,在最大值的基础上加1

1 enum HistogramValue {
2 ...
3 AUTOTESTPRIVATE_ACTIVATEAPPWINDOW = 1864,
4 MYINTERFACE_PRINT = 1865,
5 // Last entry: Add new entries above, then run:
6 // python tools/metrics/histograms/update_extension_histograms.py
7 ENUM_BOUNDARY
8 };

10. 定义 APIPermissionID 值

在src\extensions\common\mojom\api_permission_id.mojom 中,定义自己的 api id,在最大值的基础上加1

1 enum APIPermissionID {
2 ...
3 kScripting = 566,
4 kMyInterface= 567,
...
5 }

11. 编译生成即可

ninja -C out\DebugX64 chrome

12. 调用方法

chrome.myInterface.print("hello world",function(state,out){console.log(state,out)})

Chromium 通过IDL方式添加扩展API的更多相关文章

  1. iView组件添加API中介绍的事件的方式(render方式添加事件)

    iView组件好用,文档齐全,品质可靠稳定.最大的好处是使用了Vue框架,使很多数据绑定和交互问题变的轻松,是难得的开源前端组件.给作者点个赞.用这个组件来学习Vue.js也是不错的选择. 最近用的比 ...

  2. php添加扩展插件

    给PHP安装扩展的方式有好多 一.重新编译 进入PHP源码目录./configure --prefix=/usr/local/php ...[其他编译参数] 二.通过phpize添加扩展 进入PHP源 ...

  3. 谷歌拼音输入法扩展API开发指南

    为了帮助开发者在谷歌拼音输入法的基本输入功能基础上,开发和定义更丰富的扩展输入功能,谷歌拼音输入法提供了以Lua脚本编程语言为基础的输入法扩展API.利用输入法扩展API,开发者可以编写自定义的输入功 ...

  4. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  5. 【C#】使用IExtenderProvider为控件添加扩展属性,像ToolTip那样

    申明: - 本文适用于WinForm开发 - 文中的“控件”一词是广义上的说法,泛指包括ToolStripItem.MenuItem在内单个界面元素,并不特指继承自Control类的狭义控件 用过To ...

  6. Java基础篇(02):特殊的String类,和相关扩展API

    本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...

  7. MVC5项目中添加Wep API

    一.查看MVC版本,决定你有没有必要看这篇文章 打开web.config,看到以下内容 <dependentAssembly> <assemblyIdentity name=&quo ...

  8. springmvc 用注解方式添加事务不生效解决方法

    springmvc 事务注册有很多种方法,在此我只mark 用注解方式添加transaction不生效的解决办法. springmvc 注解方法添加事务步骤: 1.在 spring的 root-con ...

  9. linux下用phpize给PHP动态添加扩展

    使用php的常见问题是编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,这里就需要用到phpize了. 如我想增加bcmath扩展的支持,这 ...

  10. httpclient 认证方式访问http api/resutful api并获取json结果

    最近,因公司线上环境rabbitmq经常发生堆积严重的现象,于是跟运维组讨论,帮助开发个集中监控所有rabbitmq服务器运行情况的应用,需要通过java访问rabbitmq暴露的http api并接 ...

随机推荐

  1. Taurus .Net Core 微服务开源框架:Admin 插件【4-3】 - 配置管理-Mvc【Plugin-MicroService 微服务】

    前言: 继上篇:Taurus .Net Core 微服务开源框架:Admin 插件[4-2] - 配置管理-Mvc[含请求日志打印] 本篇继续介绍下一个内容: 1.系统配置节点:Mvc - Plugi ...

  2. pytest7.4版本的一个变更,可能会影响你的项目

    pytest7.4版本的一个变更,可能会影响你的项目 本文撰写于 2023.7.10 准备工作 项目结构如下 D:\Gitee\DemoRepo (17.97MB) +-- testCases (1. ...

  3. Python爬虫突破验证码技巧 - 2Captcha

    在互联网世界中,验证码作为一种防止机器人访问的工具,是爬虫最常遇到的阻碍.验证码的类型众多,从简单的数字.字母验证码,到复杂的图像识别验证码,再到更为高级的交互式验证码,每一种都有其独特的识别方法和应 ...

  4. 【RabbitMQ】当队列中消息数量超过最大长度的淘汰策略

    [RabbitMQ]当队列中消息数量超过最大长度的淘汰策略 说明 最近在研究RabbitMQ如何实现延时队列时发现消息进入死信队列的情况之一就是当消息数量超过队列设置的最大长度时会被丢入死信队列,看到 ...

  5. 聊聊Spring注解@Transactional失效的那些事

    一.前言 emm,又又又踩坑啦.这次的需求主要是对逾期计算的需求任务进行优化,现有的计算任务运行时间太长了.简单描述下此次的问题:在项目中进行多个数据库执行操作时,我们期望的是将其整个封装成一个事务, ...

  6. C语言基础-结构体基础

    文章目录 前言 1.结构体的创建 1.1 第一种方法 1.2 第二种方法 1.3 全局结构体和局部结构体的声明 2.结构体的使用 2.1 局部结构体的声明 & 初始化 2.1.1 指针方法 2 ...

  7. Linux下实现程序开机自启(rc.local 和 systemctl)

    需求: 实现了一个程序,需要在ubuntu上跑起来.能开机自启,且崩溃了也能自己重启.有两种实现方式,个人推荐第二种. 方式1: 实现方式: 直接将要启动程序的运行命令加在 /etc/rc.local ...

  8. Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能.但是通过对 Cilium 不同模式的切换/功能的启用,可以 ...

  9. 用 Tensorflow.js 做了一个动漫分类的功能(一)

    前言: 浏览某乎网站时发现了一个分享各种图片的博主,于是我顺手就保存了一些.但是一张一张的保存实在太麻烦了,于是我就想要某虫的手段来处理.这样保存的确是很快,但是他不识图片内容,最近又看了 mobil ...

  10. 从一些常见的错误聊聊mysql服务端的关键配置

    背景 每一年都进行大促前压测,每一次都需要再次关注到一些基础资源的使用问题,订单中心这边数据库比较多,最近频繁报数据库异常,所以对数据库一些配置问题也进行了研究,本文给出一些常见的数据库配置,说明这些 ...