NPAPI

by Yan Sheng

近来在写一个 Chrome 扩展, 大概需求是截取地图, 传到后台分析地图图片上的一些位置并返回给前台, 最后存坐标入数据库. 其中分析这步, 是部署在IIS上的C#程序, C#再去调用底层的C++算法. 虽说 Chrome 扩展中可以发送跨域请求, 不过还是感觉绕了一大圈. 偶尔看到扩展中可以载入 Plugin 并可以被 js 调用. 于是, 琢磨了下这类 Plugin 的写法. 如果可以的话, 那就可以在Chrome里面分析图片上的位置直接返回.

这相关的资料, 网上找了一圈, 都比较零散, 要么就是非常成旧的, 以致刚开始看比较晕. 所以这边就整理下思路:

首先, Chrome 扩展对 Plugin 的使用说明, 官方有 Chrome扩展对NPAPI的使用说明 , 只要按照上面的写法就能载入 Plugin.

但是如何去生成这个 Plugin 呢? 而且什么是 NPAPI 呢? 对于我这种刚开始连 Plugin 是干嘛的都不知道的人来说... 简直就是无从下手.

网上胡乱搜了一圈的资料, 感觉比较有用的就是:

我自己总结下就是:

那差不多了解了, 就可以依据 NPAPI 的规范来开发浏览器 Plugin 了.

NPAPI 有 提供 SDK , C代码, 看头文件的话, 定义了一些 initialize/new/destory等方法和数据类型(里面列出的所有API说明, 可以在 这篇博文 中找到, 这也是一篇很好的文章).

此sdk还包含 linux/mac 的示例代码. 尝试了 mac 下 xcodeproj, 编译之后可以生成一个 BasicPlugin, 然后把这个 .plugin 文件拷贝到用户目录下的 Internet Plugins 目录, 重启浏览器, 打开示例页面, 照理应该可以载入了, 但我这边一直提示没有正确载入. 鉴于老早就把 C/C++ 语言忘得一干二净了, 所以也不知道该改哪边.

这个 sdk, 不好的地方是, 需要对不同操作系统分别写代码, 分别编译生成. 针对我们开发者来说, 很不方便.

另外, Mozilla 也提供了针对不同操作系统的 Gecko_SDK (和 npapi-sdk 的几个文件是同步的), 不过光看文档, 里面就一大堆的依赖(真的是一大堆的依赖啊~~~), 没敢尝试下去.

所以找了另一种方式, 使用 FireBreath

- 下载完他的sdk, 解压.
- python fbgen.py                   # 生成新工程模板, 好处在于她把所有操作系统平台下的模板代码都生成好了, 爽, 基本上只要填空就行了.
- ./prepmac.sh                      # 预编译过程, 在mac下会生成 xcodeproj.
- 进入 build 目录, 执行 xcodebuild    # 真正编译, 生成 plugin. 搞定且成功载入到页面.

最后总结就是, 要快速开发跨平台跨浏览器插件, 使用 FireBreath 开发遵循 NPAPI 规范的插件.

ChromePluginsFireBreathnote