shikailun的日志

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

Posted on
This entry was posted in technology  and tagged cpp  chrome