• Chromium 通过IDL方式添加扩展API


    基于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 chrome.myInterface 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 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": [""]
    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)})

  • 相关阅读:
    【紫光同创国产FPGA教程】【PGC1/2KG第六章】密码锁实验例程
    昇思25天学习打卡营第8天|保存与加载
    玩转Mysql系列 - 第17篇:存储过程&自定义函数详解
    22. 概率与统计 - 贝叶斯统计&机器学习分类指标
    本地部署 EmotiVoice易魔声 多音色提示控制TTS
    誉天在线项目~ElementPlus图片回显
    【Vue+element_ui】生成Ubuntu自定义壁纸幻灯片的核心xml文本
    局域网客户远程密码被暴破 登录为2确认用户没有这样登录过
    2.4 设计多线程的程序
    redis基本工具类编写
  • 原文地址:https://www.cnblogs.com/rmb999/p/17778578.html