经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Omi » 查看文章
Chromium 通过IDL方式添加扩展API
来源:cnblogs  作者:rmb_999  时间:2023/10/23 9:01:25  对本文有异议

基于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. 1 chrome\browser\extensions\api
  2. 2 chrome\browser\extensions\*
  3. 3 chrome\common\extensions\api
  4. 4 chrome\common\extensions\*

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

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

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

3.  新增一个myInterface.idl文件

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

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

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

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

  1. 1 #ifndef CHROME_BROWSER_EXTENSIONS_API_MYINTERFACE_MYINTERFACE_API_H_
  2. 2 #define CHROME_BROWSER_EXTENSIONS_API_MYINTERFACE_MYINTERFACE_API_H_
  3. 3
  4. 4 #include "extensions/browser/extension_function.h"
  5. 5
  6. 6 namespace extensions {
  7. 7
  8. 8 class MyInterfacePrintFunction : public ExtensionFunction {
  9. 9 public:
  10. 10 MyInterfacePrintFunction () = default;
  11. 11 MyInterfacePrintFunction (
  12. 12 const MyInterfacePrintFunction &) = delete;
  13. 13 MyInterfacePrintFunction & operator=(
  14. 14 const MyInterfacePrintFunction &) = delete;
  15. 15 DECLARE_EXTENSION_FUNCTION("myInterface.print", MYINTERFACE_PRINT)
  16. 16
  17. 17 protected:
  18. 18 ~MyInterfacePrintFunction () override = default;
  19. 19
  20. 20 // ExtensionFunction overrides.
  21. 21 ResponseAction Run() override;
  22. 22 };
  23. 23
  24. 24
  25. 25 } // namespace extensions
  26. 26
  27. 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. 1 #include "chrome/browser/extensions/api/myInterface/myInterface_api.h"
  2. 2 // 这个是自动生成的,在目录"gen\chrome\common\extensions\api"下
  3. 3 #include "chrome/common/extensions/api/myInterface.h"
  4. 4
  5. 5 namespace extensions {
  6. 6
  7. 7 //MyInterfacePrintFunction
  8. 8 ExtensionFunction::ResponseAction MyInterfacePrintFunction::Run() {
  9. 9 std::unique_ptr<api::myInterface::print::Params> param =
  10. 10 api::myInterface::print::Params::Create(*args_);
  11. 11 EXTENSION_FUNCTION_VALIDATE(param.get());
  12. 12
  13. 13 return RespondNow(ArgumentList(
  14. 14 api::myInterface::print::Results::Create(api::myInterface::EchoState::ECHO_STATE_OK, "echo " + param->input)));
  15. 15 }
  16. 16
  17. 17 } // namespace extensions

6. 添加编译文件

src\chrome\browser\extensions\BUILD.gn

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

7. 设置 api 接口权限

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

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

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

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

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

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

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

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

  1. 1 schema_sources_ = [
  2. 2 ...
  3. 3 myInterface.idl,
  4. 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[] =,添加如下内容:

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

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

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

10. 定义 APIPermissionID 值

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

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

11. 编译生成即可

ninja -C out\DebugX64 chrome

12. 调用方法

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

原文链接:https://www.cnblogs.com/rmb999/p/17778578.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号