Chrome扩展API的简单实现
Chrome 提供了很多的API,运用这些API可以开发非常丰富的扩展程序,不过这些API有时候并不能满足我们的需求,比如最小化Chrome到托盘、关闭Chrome甚至关机等系统级操作。。。
下面来介绍一下如何去实现自己的扩展API供前端调用。
第一步 定义扩展
Chrome扩展API有两种定义方式,一种是用IDL,另一种是JSON格式,由于我对IDL不熟悉,这里采用JSON (注:如果采用IDL申明速度会快很多,Chrome会自动引入头文件)。
Chrome规定所有的自定义API必须在experimental的命名空间下(如chrome.experimental.foo.myapi)。
在\chromium\src\chrome\common\extensions\api\下添加experimental_foo.json 内容可以参考Chrome的其他JSON文件,可以看该文件夹下有很多API申明,比较夸张的有蓝牙、录音、进程控制,这些将来应该会在新版本的Chrome中所支持,想想以后的扩展程序都可以干什么吧~~差不多是一个OS了!
//experimental_foo.json
// 测试API
[
{
"namespace": "experimental.foo",
"nodoc": true,
"types": [],
"functions": [
{
"name": "closeChrome",
"type": "function",
"description": "just test closing the chrome.",
"parameters": [
{
"type": "string",
"name": "hostname",
"minLength": 1,
"description": "just test the parameter."
}
]
}
]
}
]
然后把JSON文件包括在chrome/common/extensions_api_resources.grd和chrome/common/extensions/api/api.gyp两个文件中
<include name="IDR_EXTENSION_API_JSON_FOO" file="extensions\api\experimental_foo.json" type="BINDATA" /> 'experimental_foo.json',
第二步 实现扩展
定义我们的API后就可以去用C++实现了, 在chrome/browser/extensions/api/添加foo文件夹并添加头文件和实现类:
/*foo_api.h*/
#ifndef CHROME_BROWSER_EXTENSIONS_API_FOO_FOO_API_H_
#define CHROME_BROWSER_EXTENSIONS_API_FOO_FOO_API_H_
#include "chrome/browser/extensions/extension_function.h"
namespace extensions {
class BazExtensionFunction : public AsyncExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION_NAME("experimental.foo.closeChrome");
protected:
virtual ~BazExtensionFunction() {}
virtual bool RunImpl() OVERRIDE;
};
}
#endif
/*foo_api.cc*/
#include "chrome/browser/extensions/api/foo/foo_api.h"
namespace extensions {
bool BazExtensionFunction::RunImpl() {
//参数检测
//你的C++实现
SendResponse(true /* success */);
return true;
}
}
关于实现中各种方法请参考http://dev.chromium.org/developers/design-documents/extensions/proposed-changes/creating-new-apis。
实现后在chrome/browser/extensions/extension_function_registry.cc中include刚才的头文件foo_api.h,然后注册我们的实现类
#include "chrome/browser/extensions/api/foo/foo_api.h" //测试api RegisterFunction<extensions::BazExtensionFunction>();
第三步 编译
在编译前记得刷新下整个工程(花了一个小时),否则会提示找不到刚才的头文件,如果还是提示找不到,就需要运行chrome的辅助脚本了\tarball\depot_tools\gclient.py
gclient.py runhooks --force
最后就是漫长漫长的编译了~~~~~~~~~~~~~~~~
上面只是一个简单的示例,具体实现时是非常麻烦的,比如扩展分为同步异步,还有自定义events等,还是需要去仔细看看官方文档的。