创建Firefox扩展 [A]  [A] 原文地址:https://developer.mozilla.org/en/Building_an_Extension

翻译:Karl Ma
email: karlcpp@gmail.com

Table of Contents
Section: Instruction
Section: Quick Start
Section: Setting up the Development Environment
Section: Create the Install Manifest
Section: Extending the Browser with XUL
Subsubsection: XUL Overlays
Section: Chrome URIs
Section: Create a Chrome Manifest
Section: Register an Overlay
Section: Test
Section: Package
Subsection: Installing from web page
Subsection: Using addons.mozilla.org
Subsection: Installing Extensions using a Separate Installer

Section: More on XUL Overlays
Section: Create New User Interface Components
Section: Default Files
Section: XPCOM Components
Subsection: Application Command Line
Section: Localization
Section: Understanding the Browser
Section: Debuging Extensions
Subsection: Analytical Tools for Debugging
Subsection: printf debugging
Subsection: Advanced debugging

Section: Further Information

Instruction

这个教程将会带领你一步一步的完成一个基本的Firefox扩展的创建过程。这个扩展只是在Firefox的状态条上显示一个panel,panel包含一个文本"Hello, World!"。
自从Firefox 4(还有其它的以Mozilla 2为基础的应用程序)以后,就有了两种类型的extension,它们分别是:
  • 传统的,经典的,或者说是XUL扩展。这种类型的扩展功能强大,但是安装此类扩展时需要重新启动Firefox。
  • 非重启,或者说是自启动的扩展。这种类型的扩展在安装后不用重新启动,但是,与传统类型的扩展相比,它会受到更多的限制。Add-on SDK和Add-on Builder可以让你在创建非重启型扩展时容易一点。
此文中将要创建的扩展是传统型Firefox扩展。
如果你需要创建一个Thunderbird扩展,可以看一下这里。

Quick Start

Hello World扩展与另一个教程里介绍的使用Extension Wizard生成的扩展非常相似。

Setting up the Development Environment

