2007年7月1日星期日

Firefox扩展实例分析: IETab (1)

IETab是大家在Windows下常用的Firefox扩展之一,用它可以浏览那些费用IE不可的网页。

大概浏览了一下IETab扩展的文件列表,没几个文件,以为这个插件比较简单,也就是嵌入了一个IE的ActiveX进来,再处理一下对应的命令等。

但仔细琢磨一下就发现没有那么简单,怎么嵌入一个IE进去?看了这么久的XUL相关资料,都没有看到哪里讲解当“控件”不够用时应该怎么办,得改Gecko的源代码?

查看IETab发现它采用的是另外一条思路: 将IE的ActiveX控件包装成一个插件,跟Flash等插件一样,采用HTML的object标签嵌入。
object id="IETab" type="application/ietab" style="width: 100%; height: 100%;"
跟IE里面广泛使用的ActiveX不一样,这里这种插件是采用原来netscape定义的NPAPI接口与浏览器打交道的,这个API接口是cross-browser的(倒是IE 5.5之后似乎不再支持这个API接口,你得用另一个ActiveX控件来增加NSAPI支持,这跟Firefox上的npActiveXPlugin恰好相反,后者是用NPAPI包装了一个ActiveX容器,使得ActiveX控件可以在Firefox中使用)。

这个npietab.dll插件对外提供了navigate(), goBack()/goForward(), refresh(), stop(), saveAs()等方法和title, url等属性(详见nsIIeTabPlugin.idl),基本上都是原来IE控件相应功能的一个包装(详见nsScriptablePeer.cpp文件),只是为了可以在Firefox中可以再访问这些接口(那么npActiveXPlugin对外提供那些接口呢?不同的ActiveX有不同的功能接口,npActiveXPlugin怎么就能通用于各个ActiveX呢?难道它目前没有提供可脚本化scriptability的能力? 没源代码就是不一样,琢磨起来比较费劲)

没有评论: