2008年8月27日星期三

在windows上编译WebKit

通过编译WebKit,可以让我们更进一步的了解、使用WebKit,从中了解WebKit使用哪些外部库,其中包含哪些主要内容等等。初次在windows上编译WebKit,是件比较麻烦的事情,需要注意的问题比较多,再加上相关文档不是很全面。从这个角度看,WebKit的编译系统,相对Gecko的编译系统,要粗糙很多。

下面简单汇总一下自己编译WebKit的过程及所遇到的问题解决方法等

一、按照下面由WebKit.org提供的内容准备编译环境、获取源代码等
Installing the Developer Tools
Getting WebKit
Building WebKit

其中首次获取源代码后需要特别注意的是一定要安装WebKit Support Libraries及运行WebKit/WebKitTools/Scripts/update-webkit成功。

其中WebKit Support Libraries主要包括缺省编译时需要使用的外部库CoreGraphics.lib、CoreFundation.lib、CFNetwork.lib,它们对应Safari所使用的Mac风格图形库及网络库;

而通过分析update-webkit脚本,得知它主要是下载一个WebKitAuxiliaryLibrary.zip并安装到指定目录,其中包括Unicode方面的icuin.lib及icuuc.lib、xml2及xslt方面的libxml2.lib和libxslt.lib、线程相关的pthreadVC2.lib、SQLite相关的SQLite3.lib等外部开源库等;

二、按照下面由Avishkar Autar提供的一篇Blog,修改直接从VS IDE编译WebKit
Avishkar Autar's Blog-Compiling Webkit On Win32
其中详细描述了相关注意事项及相应路径的修改。

三、解决编译过程中可能出现的常见问题
1、问题描述:
vc++2005 error PRJ0002 的问题 错误的结果 1 (从“C:\WINDOWS\system32\cmd.exe”返回)

解决方法:
选中解决方案,选择属性->配置属性->清单工具->输入和输出->嵌入清单,把是改成否。

2、问题描述:
对VC 2005 error C2220:警告被视为错误-没有生成“object"

解决方法:
参考FIX:VC2005编译错误:1 error C2220: 警告被视为错误 - 没有生成“object”文件
选中解决方案,选择属性->配置属性->c/c++->常规->将警告视为错误,把是改成否。

3、问题描述:
正在创建库WebCore.lib : fatal error LNK1106: 文件无效或磁盘已满: 无法查找到 0x51F6CD51

解决方法:
参考FIX:LNK1106:: 无法查找到 0x76364 无效或磁盘已满解决此问题, 添加 /IGNOREIDL 链接选项。
在VisualStudio.NETIDE, 设置此链接器选项请按照下列步骤操作:
a. 打开 属性页 对话框对于项目。
b. 展开 链接 文件夹。
c. 单击要查看嵌入的 IDL 属性页 嵌入的 IDL 。
d. 将 忽略嵌入的 IDL 属性设置 是 。

四、总结分析
通过分析WebKit\WebKitTools\Scripts\build-webkit脚本,可知其在windows环境的编译过程主要是完成VS解决方案WebKit/win/WebKit.vcproj/WebKit.sln中的内容,其中已完成相关基本配置,这样说来其编译系统还是相对比较简单的,但由于需要使用比较多的外部库,并且没有将外部库的编译整合到WebKit的编译系统中,这样往往需要编译或下载、配置(如设置头文件、库文件的路径等)对应版本的外部库。

同时WebKit核心本身编译出来就是一个动态库,而象WinLanucher、FindSafari、DumpRenderTree等外围测试程序反而比较多,编译时也会出现一些问题,对一个初次接触的人来讲往往比较困惑。

编译成功后,可运行脚本WebKit/WebKitTools/Scripts/run-safari通过Safari来使用刚才编译的WebKit动态库,具体可参考Running WebKit

但愿大家都能轻松愉快的编译出WebKit。。。

2008年8月25日星期一

认识了解WebKit

WebKit作为一个浏览器引擎,其第一Release版本在2003年1月发布,虽然出现的相对比较晚,但以其一些优越的特性,获得了诸如Google、Apple、Adobe、Yahoo等公司的青睐,似乎大有赶超Gecko的势头,带着究竟什么是WebKit?其主要特点有哪些?如何应用它?它与其他浏览器内核有哪些不同等疑问,开始认识了解WebKit。。。

