Mozilla NPAPI ( Part 3 )

经过一个月的奋战,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。。

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值