首页 > 其他分享 >Chromium 通过IDL方式添加扩展API

Chromium 通过IDL方式添加扩展API

时间:2023-10-21 11:57:12浏览次数:36  
标签:API src chrome myInterface IDL api extensions common Chromium

基于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)})

标签:API,src,chrome,myInterface,IDL,api,extensions,common,Chromium
From: https://www.cnblogs.com/rmb999/p/17778578.html

相关文章

  • fastapi接口参数限制
    路徑的例子Path(title="TheIDoftheitemtoget")查詢參數Query(title="Querystring",description="Querystringfortheitemstosearchinthedatabasethathaveagoodmatch",min_length=3,)body的字段Field(defau......
  • fastapi设置超时时间
    方法一:应用级别的超时设置一种设置FastAPI应用程序全局超时时间的方法是使用TimeoutMiddleware中间件。以下是一个示例:fromfastapiimportFastAPIfromfastapi.middleware.timeoutimportTimeoutMiddlewarefromdatetimeimporttimedeltaapp=FastAPI()#设置应用......
  • 实用API管理平台推荐:Apipost
    在数字化时代,API已成为企业和开发者实现数据互通、应用集成的重要桥梁。然而,随着API数量的不断增加,API设计、调试、文档和测试等工作也变得越来越复杂。为了解决这一痛点,一款名为Apipost的API协同研发工具应运而生,它为API开发者提供了一站式解决方案。成功案例许多知名的公司和团队......
  • 实验二测试结果——openssl API使用
    sm3加密代码及测试截图sm3代码:用sm3加密“20211115fanyiqing”生成摘要值作为输出。1#include<stdio.h>2#include<string.h>3#include"openssl/evp.h"4#include"err.h"56voidtDigest(){7unsignedcharmd_value[EVP_MAX_MD_SIZE];......
  • 云图说|初识API中心APIHub
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。摘要:API中心是为API开发者和应用开发者构建的海量API的汇聚运营平台。通过统一汇聚和持续运营,贯通......
  • Eplan API 初始化
    Eplan支持的开发方式一共有3种脚本dll文件形式exe离线程式形式虽然eplan二次开发也支持vb语言,但这里只讨论c#脚本(script)Eplan脚本支持的功能有限,有限的原因在于其支持的程序集有限c#中的System;System.XML;System.Drawing;System.Windows.FormsEpalnAPI中的Names......
  • Chromium Mojo通信
    Mojo 是一个跨平台IPC框架,它诞生于chromium,用来实现chromium进程内/进程间的通信。目前,它也被用于ChromeOS。在我们代码应用中,如何使用Mojo来作进程间的通信呢,下面就手把手教你怎么使用Mojo!1. 初始化Mojo初始化Mojo有两种方式,一种适用于静态链接Mojo的程序,一种适用于......
  • openssl api使用
    实验要求参考https://blog.csdn.net/bruce135lee/article/details/81811403调用OpenSSLAPI0推荐在openEuler中实现,参考https://www.cnblogs.com/rocedu/p/6012545.html第三节1提交相关代码码云(或github)链接2提交不少于6张编译测试过程截图3至少包含SM4,SM3的测试代码......
  • 实验二 OpenSSL API使用
    sm3代码#include<stdio.h>#include<openssl/evp.h>#include<openssl/err.h>#include<openssl/rand.h>voidhandleErrors(void){ERR_print_errors_fp(stderr);abort();}voidtest_sm3(){unsignedchardata[]="Hel......
  • 205-303 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.17-3.3
    一、水平自动扩容和缩容HPA(K8S版本>=1.23.x)HPA全称HorizontalPodAutoscaler,Pod水平自动伸缩,HPA可以基于CPU利用率replicationcontroller、deployment和replicaset中的pod数量进行自动扩缩容。pod自动缩放对象适用于无法缩放的对象,比如DaemonSetHPA由KubernetesAPI资源和控......