基于chromium103版本
1. 自定义扩展API接口
chromium默认扩展api接口中有chrome.runtime.*,和chrome.send.*等,现在我们就仿照chrome.runtime方式来定义自己的接口,供给插件或者网页使用。
其实chromium 增加自定义 api 接口,在原生代码中添加有服务器托管网两种方式,一种是使用json定义,另外一种是使用idl定义。json方式比较繁琐,不太便利,新版本chro服务器托管网mium基本推荐使用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 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)
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 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": [""] 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)})
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
1 卫星影像金字塔分块原理说明 通常我们在工作中使用的卫星影像数据,轻则几百M,重则几百个G甚至上TB级。影像数据太大,是大家经常会遇到的一个问题,尤其是想下载一个省以上数据的时候该问题尤为突出。那么该问题是否有一个比较好的解决方案呢? 以全球为例,我们以19…