自己动手定制Chromium系列之五:修改Chromium源码,给插件(扩展Extension)增加私有API

给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 extensions
9.在文件extensions\browser\extension_function_histogram_value.h中,找到enum HistogramValue的定义,按照字母表顺序,追加
MYPRIVATE_PRINT_STRING

然后,执行python tools/metrics/histograms/update_extension_histograms.py

10.一切工作准备完毕,可以执行编译命令了。

友情链接:

如何使用Chrome插件,免费上谷歌,谷歌学术点击打开链接

如何使用插件iSearch,打造骚气的,有逼格的新标签页,有主角光环的聚合搜索点击打开链接

猜你喜欢

转载自blog.csdn.net/wanwuguicang/article/details/79751541