经过一个月的奋战,Firefox 插件算是出炉了。。
现在反过来去想想那些经历的过程,连自己最开始写的文档都看不大清楚。重新来吧。从实战中总结。
1. 为什么选择 plugins。
原因有二。
一、支持 plugins 实现的 NPAPI 被其他浏览器所支持,如 chrome, opera,safari , mozilla 这些都支持该接口。(To see:Scripting_plugins)另外,也被多种系统支持,Linux,Mac,都ok。
二、他们说在 Firefox 下实现类似 IE 下 ActiveX 插件的,即是 Plugins。而非 Extention。So I made it like this. 今天整理文档的时候发现,其实有一篇文章非常之好,Browser Plugins vs Extensions – the difference 。
2、NPAPI 是怎么一回事?
最简单的一句话:Netscape Plugins API 。
开山文档:Plug-in Basics 。
关键词:
@1. about:plugins 浏览器地址栏输入该命令,可拿到浏览器安装的所有 plugins;
@2. MIME Types:需要指定 MIME 类型,这样 JS 代码才能识别该插件,注:插件放在服务器上后,需要给服务器设置该值;
@3. plugins 工作四步骤:找符合 MIME 类型的 plugins,将插件代码加载到内存,初始化 plugins,创建一个 plugins 的实例;前提:页面中出现 embed 。。
@4. 两类函数: NPP(插件实现的方法),NPN(浏览器来实现的);
@5. Runtime Model:NP_Initialize(Gecko calls it,在插件代码第一次加载时),NPP_New(浏览器在实例创建时调用这个函数),NPP_Destroy(实例销毁时,Gecko 调用它),NP_Shutdown(当最后一个实例被销毁时,Gecko 调用该函数,这时候内存将释放 插件 代码);
@6. 确定的路径,/plugins/npXX.dll,规范的 mozilla 结构路径才可以被 Gecko 识别;(xpi 都有严格的路径要求)
3、怎么实现 NPAPI?
参考文档:Plug-in Development Overview 。
参考实例:npruntime。
关键路径:
@1. 找来 npruntime 的例子,编译运行,写个 test.html 页面,测试其中的功能点,有个感性认识;
@2. 想几个问题:与 JS 交互的属性方法如何定义?整个 npapi 的入口在哪?方法属性如何定义?进一步说,浏览器又怎么识别插件实现的方法呢?
@3. 首先,理解 npp 与 npn (查阅条目 2 中的@4),可知插件要实现的功能要从 npp 入手,进一步就是从 NPP_New 入手,在 NPP_New 中可以创建一个对象实例,而这个对象就是你所设计的要实现的插件的功能类,当然最重要的是,要把创建的实例,送给 NPP 的 pdata;代码如下:
@4. 如何定义与 JS 交互的属性方法?其中可知 npnfunctions 中有关于 property 与 method 方法,考虑在实现 plugins 的对象中实现这个方法。只需将自己想要的方法或者属性名放置其中,即可被识别。如下代码示例:
@5. 那这些方法是如何实现的,属性怎么赋值的呢?其中,方法利用了 invoke 回调函数,而属性则利用 GetProperty 和 SetProperty 方法来实现。
这些步骤之后,基本就会对 NPAPI 有个了解了。其间,从井老师那里受到了很多启发。而 npruntime 是一个很好的实例,可拿来改写~不过,问题还在后边,即:能否利用 NPAPI 封装 IE 的 ActiveX 插件。
continue。。