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