2023年11月25日发(作者:)

⼀步⼀步学习Firefox扩展的开发(1——制作⼯具栏按钮及右键菜单

Firefox提供开放、强⼤且灵活的扩展机制,因此衍⽣出了⼤量功能丰富的扩展组件,这些扩展

组件甚⾄可以说是某些⽤户爱上firefox的主要因素。

⽐较可惜的是firefox扩展开发的中⽂资料相对⽐较少,因此在这⾥我会从简单到深⼊介绍开发

firefox扩展的⼀些技术及常遇到的问题。

本⽂主要内容:

制作⼀个包含⼯具栏按钮及右键菜单的简单组件 解决扩展安装后⼯具栏按钮却不显⽰的问

因为这个组件不需要设计交互窗⼝,因此开发过程相对简单,下⾯是这个组件运⾏的效果图:

在开始之前先介绍⼀下⼏个⽹址:

/en/Extensions 官⽅开发⽹,类似MSDN,是开发时的主要参考资

料;

/en/Building_an_Extension,官⽅的⼀个基础教程,笔者通过此篇

⽂章⽽⼊门;

/code/mozilla/extensionwiz/,⼀个在线的创建扩展的向导,如果你想⽴

即创建⼀个属于⾃⼰的扩展,可以试试⽤这个向导制作⼀个雏形,然后再⾃⼰慢慢添砖添⽡。

本⽂所讲的例⼦也是⽤这个向导制作出来的。

好了,下⾯就开始讲解本⽂的⽰例组件:uusharedemo1的制作过程。

1、了解扩展组件的构成

Firefox扩展组件是以⼀个xpi⽂件的形式发布的,⽽xpi⽂件实际上是zip压缩包 ⽂件,我们只要

Firefox扩展组件下载回来(⽤右键另存为即可下载),把⽂件扩展名改为zip即可解压并看到

所有的源代码,有时可能还会在压缩包⾥ ⾯看到jar格式⽂件,这个也是zip压缩包,改名解压即

可看到源代码。因此多下载优秀的扩展回来慢慢研究其源代码也不失为⼀种快速的学习⽅法。

⼀般xpi⽂件内部有(但不⼀定都有)如下⽬录及⽂件:

其中 uusharedemo1 为本⽂⽰例组件的名称,可以看到压缩包⾸层有:

st两个⽂件以及⼀个chrome⽬录。

:是该组件的安装信息,例如组件的名称、版本、作者等信息,XML格式;

st:是⽤于描述该组件由哪些⽂件组成的,即⼀个资源列表;

chrome⽬录⾥就是该组件的主要内容了,⼀般有:contentdefaultslocaleskin等⽬录,

它们的作⽤如下:

content 这个是最主要的⽬录,包含组件的界⾯定义以及程序代码,其中xul⽂件是界⾯定义⽂

件,类似SilverLightXAML⽂件,同样是XML 式;js⽂件是组件功能实现的代码,全部⽤

javascript实现的。 skin:存放css样式表⽂件及资源位图,css是⽤来控制组件界⾯外观的。

locale:如果想让组件能够在不同语⾔的firefox⾥显⽰正确的⽂本,则将不⽤的语⾔列表放到此

⽬录,firefox会⾃动加载合适的语⾔⽂件。这点有些类似Win32PE可执⾏程序中的资源⽂件。

defaults:存放⼀些默认值,⼀般不要此⽬录也可以;

们可以把Firefox程序认为是⼀个平台,⽽我们看到firefox浏览器外观本⾝也是⽤跟扩展组件

类似的结构搭建起来的,感兴趣的朋友可以解压 “C:Program FilesMozilla Firefoxchrome”⽬录

下的jar⽂件观摩⼀下firefox浏览器外观的源代码,所以我们制作的扩展组件也会成为firefox浏览

器⾃⾝ 的⼀部分,可以实现⾮常强⼤⽽灵活的功能(例如Firebug这个神奇的组件)。相对来

说,开发ie扩展程序显得困难多了,除⾮只是想做⼯具栏按钮和右键 菜单(⽤注册表即搞

定),否则需要使⽤VC,VB,Delphi这些⼯具开发COM组件才能完成。

如果想了解firefox浏览器本⾝各个元素的定义,但⼜不想阅读chrome⽬录下的脚本代码,可以

安装 DOM Inspector 这个组件,这个组件有如开发web时的FireBug,是开发具有界⾯的扩展组

件时的神兵利器!

提醒:⾃⼰编写的组件代码⽂件最好⽤“UTF-8”格式保存,⼀般可以减少很多⿇烦的问题。

2、认识

包含组件安装信息,本⽂例⼦中它的内容如下:

1. 1

2. 2

3. 3 xmlns:em="/2004/em-rdf#">

4. 4

5. 5 uusharedemo1@

6. 6 Uushare书签(⽰例)

7. 7 1.0

8. 8 KwanhongYoung

9. 9 这是⼀个模仿Uushare书签插件的⽰例

10. 10

11. 11 chrome://uusharedemo1/content/

12. 12

13. 13

14. 14 {ec8030f7-c20a-464f-9b0e-13a3a9e97384}

15. 15 1.5

16. 16 3.0.*

17. 17

18. 18

19. 19

20. 20

21. 21

复制代码

⽂件⾥有很多是固定的写法,这⾥就不⼀⼀讲解了。

5⾏的id是组件的⼀个标识符号,类似WindowsCOM组件的CLSID,⽤于区别其他组件。可

以使⽤ xxx@ 这样类似email地址的格式组成,⽽这个“email地址不要求是真实或有效

的。也可以⽤的GUID来标识,例如“{c45c406e-ab73-11d8-be73-000a95be3b12}”

WebDevelop组件的标识符。

nameversioncreatordescriptionhomepageURL分别是组件的名称、版本、创建者的姓

名、组件描述、组件官⽅⽹站地址。

iconURL⽤于显⽰组件的图标,格式⼀般⽤32x32pixelpng图⽚。

这⾥出现了chrome://这样的地址,跟file://协议类似,chrome://也是⽤来定位资源的。格

式是:

chrome://组件名称/⽬录路径/⽂件名

需要注意的是,这⾥的组件名称可以跟em:name属性中所指定的名称(⽤于显⽰的)不⼀样

的,并且这个组件名称需要在st⾥定义。

这些信息在安装完组件之后能够在firefox的组件管理列表显⽰,如下图:

14⾏⽐较重要,⽤于标识当前组件是⽤于哪个平台的(firefox/Thunderbird/SeaMonkey

等),如果开发的组件是给firefox⽤的,则id={ec8030f7-c20a-464f-9b0e-13a3a9e97384}

1516⾏⽤于指定当前组件适⽤于firefox的哪些版本,因为firefox1.53.0有些地⽅有所改

变,所以如果你不知道⾃⼰的组件在哪些版本下可运⾏的话,最好先测试⼀下,然后准确地指

定⼀个范围值,上例的值表⽰该组件适⽤于firefox1.53.03.0所有修订版。版本号码不能⾃⼰

随便造,这⾥有⼀个完整的列表:

/en-US/firefox/pages/appversions

3、认识st

这是资源列表⽂件,内容如下:

1content uusharedemo1 chrome/content/

2locale uusharedemo1 en-US chrome/locale/en-US/

3skin uusharedemo1 classic/1.0 chrome/skin/

4overlay chrome://browser/content/

chrome://uusharedemo1/content/

5style chrome://global/content/

chrome://uusharedemo1/skin/

3⾏每⼀⾏表⽰⼀种类型的资源的地址,格式是:

资源名称组件名称参数⽬录路径

其中组件名称是⾃定义的,只要跟其他组件名不⼀样并且使⽤全⼩写字母即可。定义好之后,

就可以使⽤chrome://地址来定位资源了。例如,假设当前开发⽂件路径

“c:/dev/uusharedemo1/”,那么:

chrome://uusharedemo1/content/ 实际指的是

c:/dev/uusharedemo1/chrome/content/ 这个⽂件。

4⾏及第5⾏表⽰将当前组件的界⾯结合到系统本⾝的界⾯,因为当前组件会修改firefox本⾝的

⼯具栏及右键菜单,所以需要加上这两⾏。

4default/skin/locale/

这⼏个⽬录下的⽂件⽐较简单,下载本⽂的源代码查看⼀般能明⽩其中的意思,为了节约篇幅

这⾥就不讲解了,等以后我写后续的章节时再详细介绍。

5、认识 content/

Firefox的所有窗⼝都是使⽤xul⽂件定义的,例如在地址栏输⼊:

chrome://browser/content/

(这个地址对应的源⽂件是:“C:Program FilesMozilla

/content/”

就可以看到firefox关于对话框,在这个例⼦⾥我们⽤定义⼀个⼯具栏按

钮、右键菜单以及⼀个⼯具菜单项,源代码如下:

1. 1

2. 2

3. 3

4. 4

5. 5

7. 7

8. 8

9. 9

10. 10 xmlns="/keymaster/gatekeeper/">

11. 11

12. 12

13. 13