这几天在看这部分内容,终于有些眉目了。大概整理下。
1. 实现类似 IE 下 ActiveX 插件的东西,开始以为可以继续又玩 XPCOM 了,但后来发现 Extention 和要实现的东西不是一码事,NPAPI 出现。
2. 那 Extention 能否实现我想要的功能?能否通过 JS 和 Web Server 端进行交互?之前用 Extention 做的都是客户端的,一时转不过弯。据了解,plugins 是为了增强浏览器 browser 自身的一些特殊性,比方说帮助 browser 展示多媒体文件;而 Extention 则可以给 FF 换个肤之类。但,我好像还是不明白。
说服我去使用 NPAPI 主要是因为第 3 条。。
3. 选择 NPAPI 另一方面,是因为除 IE 外的浏览器目前通用 。目前只是从文档中看到,眼可以确定的是 Chrome 是支持 NPAPI 的,为此,选用 NPAPI。
这意味着我要从头学习关于 NPAPI 的东西。。
4. 通过 npruntime 的例子基本理解 NPAPI 在浏览器中是如何被页面引入。类似 IE 的 ActiveX,在 HTML 代码中需要插入 <embed>/<object>,并在其中通过 MIME Type 来找到该插件并注册之,但是如何识别插件是否为最新版本呢?是不是也需要改 rc 文件中的 Version?需进一步验证。但 JS 和 NPAPI 是如何交互的,却完全不同于 XPCOM 与 JS 的交互来的那么明朗,一个 IDL 文件就可以搞定。NPAPI 好像更有些复杂。
本条中,如果测试 npruntime ,需要下载编译该部分代码,当然需要下载 Gecko SDK (or Xulrunner SDK),依据编译文档 编译,其间可能会遇到问题,需要注意的是 def 文件和配置选项中头文件的设置、预处理器设置以及 def 文件链入到链接器中的模块定义中,另外可能需要在 plugin.cpp 中加入 <stdio.h> 文件。这样,基本没什么问题。我拿到的源码是 FF 的 3.6.11 版本。SDK 也是最新的。
有个例子 可知。接下来理解中。。
5. 详解注册 plugins。通过 MIME 类型找到该插件,浏览器发现其支持该 plugin MIME 类型 时,就会加载该 plugin 文件。plugin 的命名须 np 打头,.dll 为扩展名,符合 8.3 规范。
6. Plugin 与 browser 的交互:browser 根据 MOZ_PLUGIN_PATH 寻找到 plugin。
MOZ_PLUGIN_PATH 不同的系统下也不一样,但都是 browser 安装路径。
当 browser 打开包含有 embed 标签的页面时,浏览器则将1)检测该插件是否匹配某一个 MIME 类型;2)加载该插件代码到缓存中;3)初始化插件;4)创建该插件的实例。浏览器可以在一个页面中多次加载同一个插件。
插件第一次被加载时,Gecko 会调用 NP_Initialize 方法;一旦插件被加载,浏览器将调用插件的 NPP_New 方法创建插件的一个实例;当页面被关闭时,实例被销毁,Gecko 将调用 NPP_Destroy 通知插件要删除该实例;当所有的实例都被销毁掉时,Gecko 将调用 NP_Shutdown,这时,plugin 被请出缓存。
而要想验证一下 plugin 是否已安装,就可以拿 MIME 类型进行判断,如下使用 enabledPlugin 属性的例子:
了解大致中。。continue。