一、什么是WebKit?
WebKit is an open source web browser engine. WebKit is also the name of the Mac OS X system framework version of the engine that's used by Safari, Dashboard, Mail, and many other OS X applications.

WebKit is an open source application framework that provides a foundation upon which to build a web browser. WebKit was originally derived from the Konqueror browser’s KHTML software library by Apple, Inc. for use as the engine of Mac OS X’s Safari web browser, and has now been further developed by Apple, Nokia, Google and others. The framework is now used by Omniweb, Shiira, iCab, Adobe AIR, Iris Browser, mobile phones (including the iPhone), Nokia’s Series 60 browser, and Google’s Android platform.

WebKit's HTML and JavaScript code began as a branch of the KHTML and KJS libraries from KDE.

二、WebKit主要特点及其目标
Web Content Engine
The project's primary focus is content deployed on the World Wide Web, using standards-based technologies such as HTML, CSS, JavaScript and the DOM. However, we also want to make it possible to embed WebKit in other applications, and to use it as a general-purpose display and interaction engine.
Open Source
WebKit should remain freely usable for both open source and proprietary applications.

Performance
Maintaining and improving speed and memory use is an important goal. We never consider performance "good enough", but strive to constantly improve. As web content becomes richer and more complex, and as web browsers run on more limited devices, performance gains continue to have value even if normal browsing seems fast enough.

Portability
The WebKit project seeks to address a variety of needs. We want to make it reasonable to port WebKit to a variety of desktop, mobile, embedded and other platforms. We will provide the infrastructure to do this with tight platform integration, reusing native platform services where appropriate and providing friendly embedding APIs.
Compatibility
For users browsing the web, compatibility with their existing sites is essential. We strive to maintain and improve compatibility with existing web content, sometimes even at the expense of standards. We use regression testing to maintain our compatibility gains.

Standards Compliance
WebKit aims for compliance with relevant web standards, and support for new standards
Security
Protecting users from security violations is critical. We fix security issues promptly to protect users and maintain their trust.
WebKit is an engine, not a browser
We do not plan to develop or host a full-featured web browser based on WebKit.
WebKit is not the solution to every problem
We focus on web content, not complete solutions to every imaginable technology need.

三、WebKit主要组成
WebKit作为一个浏览器内核引擎,正如上面所描述,其主要内容专注在浏览器的核心部分Javascript的实现(JavaScriptCore)、布局渲染的实现(WebCore)以及对外接口的支持。

Gecko内核提供了一整套的与浏览器相关的解决方案如包括对NSPR、XPCOM、Network、Extension、XUL等的支持与实现等,但WebKit往往专注于核心部分,其他部分由外壳程序或其他公共库来实现,如其对Http请求的实现可由外部的公共库如libcurl、cf、soup等来提供实现,其本身不提供Http协议实现方面的代码,而Gecko中的Http请求完全由Gecko中的Network部分来实现。

为了跨越更多平台及图形库,WebKit提供了cairo、gtk、mac、win、qt、wxwidget等对外接口的支持,这方面并不比Gecko逊色多少。

对外部嵌入程序而言,WebKit提供了具有浏览器功能的、同时与外壳程序相对应的平台或图形库相关的动态库。如在Safari中WebKit内核仅以一个webkit.dll的形式出现。相对Gecko内核而言,虽然其功能比较少,但其使用起来简单方便,实现代码相对简洁,性能也不错。

四、参考资源
The WebKit Open Source Project
WiKi WebKit
Comparison of layout engines

2008年8月20日星期三

浅谈Gecko关键部分之十四Build System

Mozilla作为一个开源组织,为我们提供了完整的源代码,以便我们进行编译、调试等,为了能真正的运用Gecko内核,我们需要自己动手从源代码中进行编译,进而进行调试,从而真正了解、运用Gecko内核,以致修改、改进Gecko内核,或者自己编写出符合Gecko内核编写规则的应用等。下面提供一些参考资源,以便大家完成编译、调试等。


参考资源

2008年8月17日星期日

浅谈Gecko关键部分之十三Xulrunner

Gecko内核作为一个浏览器内核,为了能充分利用其已有的功能,Mozilla提供了一个可作为运行环境平台的Xulrunner,来扩展Gecko内核的应用。那么究竟什么是Xulrunner、如何实现一个Xulrunner应用程序、它和Firefox、ThunderBird等有什么区别、目前有哪些应用基于Xulrunner等等,通过下面的学习研究,希望能逐步的解答这些疑问。