扩展是打包并压缩成一个zip文件或安装包来发布的,文件以xpi(发”zippy”音)为文件的扩展名。
一个典型的xpi文件的内容像如下这样:
my_extension.xpi: // 相当于my_extension/目录
/install.rdf //你的扩展的通用信息
/chrome.manifest //用Chrome引擎注册你的内容
/chrome/  
/chrome/content/ //你的扩展的内容,例如XUL,JavaScript文件等
/chrome/icons/default/* //扩展的默认图标
/chrome/locale/* //创建扩展的本地化
/defaults/preferences/*.js //创建扩展的默认文件
/plugins/*  
/components/*  
/components/cmdline.js  
我们将会在此教程中创建一个与上面相似的文件结构,所以现在你先在你的磁盘上为你的扩展创建一个文件夹吧(如c:\extensions\my_extension\或者~/extensions/my_extension)
Gecko 1.9.2 Note

从Gecko 1.9.2开始(也就是Firefox 3.6),你可以简单的在add-on的基准目录下增加一个图标文件,名字叫icon.png。这样的话,即使你的add-on不可用,或者iconURL入口丢失的情况下,这个图标也会显示出来。

Create the Install Manifest

在你创建的扩展文件夹的顶层,打开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@example.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.5</em:minVersion><em:maxVersion>4.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.example.com/</em:homepageURL></Description>
</RDF>

  • sample@example.net - extension的ID。这是一个email格式的值(不一定就真的是你的邮件),用来标识你的这个extension。之所以要使用email,主要是为了使这个extension标识有唯一性而已。你可能会用GUID。注:这个参数必须是email格式,虽然它可能不是一个合法的email地址。
  • <em:type>2</em:type> - 类型是2表示正在安装是一个extension,如果是一个theme的话,这个值应该是4(其它的类型看这里)。
  • {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - Firefox应用程序是的ID。
  • 1.5 - 你的extension可以工作的最早的Firefox版本,要是一个精确的版本号,不能是*。如果你说什么也要写*的话,我敢保证它一定不会是你希望的那样在的工作。
  • 4.0.* - 你的extension可以工作的最高的Firefox版本。4.0.*的意思是可以在4.0.x版本上工作。这个版本号应该要小于Firefox宣布的版本号。默认情况下,在Firefox 10或以后的版本不会强制约束maxVersion。你可以通过配置<em:strictCompatibility>项来要求应用程序强制约束maxVersion。
(如果你觉得rdf文件很难看,你可以用Firefox打开它,如果它有错误,Firefox会显示)
为Firefox 2.0.0.x设计的extension应该将最大的版本号写成2.0.0.*。为Firefox 1.5.0.x设计的extension应该将最大的版本号写成1.5.0.*。
关于Install Manifest文件完整的要求和可选的属性,请参阅这里。
现在把文件保存了吧。

Extending the Browser with XUL

Firefox的用户界面是用XUL和Javascript写成的。XUL是用xml语法描述用户界面组件的一种文档格式。这些用户界面组件包括像button, menus, toolbar, tree等。用户的动作会与javascript绑定。
为扩展浏览器,我们通过增加或修改组件的方法修改浏览器的一部分UI。我们通过插入新的XML DOM元素到浏览器窗口来增加组件,通过脚本和附加的事件处理器来修改它们。
浏览器是用一个叫做browse.xul的XUL文件实现的($FIREFOX_INSTALL_DIR/chrome/browser.jar中包含在content/browser/browser.xul)。在browser.xul中我们可以发现状态条,它看起来像下面这样:
<statusbar id="status-bar">... <statusbarpanel>s ...
</statusbar>

<statusbar id=”status-bar”>是XUL Overlay的合并点。

XUL Overlays

XUL Overlays是在运行时向XUL文档附加其它组件的一种方法。一个XUL Overlay是一个.xul文件,它指定了向主文档中的一个合并点插入一些XUL片段。这些片段可以指定插入、删除或修改组件。
XUL Overlay文档的例子如下:

<?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我们想要附加其上的,浏览器窗口的合并点。

<statusbarpanel>是我们想插入到合并点的一个新的组件。
将上面的内容保存在你创建的文件夹的chrome/content/sample.xul文件中。
关于合并组件和用XUL Overlay修改用户界面的更改内容请接着往下看。

Chrome URIs

XUL文件是Chrome包的一部分 - 用户界面组件集通过chrome://URIs来访问。由于Firefox的位置会因平台和系统的不同而不同,所以,开发人员为打开安装程序所知道的XUL的内容而创建了一个新的URIs,而不是使用原来files://来直接打开磁盘文件。
浏览器窗口的URI就是chrome://browser/content/browser.xul。在Firefox地址处输入以上uri,看看什么效果。
Chrome URI由几个部分组成。
  • 第一、URI方案(chrome),它告诉Firefox网络库,这是一个Chrome URI。它指示URI的内容应该按(chrome)方式处理。而(http)URI则要Firefox按网页的方式处理。
  • 第二、包的名字(例子中就是browser),它标识了用户界面组件的集合。对于你的程序来说,它应该是独一无二的,以避免不同extension间的冲突。
  • 第三、请求的数据类型。有三种类型:content(XUL,Javascript,XBL绑定等等,是应用程序的结构和行为),locale(DTD,属性文件等,是UI的本地化字符串),skin(CSS和image,是UI的主题)。
  • 最后,加载文件的路径。
所以,chrome://foo/skin/bar.png代表从foo包中的主题的skin中加载bar.png文件。
当你从chrome URI加载的内容时,Firefox用Chrom Registry将URI转换为实际的磁盘上的源文件(或jar包)。

Create a Chrome Manifest

欲了解更多关于Chrome Manifest和它们支持的属性,请参考Chrome Manifest。
在你创建的extension文件夹的根目录上打开chrome.manifest文件,加入下面的代码:
content     sample    chrome/content/

(注意:不要忘记最后的"/",没有它的话,包将不会被注册)
格式说明:
  1. 这个chrome包的类型。
  2. chrome包的名字(你要确保包的名字全部都是小写字母,如“sample"。这是因为Firefox和Thunderbird的2.0以前的版本不支持混合(或驼型)大小写)
  3. chrome包文件的位置。
那么,这一行代码的意思就是:content类型的chrome包sample,我们可以在chrome/content目录中找到它的文件。这个目录是相对于chrome.manifest文件的相对目录。
注意:content、locale和skin文件必须放到它们的文件夹里,这是所谓的内容,locale和skin在你的chrome子目录下。 [B]  [B] 原文:Note that content, locale and skin files must be kept inside folders called content, locale and skin within your chrome subdirectory.
保存这个文件。当你启动Firefox加载你的扩展的时候(本教程后面),将会注册这个chrome包。

Register an Overlay

你需要Firefox将你的overlay与浏览器窗口合并,使他们显示为一体。那么,把下面这行加到chrome.manifest文件里。
overlay chrome://browser/content/browser.xul chrome://sample/content/sample.xul

这一行告诉Firefox在加载browser.xul时,将sample.xul和browser.xul合并在一起。

Test

首先,你需要把你开发的extension告诉Firefox。Firefox 2.0以后的版本,在开发期间,你可以向Firefox指定你在哪里开发扩展,它会有每次启动里加载。
  1. 找到profile文件夹 [C]  [C] 译者注:在linux操作系统下,此目录在~/.mozilla在它的下面找到你想要用于开发的profile(如:Firefox/Profiles/<profile_id>.default) [D]  [D] 译者注:这是default profile,一般情况下最好新建一个专门用于开发的profile。执行命令firefox -P dev,会创建一个<profile_id>.dev的profile。
  2. 打开extensions/文件夹,如果还没有,就创建它。
  3. 创建一个文本文件,将你的开发路径放写在文件里(如:C:\extensions\my_extension\ or ~/extensions/my_extension/),Windows用户应保持反斜杠的方向,并且,所有的人都应该记得要包括最后一个斜杠同时去掉所有的尾部空格。
  4. 将这个文本文件保存成你的extension的id值(如:sample@example.net),没有文件扩展名。
现在,你已经准备好测试你的extension啦。
启动Firefox,Firefox会检查你的extension目录的文本链接,并安装这个extension。当浏览器窗口显示出来的时候,你会看到在状态条右边有一个文本“Hello World!"。
现在你再回头修改一个xul文件,关闭再打开Firefox,你将会看到改变后的结果。

Package

现在你的extension已经可以工作啦,为了发布和安装,你可以把它打包啦。
把extension文件夹的内容压缩(不是压缩extension的目录),将zip文件扩展名改为xpi。在Windows XP下,你可以简单的选择extension目录下的所以的内容,然后单击鼠标右键,选择“发送->到压缩文件夹“,就会生成一个zip文件。只是将其改一下扩展名,你就做完啦。
在Mac OS X里,你可以单击右键,选择”Create Archive of ..."来创建zip文件。然而,Max OS X为了跟踪文件元数据,它会在文件夹中增加一些隐藏文件。你可以到终端 [E]  [E] Terminal去删除这些隐藏文件,然后在命令行上用zip命令生成zip文件。
在linux里,你也可以同样的命令行的命令生成。
如果你安装了“Extension Builder"扩展,它能为你编译.xpi文件(Tools->Extension Developer->Extension Builder),你只需要指定你的extension目录在哪(install.rdf等),按一下Builde Extension按钮就可以啦。这个扩展有一大堆使开发变得更容易的工具。
现在将你的.xpi文件上传到服务器,确保它做为一个application/x-xpinstall服务。你可以链接它,允许人们下载并安装它。如果不是为了测试我们的.xpi文件,我们就把它直接拖到扩展窗口,在Firefox 1.5.0.x版本的时候,通过Tools->Extensions打开扩展窗口。之后的版本,通过Tools->Add-ons打开扩展窗口。

Installing from web page

从web上安装extension有好几种方法,包括链接到xpi文件,直接用Install Trigger安装。我们鼓励extension和web作者用Install Trigger方法安装XPI,因为这样会给用户更好的体验。

Using addons.mozilla.org

Mozillz Add-ons是一个你可以免费分发你的extesion的站点。你的extesion将会放置在Mozilla的镜像网络中,这样,即使在网络繁忙的情况下你的extesion也可以保证下载。Mozilla站点还使用户安装更容易,并且,当你上传一个新版本时,可以让你以前的用户自动生成到新的版本。另外,Mozilla Add-ons允许用户对你的extension进行评论和反馈。这里,强烈推荐你用Mozilla Add-ons发布你的extension。
访问http://addons.mozilla.org/developers/,创建一个账号,发布你的extension吧。
注意:如果你的extension有一个好的描述并且再有一些截图的话,可能会很快通过 [F]  [F] 译者注:这里可能是指很快通过Mozilla的验证吧并会有更多的下载量。

Installing Extensions using a Separate Installer

你也可能通过指定一个特定的目录的方法安装extension,当应用程序启动时就会自动安装它。这个extension会在任何一个profile里都可用。瞧瞧Installing Extension可以得到更多的信息。
在Windows里,关于extension的一些信息可以加到注册表里,下一次应该程序启动里,extension可以自动取出来。这样,应用程序的安装者可以很容易的增加一个extension整合钩子。瞧瞧Adding Extensions using the Windows Registry可以得到更多的信息。

More on XUL Overlays

为了向合并点增加UI部件,你可以在Overlay里使用下面这关的片段:
修改合并点的属性,例如:<statusbar id="status-bar" hidden="true" /> (隐藏状态条)
从主文档里删除合并点,例如:<statusbar id="status-bar" removeelement="true" />
控制插入到合并点的小部件的位置,例如:

<statusbarpanel position="1" ...  />
<statusbarpanel insertbefore="other-id" ...  />
<statusbarpanel insertafter="other-id" ...  />

Create New User Interface Components

你可以用单独的xul文件创建自己的窗口或对话框,在js文件里实现处理用户动作的功能,用DOM方法操作UI部件。你可以用样式表规则的css文件增加image,设置颜色等。
更多的关于XUL开发者的资源,在XUL文档里可以找到。

Default Files

你需要放到用户的profile里的默认文件应该放在你的extension文件夹的defaults文件夹里,默认的参数.js文件应该放在defaults/preferences/里。当你放它们放到这里后,当它启动时Firefox会自动用Firefox参数系统加载它,这样你可以通过参数API访问它们。
一个默认参数文件的例子如下:
pref("extensions.sample.username", "Joe"); //a string pref
pref("extensions.sample.sort", 2); //an int pref
pref("extensions.sample.showAdvanced", true); //a boolean pref

XPCOM Components

Firefox在extension里支持XPCOM组件。你可以轻松的用JavaScript或C++创建自己的组件(用Gecko SDK)。
把你的.js或.dll文件放在components/目录里,你的extension安装后,Firefox第一次运行时会自动注册它们。
想了解更多,请看How to Build an XPCOM Component in Javascript,How to build a binary XPCOM component using Visual Studio和《Creating XPCOM Components》这本书。

Application Command Line

有这样一种可能,你可以用XPCOM为Firefox或Thunderbird加一个命令处理器。你可以用这种技术让你的extension像应用程序一样运行。
firefox.exe -myapp
详细信息参见Chrome: Command Line 和forum discussion 。

Localization

为了支持多于一种的语言,你应该将字符串从内容中独立出来,使用实体和字符串集。这个工作在开发时就做比到最后再返回头来做要容易的多。
本地化信息保存在extension的locale目录中。例如,要向我们的sample extension中增加本地化信息,在chrome目录下创建locale/en-US目录,然后在chrome.manifest文件中增加一行:
locale sample en-US chrome/locale/en-US/

要在XUL文件中创建一个本地化属性值,你可以将值放在.dtd文件里(对于我们这个例子来说就是sample.dtd文件)。这个文件应该放在locale目录下,其内容看起来像这样:
<!ENTITY my-panel.label "Hello, World">

接着,将它包含在XUL文件的头部(但要在"<?xml version"1.0"?>"下面),像这样:
<?xml version="1.0"?>
<!DOCTYPE window SYSTEM "chrome://packagename/locale/filename.dtd">
...

这里window是XUL文档的根元素的localName值,SYSTEM属性的值指向实体文件的chrome URI。
对于我们的sample extension,将window替换为overlay(根元素),将packagename替换为sample,将filename.dtd替换为sample.dtd。
需要使用这个实体时,像下面这样修改XUL文件:
<statusbarpanel id="my-panel" label="&my-panel.label;"  />

Chrome Registry负责根据选择的区域从本地化集中加载合适的实体文件。
你在脚本中使用的字符串,需要创建一个.properties属性文件,这个文本文件的每一个代表一个字符串,格式像这样:
key=value
然后,用nsIStringBundleService /nsIStringBundle或stringbundle标记将值加载到脚本中。

Understanding the Browser

用DOM Inspector检查浏览器窗口或者任何一个你想扩展的其它XUL窗口。
注意:DOM Inspector并不是标准的Firefox的一部分。从Firefox 3 bate 4以后,DOM Inspector在FirefoxAdd-ons里做为一个独立的扩展来用。对于前期的版本,如果在浏览器的tools菜单里没有DOM Inspector选项,你必须重新安装定制安装目录,并且选择DOM Inspector(或者是在Firefox 1.5里选择Developer Tools)。
用DOM Inspector工具条的是point-and-click node finder按钮,在XUL可视窗口上的选择一个node,这时你会看到DOM分层树中会直接定位到相应的node上。
用DOM Inspector的右侧面板可以通过id查找你想从overlay插入的你的元素的合并点。如果你不能通过id查找到合并点,那么你需要在你的overlay里附加一段脚本,当主XUL窗口的加载事件发生时,你将你的元素插入。

Debuging Extensions

Analytical Tools for Debugging

  • DOM Inspector- 检查属性,DOM结构,生效的CSS样式规则(例如:找出为什么你的样式表不能在某个元素的显现-直是一个无价的工具!)
  • Venkman- 在javascript脚本中设置断点,并检查堆栈
  • JavaScript的arguments.callee.caller - 访问函数调用堆栈

printf debugging

  • 用dump("string") - 这个需要对工作上属性进行一点配置,详情请参阅这里。
  • 用Components.utils.reportError()或nsIConsoleService将日志写到JavaScript终端

Advanced debugging

  • 运行一个debug版本的Firefox,在Firefox或你的c++组件中设置断点。对于一个有经验的开发者,这通过是最快的诊断问题的方法。详情请参阅Build Documentation 和Developing Mozilla。
  • 参见Debugging a XULRunner Application会看到更多的技巧和帮助。

Further Information

  • Extension FAQ
  • Extensions

Document generated by eLyXer 1.2.2 (2011-06-12) on 2011-12-19T23:19:06.086708

创建Firefox扩展相关推荐

  1. firefox扩展开发(二):用XUL创建窗口控件

    firefox扩展开发(二):用XUL创建窗口控件 2008-06-11 16:57 1.创建一个简单的窗口 <?xml version="1.0"?> <?xm ...

  2. firefox附加组件开发者指南(五)——创建一个firefox扩展(上)

    本章篇幅较长,分上下两部分发布,本章中的图和清单4在原网站中没有,因此这里也没有,感兴趣的可以去原文补充.下面是译文. 至今为止,各个章节中独立的介绍了相关的技术--XUL.javascript.CS ...

  3. chrome扩展程序_如何创建Chrome扩展程序

    chrome扩展程序 by Erika Tan 谭咏麟 如何创建Chrome扩展程序 (How to create a Chrome Extension) In this article, I wil ...

  4. linux ansible_17本技术书籍,4个出色的Firefox扩展,Linux技巧,Buildah,Ansible和其他热门阅读

    linux ansible 上周,与Linux相关的文章在我们的前十名中占据了主导地位,但是到目前为止,我们针对Linux和开源爱好者的17本书的综述是我们最大的成功. 请继续阅读,以了解上周Open ...

  5. 编写Firefox扩展(翻译)

    编写Firefox扩展 FireFox和Thunderbird有很好的扩展架构,你可以通过XML和ECMAScript结合的方式而不用通过编写C程序的方式来编写扩展 在这个Blog里面,我将会看看如何 ...

  6. 提高firefox扩展开发效率

    本文介绍一些技巧和开发扩展中使用的工具,主要参考:https://developer.mozilla.org/En/Firefox_addons_developer_guide的第五章(Chapter ...

  7. Firefox扩展初接触

    本文没涉及如何写一个扩展,而是简单整理一下扩展涉及到的周边的东西. 环境 Profile配置文件的默认位置: Windows %APPDATA%\Mozilla\ Unix/Linux ~/.mozi ...

  8. Firefox扩展安装

    firefox扩展和chrome扩展非常相似,甚至兼容.因总结过chrome扩展的开发,这里不提,本篇谈谈firefox扩展的安装. 1.打包 所谓的打包,就是压缩,利用普通的右键压缩文件夹,这样形成 ...

  9. 对xxl-job进行simpleTrigger并动态创建任务扩展

    2019独角兽企业重金招聘Python工程师标准>>> 博文原址:对xxl-job进行simpleTrigger并动态创建任务扩展 业务场景 需求上要求能实现quartz的simpl ...

最新文章

  1. javascript函数嵌套时arguments的问题
  2. CVPR2021|基于双边扩充和自适应融合方法的点云语义分割网络
  3. 反激式开关电源变压器设计
  4. python 网站文件下载-python从网站上下载东西
  5. Akka的Hello World(二)Akka的Actor生命周期
  6. python和perl哪个好_做为脚本语言来说perl和python那个更有优势?
  7. ABAP事务码SAT里的Gross time and net time
  8. 算法设计与分析——贪心算法——最优装载问题
  9. oracle thin和oci 区别
  10. Win10系统局域网中的其他电脑能Ping通但是无法访问本地IIS发布的网站
  11. web前端工程师学习路线指南,完整Web前端学习路线图
  12. 详解loadrunner的think time
  13. GCC 常见参数配置
  14. 详解Python序列解包(3)
  15. 学习iptables
  16. 关于html5毕业论文设计任务书,毕业论文设计任务书(精选多篇)
  17. 项目管理工具的选型(jira,teambition,worktitle,tower,trello,云效,禅道)和禅道的基本介绍...
  18. scala 如何读取 csv 文件
  19. 不了解干眼症?可能你早就被它盯上了!
  20. C语言课后问答题汇总

热门文章

  1. MainWindow.xaml.cs
  2. mysql里any是什么_【MySQL】mysql中any,in,some,all的区别
  3. 改装普通电脑为触屏电脑
  4. 学人工智能电脑主机八大件配置选择指南
  5. #730 (Div. 2) A 思维 C dfs D1 交互思维
  6. web前端开发技术 web课程设计 网页规划与设计web期末作业设计网页
  7. 微商的微信营销互动方法
  8. canvas制作旋转的太极图
  9. minSdk(API 26) deviceSdk(API 17)
  10. 数学术语——内积(inner product)