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等,还是需要去仔细看看官方文档的。