Chromium 通过IDL方式添加扩展API

基于chromium103版本

1. 自定义扩展API接口

Chromium 通过IDL方式添加扩展API

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

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

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

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

1 chromebrowserextensionsapi 2 chromebrowserextensions* 3 chromecommonextensionsapi 4 chromecommonextensions*

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

1 extensions* 2 extensionsbrowserapi 3 extensionscommonapi 4 extensionscommonmojom

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

3.  新增一个myInterface.idl文件

srcchromecommonextensionsapimyInterface.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)

srcchromebrowserextensionsapimyInterfacemyInterface_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)

srcchromebrowserextensionsapimyInterfacemyInterface_api.cc

 1 #include "chrome/browser/extensions/api/myInterface/myInterface_api.h"  2 // 这个是自动生成的,在目录"genchromecommonextensionsapi"下  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. 添加编译文件

srcchromebrowserextensionsBUILD.gn

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

7. 设置 api 接口权限

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

srcchromecommonextensionsapi_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文件末尾添加如下内容:

srcchromecommonextensionsapi_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添加中接口定义文件:
srcchromecommonextensionsapiapi_sources.gni

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

在 srcchromecommonextensionsapigenerated_externs_list.txt 末尾添加 afree.idl

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

在srcchromecommonextensionspermissionschrome_api_permissions.cc文件中,找到constexpr APIPermissionInfo::InitInfo permissions_to_register[] =,添加如下内容:

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

在 srcextensionsbrowserextension_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 值

srcextensionscommonmojomapi_permission_id.mojom 中,定义自己的 api id,在最大值的基础上加1

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

11. 编译生成即可

ninja -C outDebugX64 chrome

12. 调用方法

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

发表评论

评论已关闭。

相关文章