初试Firefox插件(上篇)

2014-04-16

Firefox, Web

作为一个已经放弃治疗的Vimperator症患者,离开了Firefox就会异常纠结。于是我把我们学校的Electsys++选课插件移植到了Firefox上

其实,移植工作可以使用更方便的工具完成(甚至不用做插件,直接喂给Greasemonkey就行),但是为了练手,我决定用最基本的方法。

目录结构

首先,一个Firefox插件(xpi文件)是一个压缩包。我们可以看到它的大致结构:

1 |-- chrome.manifest
2 |-- chrome
3 |   `-- content
4 |       |-- browserOverlay.xul
5 |       `-- ...
6 |-- install.rdf
7 `-- ...

上面只列出了最重要的几个文件。

install.rdf记录了插件最基本的信息;chrome.manifest列出了插件包含的内容;content文件夹放置插件内容。其实Firefox对插件内容的位置并没有特别的规定,我们可以根据自己的习惯来命名目录,不过通常我们使用约定俗成的chrome/content其实我在插件里手滑用了单层的content目录……

install.rdf

长话短说,直接上例子:

 1 <?xml version="1.0"?>
 2 
 3 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 4     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
 5 
 6     <Description about="urn:mozilla:install-manifest">
 7 
 8         <em:id>blablablaaddon@example.com</em:id>
 9         <em:name>This</em:name>
10         <em:description>This is a firefox extension</em:description>
11         <em:version>1.0</em:version>
12         <em:creator>Macrohard</em:creator>
13         <em:homepageURL>http://example.com/this</em:homepageURL>
14         <em:type>2</em:type>
15 
16         <em:targetApplication>
17             <Description>
18                 <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
19                 <em:minVersion>2.0</em:minVersion>
20                 <em:maxVersion>2048.*</em:maxVersion>
21             </Description>
22         </em:targetApplication>
23 
24     </Description>
25 
26 </RDF>

我们慢慢来看。

Description标签之前的没什么好说,定义了这是RDF文件。

Description内,每个标签定义了关于插件的一条信息。

id

首先是id,我们需要为每个插件定义一个唯一的id,应该避免与其它插件的id冲突。这个id可以是email的形式(不必是个真实存在的email地址,只要确保不会造成冲突就可以),也可以是一个GUID:

1 <em:id>blablablaaddon@example.com</em:id>
2 <em:id>{deadbeef-0123-4567-89ab-c0ffeec0ffee}</em:id>

name, description

名字和描述,这个不用解释了:

1 <em:name>This</em:name>
2 <em:description>This is a firefox extension</em:description>

version

版本号,为了便于Firefox识别版本,我们可以使用一个简单而清楚的版本号:

1 <em:version>1.0</em:version>

creator, developer……

作者和主页:

1 <em:creator>Macrohard</em:creator>
2 <em:developer>Alice</em:developer>
3 <em:developer>Bob</em:developer>
4 <em:translator>Carol</em:translator>
5 <em:contributor>Dave</em:contributor>
6 <em:developer>Eve</em:developer>

homepageURL, aboutURL……

各种地址:

1 <em:homepageURL>http://example.com/this</em:homepageURL>
2 <em:aboutURL>chrome://This/content/about.xul</em:aboutURL>
3 <em:iconURL>chrome://This/content/logo.png</em:iconURL>
4 <em:icon64URL>chrome://This/content/logo_big.png</em:icon64URL>

我们可以看到一种特殊的地址chrome://This/content/...chrome:是Firefox内置内容的访问协议(注意不要把它和Google Chrome混淆),我们可以从chrome://<插件名称>/...访问我们的插件中的文件。

除了上面这些,还有updateURL和optionURL。涉及更多细节,这里不作深入讨论。

type

类型,数字2表示扩展:

1 <em:type>2</em:type>

另外,4是主题包,8是语言包,32是多种内容组合(…大礼包?),64是拼写检查库。

targetApplication

我们需要指定这个插件适用的软件和版本:

1 <em:targetApplication>
2     <Description>
3         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
4         <em:minVersion>2.0</em:minVersion>
5         <em:maxVersion>2048.*</em:maxVersion>
6     </Description>
7 </em:targetApplication>

{ec8030f7-c20a-464f-9b0e-13a3a9e97384}是Firefox的GUID。这里有一份更详细的列表:

1 Firefox             {ec8030f7-c20a-464f-9b0e-13a3a9e97384}
2 Thunderbird         {3550f703-e582-4d05-9a08-453d09bdfdc6}
3 Nvu                 {136c295a-4a5a-41cf-bf24-5cee526720d5}
4 Mozilla Suite       {86c18b42-e466-45a9-ae7a-9b95ba6f5640}
5 SeaMonkey           {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}
6 Sunbird             {718e30fb-e89b-41dd-9da7-e25a45638b28}
7 Netscape Browser    {3db10fab-e461-4c80-8b97-957ad5f8ea47}
8 Flock Browser       {a463f10c-3994-11da-9945-000d60ca027b}

其它

还有strictCompatibilityunpacklocalizedbootstrap等项目,这里不一一解释,可以在Mozilla开发者网络找到更多信息。

我们在下篇继续介绍其余文件。