2007年9月28日星期五

我也说一下Firefox 扩展和插件的区别

http://www.cnbeta.com/articles/40007.htm
这篇文章提到了在Firefox/Mozilla系浏览器中所谓扩展(extensions)和插件(plugins)的区别。
其实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控件却是所谓的“流氓软件”。

没有评论:

发表评论