一、什么是Xulrunner?
XULRunner is a Mozilla runtime package that can be used to bootstrap XUL+XPCOM applications that are as rich as Firefox and Thunderbird. It will provide mechanisms for installing, upgrading, and uninstalling these applications. XULRunner will also provide libxul, a solution which allows the embedding of Mozilla technologies in other projects and products.

其实质上是一个运行环境,类似于java虚拟机、Adobe AIR、Yahoo! Widget等,只不过它目前支持xul、xpcom、js、html等,而其他的运行环境大都有其对应的支持格式及实现方式等。有了Xulrunner,为开发Rich Internet application提供另一种实现方式。

Xulrunner基于Gecko内核,充分利用了其功能及实现方式,而Gecko内核的功能、性能及实现方式等在Firefox中得到了充分的体现与运用。这样Xulrunner应用程序基本上完全可以应用Firefox所拥有的功能。

二、如何实现一个Xulrunner应用程序
1、下载、安装Xulrunner;

2、创建应用目录结构,设置应用application.ini及chrome manifest;
application.ini内容大致如下:
[App]
Vendor=***
Name=Bamboo
Version=1.0
BuildID=2008052906
Copyright=Copyright (c) 1998 - 2008 mozilla.org
ID={ec6039f7-c60a-784f-9b0e-23b3a9e67323}
[Gecko]
MinVersion=1.9
MaxVersion=1.9
[XRE]
EnableProfileMigrator=1
EnableExtensionManager=1
[Crash Reporter]
Enabled=1
ServerURL=https://crash-reports.mozilla.com/submit

其中ID表示xulrunner应用的唯一ID,在编写extension时须指定该extension能够应用的目标程序,在其install.rdf的targetApplication项的ID中指定已知的应用ID(也即xulrunner应用在其application.ini中指定的ID)。如Firefox的应用ID为{ec8030f7-c20a-464f-9b0e-13a3a9e97384}。

3、创建xul、js文件;

4、设置应用选项;
在pref.js中指定Xulrunner应用程序启动的主窗口,如
pref("toolkit.defaultChromeURI", "chrome://myapp/content/main.xul");

5、运行Xulrunner应用程序;
.\xulrunner\xulrunner.exe application.ini

具体参考
Getting Started with XULRunner


三、Xulrunner和Firefox、ThunderBird等有什么区别?
Xulrunner作为一个运行环境,以供他人开发基于Xulrunner、基于Gecko内核的应用程序,从Gecko1.9以后,从严格的意义来讲,Firefox、ThunderBird等是基于Xulrunner而开发的,也是一个Xulrunner应用,只不过它得到Mozilla官方的支持,它是浏览器。

Mozilla在开发Firefox、Xulrunner、Gecko内核的过程中,不断的相互扩充,相互优化,相互促进,往往一个Firefox主要版本都对应一个Xulrunner版本,Xulrunner、Firefox对某一特性的支持程度有时有一些略微不一致,往往是由于对应版本未及时更新而造成的。

自Firefox3.0以来,通过firefox.exe -app application.ini的调用方式同样可以运行一个Xulrunner应用,只不过此时该Xulrunner应用的Gecko内核是当前Firefox对应Gecko内核。

到目前为止不同组织开发了许多基于Xulrunner的应用,如比较著名的有Songbird、Joost、Miro等等。

具体可参考
XULRunner Hall of Fame

四、开发Xulrunner应用程序与Embedding Gecko有什么不同?
以基于Xulrunner的方式开发应用,可以充分利用Gecko内核的所有功能(包括xul、xpcom、js等等),入手比较简单,对开发者而言,只须专注实现自身所关心的部分,但要想真正开发出好的应用,需要对Gecko内核的方方面面拥有较深入的理解,难度较大,虽然其符合许多W3C标准,但Gecko内核的各个方面都自成一个体系(特别是xpcom),与其他的库及开发平台的接口相对较少。同时Mozilla目前也推荐开发人员以运行平台的方式来利用Gecko内核。

通过Embedding Gecko的方式来利用Gecko内核,其实现方式和可利用的外部库等都比较灵活,不一定只限于与Gecko相关的实现方式或外部动态库,其往往将Gecko内核作为一个相对独立的外部库使用,但由于目前Gecko内核在Embedding方面的接口有限,不能让外部程序充分利用Gecko内核的功能,从而限制了外部程序对其利用,同时如只利用Gecko内核中浏览页面的部分功能,而需要嵌入整个Gecko内核,有点得不偿失。

