给Extension增加私有接口,存在两种方式,第一种,是通过JSON文件,定义类似IDL的key value。
这种方式太复杂,已经被官方放弃,今天介绍的是第二种——基于IDL的方式。
可以参见官方文档,链接在此点击打开链接,但文档也并不全面。
我们的目标,新增JS接口chrome.MyPrivate.PrintString()。
也就是,向DebugView.exe输出调试文本。
1.在文件chrome\common\extensions\api\_permission_features.json中,追加如下代码。
"MyPrivate": { "channel": "stable", "extension_types": ["extension"] }
2.在文件chrome\common\extensions\api\_api_features.json中,追加如下代码。
"MyPrivate": { "dependencies": ["permission:MyPrivate"], "contexts": ["blessed_extension"] }
3.在文件chrome\common\extensions\api\BUILD.gn中,找到数组schema_sources的定义,按照字母表顺序,追加如下代码。
"MyPrivate.idl"
4.前面几个步骤,均为指明文件MyPrivate.idl的属性,如何编译,下面开始编写MyPrivate.idl啦。如下所示。
MyPrivate.idl文件的相对路径为:chrome\common\extensions\api\MyPrivate.idl。
内容:
//MyPrivate function namespace myPrivate { interface Functions { // output string static void PrintString(DOMString text); }; };
警告:一定需要注释,一定不要省略注释,否则,编译无法通过!!!
5.在文件chrome\common\extensions\permissions\chrome_api_permissions.cc中,找到permissions_to_register的定义,按照字母表顺讯,追加如下代码。
{ APIPermission::kMyPrivate, "myPrivate"},
6.在文件extensions\common\permissions\api_permission.h中,找到enum ID,按照字母表顺序,添加如下代码。
kMyPrivate
7.在编译配置文件chrome\browser\extensions\BUILD.gn中,找到static_library("extensions"),在其中的sources组数定义中,按照字母表顺序,添加如下代码。
"api/myPrivate/myPrivate.cc","api/myPrivate/myPrivate.h"
8.下面是响应新增扩展接口的C++实现,前面都是准备工作。
新增两个文件,路径分别为:
chrome\browser\extensions\api\myPrivate\myPrivate.h
chrome\browser\extensions\api\myPrivate\myPrivate.cc
myPrivate.h文件内容:
#ifndef CHROME_BROWSER_EXTENSIONS_API_MYPRIVATE_MYPRIVATE_API_H_ #define CHROME_BROWSER_EXTENSIONS_API_MYPRIVATE_MYPRIVATE_API_H_ #include <string> #include "base/scoped_observer.h" #include "chrome/common/extensions/api/my_private.h" #include "extensions/browser/extension_function.h" namespace extensions { class MyPrivatePrintStringFunction : public AsyncExtensionFunction { public: MyPrivatePrintStringFunction(); protected: ~MyPrivatePrintStringFunction() override; virtual bool RunAsync() override; private: DECLARE_EXTENSION_FUNCTION("myPrivate.PrintString", MYPRIVATE_PRINT_STRING); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_API_MYPRIVATE_MYPRIVATE_API_H_
myPrivate.cc文件内容:
#include "chrome/browser/extensions/api/my_private/my_private_api.h" #include "chrome/browser/extensions/chrome_extension_function.h" #include "extensions/browser/extension_function_registry.h" #include "extensions/common/extension.h" namespace extensions { MyPrivatePrintStringFunction::MyPrivatePrintStringFunction() {} MyPrivatePrintStringFunction::~MyPrivatePrintStringFunction() {} bool MyPrivatePrintStringFunction::RunAsync() { std::unique_ptr<api::my_private::PrintString::Params> params(api::my_private::PrintString::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); ::OutputDebugString(params->data.c_str()); SendResponse(true); return true; } } // namespace extensions9.在文件extensions\browser\extension_function_histogram_value.h中,找到enum HistogramValue的定义,按照字母表顺序,追加
MYPRIVATE_PRINT_STRING
然后,执行python tools/metrics/histograms/update_extension_histograms.py
10.一切工作准备完毕,可以执行编译命令了。
友情链接:
如何使用Chrome插件,免费上谷歌,谷歌学术,点击打开链接
如何使用插件iSearch,打造骚气的,有逼格的新标签页,有主角光环的聚合搜索,点击打开链接。