给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
#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 params(api::my_private::PrintString::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
::OutputDebugString(params->data.c_str());
SendResponse(true);
return true;
}
} // namespace extensions
9.在文件extensions\browser\extension_function_histogram_value.h中,找到enum HistogramValue的定义,按照字母表顺序,追加
MYPRIVATE_PRINT_STRING
然后,执行python tools/metrics/histograms/update_extension_histograms.py
10.一切工作准备完毕,可以执行编译命令了。
福利链接:
如何使用Chrome插件,免费上谷歌,谷歌学术,点击打开链接