究竟是使用Xulrunner的方式还是使用Embedding Gecko的方式来利用Gecko内核?
这就存在一个取舍的问题,如只须嵌入浏览页面的功能,嵌入IE内核或Webkit内核,肯定方便很多,嵌入Gecko内核,稍现复杂,但嵌入的功能都相对有限;想更进一步了解嵌入Gecko内核的内容,可参考浅谈Gecko关键部分之十二Embedding一节。

如使用Xulrunner的方式来利用Gecko内核,则须完全拥抱Xulrunner平台,可利用的功能丰富强大,需要学习研究的难度曲线较大,但是Mozilla毕竟是一个开源组织,其是否能提供一个高质量的可商用的运行环境,存在一定风险,有可能没有Microsoft、Adobe等商业公司提供的平台那样得到更广泛的支持。虽然如此,但其开放程度及对Web技术趋势的创新是独一无二的,再说目前其提供的文档越来越规范,应用越来越多。

五、总结
总的说来,如想真正深入的了解Web技术或浏览器,使用Xulrunner是个非常好的选择,但代价可能较高,如一旦真正掌握,则至少Web技术实力会很强;

如只是利用Web技术或浏览器,完全可抛开Gecko内核,利用IE内核或Webkit内核,来运用Web技术,但对Web技术的真正把握可能不是很深入;

作为一个开源爱好者,想更深入了解Web技术或浏览器,作手学习研究使用Firefox、Xulrunner等Gecko内核相关应用程序,是个不错的选择,因为它提供了很多非常不错的Web技术及工具如ajax、firebug、xul、venkman等;经过一定时间的运用,一定会收获颇多!

六、参考资源
Mozilla Developer center -XULRunner
Wiki XULRunner
What XULRunner Provides
XULRunner FAQ

2008年8月9日星期六

奥运真的来啦!

2008年8月8日20时,令人期盼以久激动人心的时刻终于来到,第29届北京奥林匹克运动会在北京鸟巢体育馆开幕啦!

经过洋洋洒洒4个多小时的激情澎湃之后,开幕式结束了,令人回味无穷。。。。

一、鲜明的主题,展示出中华民族灿烂辉煌的历史文化画卷
充分利用灯光道具的奇特效果,以历史画卷的形式,向全世界人民展现中华民族的重大历史时刻、思想文化现象等如击鼓、太极、丝绸之路、清明上河图、长城、京剧、木偶等,构思奇特,令人赞叹;

二、灯火辉煌,渲染北京,照耀中华,展示追逐奥运之梦
利用中华传统焰火,以历史足迹的形式,展现中华儿女百年追逐奥运之梦。客观而现实,令人感慨,回想起亲身经历的2001年7月13日奥运申办成功后的北京不眠之夜,天安门、西单、王府井等到处都是热烈狂欢的人们,尽情展现追逐奥运之情,犹如今日,感慨、欣喜;

三、令人感觉平淡的会歌及点火仪式
回想起以前汉城、洛杉机、巴塞罗那、悉尼、雅典等近现代奥运会歌及点火仪式,心中重新唤起对奥林匹克运动的激情,对奥林匹克精神的敬仰、向往。而我们的会歌及点火仪式,似乎构思一般,没有充分体现出奥林匹克核心精神如激情、自然、创新、执着、更高、更快、更强等。。。

也许奥林匹克精神本来就是泊来品,来自古老的西方,熊熊烈火能在古老的中华大地点燃,本身就象罗格、何振梁等所说本届奥运会是独一无二的,结点就在于此吧。

也许我们有太多令人值得回味的历史画卷,令人痴迷,沉醉其中,几乎忘了外界的一切,或者想将外部的一切也融入其中。

也许东西方的融合之路才逐步真正开始,近现代我们的激情、我们的创新、我们的自信、我们的文化、我们的思想、我们的体制等等正逐步追赶西方,正象夸父追日,有点真实而惭愧,但愿融合之路能令世人受益,让老百姓切切实实的受益,解放思想,提升生活质量,共同面对世界,实现共同之梦,真正实现One World One Dream,我们改变自己,改变世界。

我们不卑不亢,不留恋过去,忘掉耻辱,昂首迎接现在,拥抱世界,面对挑战,真实而自然,以更高、更快、更强的心态去创造美好生活,再现辉煌。。。。

