构建一个扩展
From MDC
[ [== 快乐学习.快乐生活.. ==]
]
目录 |
[编辑] 不要浪费时间
本文档逐步演示如何建立一个简单的扩展,在火狐的状态栏的托盘上显示 "Hello,World!"
[编辑] 建立开发环境
扩展文件以 ZIP 方式打包发布,带有扩展名 xpi (发音为 “zippy”)。 XPI 文件展开后的目录结构类似于下面:
extension.xpi:
/install.rdf
/components/*
/components/cmdline.js
/defaults/
/defaults/preferences/*.js
/plugins/*
/chrome.manifest
/chrome/icons/default/*
/chrome/
/chrome/content/
在开发时最好采用相同目录结构,这样可以直接用于测试,比较方便。
好,我们现在开始写扩展。先建立一个目录,比如~/extensions/myExtension/ 或者 C:\extensions\myExtension\。在这个目录下,建立一个子目录 chrome, 在 chrome 下,再建立一个目录 content。
(在类 unix 系统上,你可以同 mkdir -p chrome/content 同时建立 chrome 和 content 目录;在 windows 上,你可以 md chrome/content 来同时建立 chrome 和 content 目录)。
在扩展的 根 目录下,chrome 目录的旁边,创建立两个文本文件, chrome.manifest 和 install.rdf。
建立开发环境的技巧可以参考: Mozillazine Knowledge Base.
[编辑] 创建安装配置文件
把如下内容加入 install.rdf
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>sample@foo.net</em:id>
<em:version>1.0</em:version>
<em:type>2</em:type>
<!-- Target Application this extension can install into,
with minimum and maximum supported versions. -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>1.0+</em:minVersion>
<em:maxVersion>1.5.0.*</em:maxVersion>
</Description>
</em:targetApplication>
<!-- Front End MetaData -->
<em:name>Sample!</em:name>
<em:description>A test extension</em:description>
<em:creator>Your Name Here</em:creator>
<em:homepageURL>http://www.foo.com/</em:homepageURL>
</Description>
</RDF>
- sample@foo.net - 扩展的 ID. 这个值的作用是唯一标识这个扩展,并不是你的邮件地址。也可以直接使用 GUID。
- 指明 <em:type>2</em:type> -- 2 表示这是一个扩展 (其它类型看这里 Install Manifests#type)。
- {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - 火狐的唯一标识。
- 1.0+ - 所兼容的火狐最低版本号。
- 1.5.0.* - 所兼容的火狐最高版本号。请勿把它设置为高于火狐当前的最高版本号。
更多的属请看这里 Install Manifests。
保存文件。 link title
[编辑] 用 XUL 扩展浏览器
火狐的用户界面是用 XUL 和 JavaScript 写成的。XUL 通过 XML 语法描述用户界面的 widgets 组织。widgets 可以与 JavaScript 代码绑定,提供各种功能。
通过加入或修改 widget,可以修改浏览器的用户界面。
browser(浏览器的主窗口) 所对应的 XUL 文件是 browser.xul(包含在$FIREFOX_INSTALL_DIR/chrome/browser.jar 中). 在 browser.xul 可以找到对状态栏的描述:
<statusbar id="status-bar"> ... <statusbarpanel>s ... </statusbar>
<statusbar id="status-bar"> 是 XUL 覆盖的一个“融合点”。
[编辑] XUL 覆盖
XUL Overlays 是一种动态添加 widgets 到 XUL 文档的一种方法。 一个 XUL 覆盖就是一个 .xul 文件,该文件描述了一段 XUL 代码通过哪一个“融合点” 插入到“主”文档中。插入的 XUL 代码可以描述 widgets 的插入,删除和修改。
XUL 覆盖文档的例子
<?xml version="1.0"?>
<overlay id="sample"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<statusbar id="status-bar">
<statusbarpanel id="my-panel" label="Hello, World"/>
</statusbar>
</overlay>
命名为status-bar 的 <statusbar> 元素指定了在 browser 窗口上附加元素的 “融合点”。
子元素 <statusbarpanel> 要添加的的 widget。
把上面的示例代码保存在一个文件 sample.xul 中,并把它复制到前面创建的 chrome/content 目录下。
[编辑] Chrome 路径
[编辑] 创建 Chrome 清单
要了解更多关于 Chrome Manifests 的信息,请参考 Chrome Manifest。
把下列代码加到 chrome.manifest 文件当中:
content sample chrome/content/
(不要忘了最后的"/"! 少了它, 扩展加载会失败.)
这个文件指定如下内容:
- chrome 包所包含的内容
- chrome 包的名字
- chrome 包对应文件的位置
在我们的 chrome 包 sample 中,content 所包含的文件位于 chrome/content 下,这个路径是相对于 chrome.manifest 而言的。
注意,content, locale 和 skin 的文件必须放在 chrome 的子目录 conetnt, local, skin 中。如没有 local,skin 文件,则可以忽略。
在安装扩展时,火狐会根据这个文件来登记 chrome 包。
[编辑] 登记覆盖
若想在浏览器的主窗口显示时,我们所附加的 widget 也同时显示,必须向火狐登记。在 chrome.manifest 中添加一行:
overlay chrome://browser/content/browser.xul chrome://sample/content/sample.xul
这表示在 browser.xul 加载时,同时加载覆盖sample.xul.
[编辑] 测试
首先,我们要把扩展安装到火狐中。在火狐 1.0 以前,必须把文件打包成 XPI 文件,并用火狐打开,安装。这很麻烦,现在已经有了更便捷的方法。
- 打开你的 Profile Folder
- 打开 extensions 目录 (如果没有,就创建一个)
- 建立一个新的文件, 把你的扩展目录路径写到文件中,也就是~/extensions/myExtension or C:\extensions\myExtension\ . 把文件命名为 扩展的 id, 也就是 sample@foo.net
现在我们可以测试扩展了!
启动火狐。火狐会发现并安装你的扩展。当浏览器的主窗口显示时,在其右下方,状态栏中,应该能看到文字 "Hello, World!"。
[编辑] 打包
现在我们的扩展已经能工作了,在发布前,应该把它打个包。
把扩展所在目录下的文件,目录,子目录用 zip 方式打个包,并带有后缀 .xpi。若你安装有 7z,可以这样:
7z -tzip a sample.xpi *
现在可以把你的 .xpi 文件放到服务器上,确保该服务器能识别 application/x-xpinstall 类型. 你可以提供到这个文件的连接,这样用户就能通过火狐来安装它了。
比如:sample.xpi 点击安装
[编辑] 从网页安装扩展
你能有很多种方法从网页上安装各种扩展,其中包括通过使用InstallTrigger对象直接点击后缀为xpi的链接。鼓励扩展提供商和网络创作者使用InstallTrigger方法来安装各类xpi,给用户提供最好的经验 --Yyn9566 07:02 2007年3月21日 (PDT)