其实Firefox(Mozilla)扩展和插件在各方面都是不一样的,具有完全不同的来源、用途和存在形式.
首先Mozilla的所谓“插件”,具有非常长的历史.它使用一种来自Netscape时代的古老插件API——NPAPI(Netscape Plugin Application Programming Interface), 最初是Adobe的Acrobat部门和Netscape合作,为了在Netscape内显示PDF文件而开发出来的一种插件系统.最初它与浏览器的交互 必须有Java的支持,之后则使用自己的所谓跨平台的XPCOM API模型.
这种插件系统并非跨平台,每个平台的文件格式都有所不同.(参考http: //developer.mozilla.org/en/docs/Gecko_Plugin_API_Reference:Plug-in_Development_Overview) 比如Flash插件,Windows平台下文件名为NPSWF32.dll,是一个Win32 DLL;Mac OS 9下文件名为Flash Player NP-PPC,也是一个动态链接库类型的文件(OS X下文件名类似,但代码部分格式为Mach-O);Linux下名为libflashplayer.so和flashplayer.xpt,是所谓的共享对象文件,等等.
NPAPI经过长期修正,并由Mozilla牵头增加了新的npruntime脚本API,现在已经相当成熟,现在除了Windows平 台上的IE之外几乎所有浏览器(所有Mozilla/Netscape系浏览器、Opera、Safari、Konqueror等)都使用这种插件架构(IE在5.5SP2以前也曾经通过plugin.ocx ActiveX提供过对NPAPI插件的支持,后因“安全原因”废止). 它是一种纯粹的二进制可执行插件,通常是为了支持网页中出现的<object>和<embed>标签中定义的对象而存在,不会增 加浏览器自身的任何功能.而且由于他们的运行权限和浏览器本身相同,因此一旦出错,就可以将浏览器拖死(比如Quicktime for Windows经常导致Firefox非法操作之类常见问题).在Mozilla系列浏览器中,可以通过输入about:plugins查看所有已经启用 的插件信息.
而Firefox及一切Mozilla程序的所谓扩展,和插件的概念大不一样.Mozilla扩展并不是真正的本地代码,而只是使用JavaScript语言编制,使用和各主要Mozilla程序一样的所谓XUL(一种基于XML的用户界面脚本语言)编制界面,通过XPCOM 的XPConnect API与浏览器实现交互.这样使得它具有相当高的跨平台可用性,而且因为它完全在浏览器的JavaScript引擎中运行,使得浏览器能够控制他们的行 为,减少扩展出错导致整个浏览器出错的可能性.
对XUL的依赖使得它只被Mozilla系浏览器支持,在XUL支持不完全的部分此类浏览器(如K- Meleon)中得不到完整的支持.当然,XUL也是个可移植的平台,甚至有XULRunner这类独立的扩展运行环境的存在.
通常在Mozilla系浏 览器中,扩展能做到的事情非常多,能够显示和控制自己和整个浏览器的用户界面,可以直接使用浏览器的功能实现自身与网络的通讯、可以通过XPCOM对浏览 器的渲染引擎进行操作,其用途远远比插件宽泛.扩展自身是.xpi安装包,包含所有组件文件和安装脚本,安装后一般不是单一的文件.
这两 类插件在能力上都无法真正和ActiveX相比,后者在Windows中神通广大,作用范围遍及整个Win32子系统,而对于前者,插件可以执行浏览器以 外的代码,扩展不能对运行环境外部造成除了浏览器本身功能之外的其它影响.目前恶意的NPAPI插件数量极少,而扩展(Firefox中)目前基本上都是 Mozilla的官方站点提供下载,几乎不可能出现恶意扩展;而大量的ActiveX控件却是所谓的“流氓软件”.