一点感悟,可有偏颇?!但愿能激起一丝思考。。。

2008年8月5日星期二

浅谈Gecko关键部分之十二Embedding

随着Gecko内核的广泛使用,人们会期望Gecko内核能作为一个相对独立的拥有能访问Web、解析Html、渲染页面等浏览器基本功能的动态库甚至作为一个ActiveX或GtkWidget以供其他程序将其嵌入,就像大家熟知的MyIE作为一个外壳程序将IE内核以ActiveX的方式嵌入到其中,这样外壳程序相对简单,往往基于应用层,而内核则专注于html、css、dom等浏览器核心部分的处理,一旦能将浏览器内核以相对固定相对简单的接口形式提供给外部程序使用,则会大大拓展其应用包括动态脚本语言如python、perl、ruby都可能将其应用其中,其他的外壳程序也会应运而生。其实IE内核及Safari内核Webkit都提供了相对简单固定的接口供外部调用,这样才有了MyIE及Safari。那么Gecko内核是否也有类似的接口,外部程序又是如何嵌入的,这些与IE内核及Webkit等有什么差别呢?

一、认识Embedding接口
Gecko内核作为相对独立的部分嵌入到外部程序中,在本质上外部程序与Gecko内核的关系其实很类似Plugin与Gecko内核的关系,外部程序与Gecko内核需要分别实现一些接口,各负其责,以供对方调用,这样两者相互结合实现所要的功能。不过Gecko内核官方目前提供给外部调用的接口封装得不是很简单,使用起来也不是非常的方便,但通过对GTKMozEmbed、winEmbed等的了解,Gecko内核部分往往通过nsWebBrowser来实现public nsIWebBrowser、nsIWebNavigation、
nsIWebBrowserSetup、nsIDocShellTreeItem、nsIBaseWindow、nsIWebBrowserPersist、nsIWebBrowserFocus、 nsIWebProgressListener等接口,以代表一个浏览器页面浏览实例;

而外壳程序部分需要实现nsIWebBrowserChrome、nsIEmbeddingSiteWindow、nsIWebProgressListener、nsISHistoryListener、nsIContextMenuListener等接口以代表一个浏览器页面浏览外壳,供Gecko内核调用。

其中nsWebBrowser初始化后通过setcontainerWindow来设置其nsIWebBrowserChrome containerWindow为其对应的外壳实现,然后通过InitWindow、Create等方法可真正创建一个浏览器页面浏览实例,而外壳实现通过设置其nsIWebBrowser webBrowser为前面初始化的nsWebBrowser实例,这样两者可互为引用,同时外壳部分可向nsWebBrowser添加一些如WebProgress、ContextMenu等listener,以供Gecko内核nsWebBrowser需要时调用通知。

另外外壳部分需要实现接口nsIWindowCreator,并通过调用window watch service的方法setWindowCreator来告诉window watch service由外壳部分来createChromeWindow,以保证内核在由页面脚本通过window.open来打开新窗口时统一由外壳部分来创建新开的窗口。

上面提到的是Gecko内核为了实现Embedding,需要由内核部分与外壳部分分别实现的基本接口及相关调用关系,其中Gecko内核还提供有诸如NS_InitEmbedding、NS_TermEmbedding等XPCOM方面的接口以供外壳部分充分利用Gecko内核提供的XPCOM强大组件管理等功能。

为了更方便外壳程序的调用,Gecko也提供了诸如GtkMozEmbed widget及MozApp、MozView、 MozViewListener等,其实质仍属于上面提到的外壳部分,只不过更加的方便用户使用罢了。

二、外部程序如何嵌入Gecko内核
为了能真正了解如何将目前的Gecko内核嵌入到外部程序中,最好还是先参考Roll your own browser - An embedding HowTo按照其提供的编译方式,了解TestGtkEmbed、mfcEmbed等实现。通过对这些实例的了解才能对嵌入Gecko内核有一定的了解。

外部程序嵌入Gecko内核的主要步骤如下:
1、通过NS_InitEmbedding初始化内核;
2、通过 do_CreateInstance(NS_WEBBROWSER_CONTRACTID, &rv)创建mWebBrowser;
3、创建实现nsIWebBrowserChrome、nsIEmbeddingSiteWindow接口实例mpBrowserImpl;
4、创建绑定窗口
mpBrowserImpl->Init(mpBrowserFrameGlue, mWebBrowser);

mWebBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome*, mpBrowserImpl));

nsCOMPtrsetup(do_QueryInterface(mWebBrowser));
if (setup)
setup->SetProperty(nsIWebBrowserSetup::SETUP_IS_CHROME_WRAPPER,PR_TRUE);

rv = mBaseWindow->InitWindow(nsNativeWidget(m_hWnd), nsnull,0, 0, rcLocation.right - rcLocation.left, rcLocation.bottom - rcLocation.top);
rv = mBaseWindow->Create();

5、添加监听
void mWebBrowser->AddWebBrowserListener(weakling, NS_GET_IID(nsIWebProgressListener));

6、设定WindowCreator、preference及promptservice等;

7、装载页面mWebNav=nsCOMPtrsetup(do_QueryInterface(mWebBrowser));
if(mWebNav)
mWebNav->loadURI();

8、通过NS_TermEmbedding卸载内核,退出程序;

三、
与IE内核、Webkit等嵌入方面的差别
同样作为浏览器内核,其实有很多文章就Gecko内核、IE内核、Webkit等多方面进行过比较如Comparison of layout engines。但就嵌入易用方面来讲,它们之间差别还是蛮大的,个人认为IE内核充分利用windows com技术,作为一个独立的ActiveX,其拥有很好接口封装,对windows用户来讲,大大提高了其易用性复用性;

Webkit内核本身一开始就专注于浏览器内核部分如KHTML、KJS,其提供给windows、gtk、mac等方面的接口也相对完毕;

Gecko内核往往不仅仅专注于浏览器内核如HTML、Javascript等方面,同时它还提供了XPCOM、XUL,从大的方面看,嵌入Gecko内核访问通用的html类的Web网站,只利用了其中一部分功能,其XUL、XPCOM等功能几乎可以不用,这样一来也是一种浪费,所以目前Embedding方面的接口,既要考虑到XPCOM方面,又要考虑到用户嵌入内核的易用性,显然没有IE内核及Webkit内核,简单明了,要想嵌入Gecko内核,需要对其进行深入的了解,这样反而降低了嵌入的意义。

顺便提一下,Avant/Orca Browser创始人宣称花了3年多的时间才将Gecko内核研究透彻,弄出个基于Gecko内核的浏览器Orca Browser,但其利用方式,不是基于Embedding的,而是基于Xulrunner的,这样既迎合了Gecko本身,同时能充分利用其强大功能,可谓一举两得,但是要想用好它,可要花上3、5年功夫不可。

四、总结
其实目前通过Embedding的方式使用Gecko内核的还不是很多,使用起来也比较困难,需要较深入的了解XPCOM等内核知识,比较好的实例也就只有上面提到的TestGtkEmbed、mfcEmbed等,可喜的是Mozilla最近似乎想重新加强其对Embedding方面的支持。详见Embedding/NewApiChris Blizzard's blog

另外Second life提供了一组接口以更加方便嵌入Gecko内核。详见uBrowser and LLMozLib

四、参考资源
Mozilla project Embedding Mozilla
Mozilla developer center-Embedding Mozilla

Mozilla Embedding FAQ
Gecko Embedding Basics
Mozilla embedding APIs overview

2008年8月2日星期六

浅谈Gecko关键部分之十一Extension

Extension扩展或称Add-on外挂这些日子随着Firefox3的发布,逐步走入人们的视野,并且有些Extension确实赋有强大的功能,其中不乏有google、yahoo!等这样的大公司打造,甚至有人由此提出Firefox3掀起新的浏览器开发应用模式。那究竟什么是Extension?如何编写Extension?编写Extension需要哪些知识?它与plugin、xpcom等开发有什么不一样?为了解答心中疑问,下面分别就这些问题予以学习研究探讨。

一、什么是Extension?
Extensions add new functionality to Mozilla applications such as Firefox and Thunderbird. They can add anything from a toolbar button to a completely new feature. They allow the application to be customized to fit the personal needs of each user if they need additional features, while keeping the applications small to download.

它从小方面看,其实就是为Firefox等添加一些小的功能,如在菜单栏、地址栏、状态栏等添加一些小的按钮以扩展功能,有些类似于为IE等浏览器的工具栏、菜单栏等添加新的选项。

但从本质上看由于Gecko内核提供了xul、xpinstall、xpconnect、javascript、xpcom、rdf等相关技术,使得可通过extension的方式几乎可以扩展浏览器方方面面的内容(这一点完全可从Firfox Add-ons繁多种类的extension中窥见其一班),更为特别的是整个浏览器Firefox本身几乎就是通过extension方式来实现的,完全超越了传统的扩展IE等浏览器的方式,同时gecko内核提供了包括extension资源标识、卸载安装等一系列支持,以便快速便捷为浏览器开发extension。

Gecko内核有这种对extension全方位的支持,仅此就完全超越了opera、safari、ie等传统浏览器内核,进而开拓出一种新的RIA(Rich Internet Application,富互联网应用系统)应用方式,虽然没有象microsoft、adobe等公司对xaml、flex那样的商业支持,但Gecko内核在RIA应用开发方面的技术研究、实现方式探索、还有开放方面等,都是首屈一指的。


二、如何编写Extension?
编写一个简单的Extension其实非常的简单,参考Building an extension一步一步的来设定extension资源标识rdf文件、chrome及manifest等包固定目录结构、编写js及xul文件、打包发布即可。

其中较为关键的在于xul文件中对xul标签overlay的使用,简单来的说来就是extension想在firefox浏览器的菜单栏或状态栏等什么位置添加上你的extension内容。具体对xul标签overlay的使用可参考XUL overlays

尽管js文件在xul文件中可以加载,但是extension作为对firefox浏览器的扩展,这些overlay xul文件,一般也是在浏览器主窗口文件browser.xul加载时一块加载的。这样如果你的extension有一些初始化的需求,只须在js文件中添加window.addeventlistener('load', initfunc,false)即可。

三、编写Extension需要哪些知识?
编写一个简单的extension需要的知识似乎不要太多,但是编写出一个切实可用的extension,必须对以下方面下番功夫不可。

首先 对Firefox本身的实现需要有一定的认识,如对browser.xul、browser.js的了解等,了解extension的运作机制如什么时候启动extension、如何响应用户事件等。

其次 对xul、html、js、xpconnect需要有基本的认识,了解extension的基本构成元素,进而了解Gecko内核为extension提供的可用资源,同时重点关注自身extension所涉及的相关内容如xpcom组件、plugin、css、dom等等。

最后 充分利用已有工具如venkman、dom inspect、firebug、xpcomviewer等以提供开发效率。


四、extension与plugin、xpcom等的区别
extension作为一种对浏览器的扩展机制,而不是对Gecko内核的扩展机制,而plugin、xpcom往往扩展Gecko内核的基础内容,可看成是对Gecko内核的扩展。其中plugin的扩展往往与页面上某一块区域内容显示相关,而xpcom往往扩展Gecko内核基本组件等。

为了扩展浏览器应用(浏览器其实只是Gecko内核应用的一个典型代表),extension则完全可以使用Gecko内核提供的各种机制及技术,同时其本身也可扩展Gecko内核如提供独立的plugin、xpcom组件来扩展浏览器应用。这样说来extension开发,也可包括plugin、xpcom等等方面的开发,就看你所扩展的应用需求啦。

五、总结
Firfox Add-ons中提供了种类繁多的extensions给大家使用,其中不免有令人耳目一新的东西,令人感慨万千,进而发出互联网应用竟然可以这样的感慨。有了对extension的认识,我们就可以着手阅读他人所写的extension,更深入的了解Gecko内核,编写自己的extension,挖掘属于自己的互联网应用。

总之对Gecko内核了解得越深,编写起extension来就越得心应手,其实写这一系列浅谈Gecko的文章也就是为了了解Gecko内核,能编写extension,进而开拓属于自己的Gecko内核应用、互联网应用。

六、目前所关注的Firefox extensions
Dom Inspector
Firebug
Venkman
Xpcomviewer
IE Tab
Split Browser

Weave //有空可用用Mozilla主推的在线共享书签等
PicLens //一个超酷的3D在线图片、视频管理
HttpFox//一个很好的http分析
Gladder//一个蛮好用的代理
Extension Developer
Delicious

DownloadHelper//可从多个站点下载视频和图片
Feed Sidebar //显示实时书签
。。。。。。。。。。

七、参考资源
Mozilla developer center -Extensions
Building An extension
Extension Frequently Asked Questions
Setting up extension development environment
Code snippets

Mozilla developer center-XUL Overlays
XUL Tutorial:Overlays

WIKI Firefox extensions(Add-on)
WIKI List of Firefox extensions