构建一个扩展

  • 版本网址缩略名: 构建一个扩展
  • 版本标题: 构建一个扩展
  • 版本 id: 246194
  • 创建于:
  • 创建者: demonsimon
  • 是否是当前版本?
  • 评论 no wording changes

修订内容

[ {{ mediawiki.external('== 快乐学习.快乐生活.. ==') }}]

本文档逐步演示如何建立一个简单的扩展,在火狐的状态栏上添加一个小面板显示 "Hello,World!"

注意 本文档适用于火狐 1.5或更新的版本。 为早期版本的火狐开发扩展请参考其它文档。

建立开发环境

扩展文件以 ZIP 方式打包发布,带有扩展名 xpi (发音为 “zippy”)。 XPI 文件展开后的目录结构类似于下面(我们也可以使用netbean进行扩展的开发,我们可以创建一个扩展的开发项目,netbean会为我们创建支持的文件):

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.manifestinstall.rdf。完成之后的目录结构应该类似于:

 

<ext path>\
          install.rdf
          chrome.manifest
          chrome\
             content\

建立开发环境的方法见:建立扩展的开发环境.

创建安装配置文件

把如下内容加入 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 URIs)

(translated by demonsimon)

XUL文件是Chrome包的一部分,Chrome包( Chrome Packages )其实是一些用户界面组件的集合,而这些用户界面组件(user interface components)是通过 chrome://URIs 来载入。就像在磁盘中通过 file:// URI 来访问浏览器一样,Firefox可能会因为运行平台的不同,所在的目录也不同,Mozilla的开发者们想出来一种通过将路径附加到XUL的内容中来解决的方法,这样,被安装的程序也会知道路径。

Firefox浏览器窗口的Chrome路径是 chrome://browser/content/browser.xul 。你可以尝试一下再Firefox的地址栏里输入上述地址!


Chrome路径包含下面几个方面:

首先,路径类型URI scheme,就是“ chrome:// ”会告诉Firefox的网络库这是一条Chrome路径。它表示这个路径指向的内容应该按照一个chrome来处理,就好像http会告诉Firefox这个地址应该按照网页处理一样。
其次,一个Chrome包的名字(正如上面例子里的browser),是用来区别这些包的。因此,应用的名字尽量要与别人不同,以免引起不同扩展控件(extension)间的冲突。

再次,数据的类型。一共有三种类型:content,locale和skin。content是用XUL、JavaScript、XBL bindings等共同完成的应用界面(Application UI)的行为与框架。locale是由DTD、.properties文件等来描述UI位置的字符串。Skin则是用CSS和图片来制作的UI的主题。

最后,还要有载入文件的路径。

所以, chrome://foo/skin/bar.png  是从foo的主题中载入图片bar.png。

当你从一个Chrome路径载入content时,Firefox用Chrome注册文件(Chrome Registry)将这些URI翻译成真实硬盘上的原文件(或者JAR包内的文件)。

<o:p xmlns:o="#unknown"> </o:p>

创建 Chrome 清单

要了解更多关于 Chrome Manifests 的信息,请参考

Chrome Manifest

把下列代码加到 chrome.manifest 文件当中:

content     sample    chrome/content/

(不要忘了最后的"/"! 少了它, 扩展加载会失败.)

这个文件指定如下内容:

  1. chrome 包所包含的内容
  2. chrome 包的名字
  3. 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 文件,并用火狐打开,安装。这很麻烦,现在已经有了更便捷的方法。

  1. 打开你的 Profile Folder 
  2. 打开 extensions 目录 (如果没有,就创建一个)
  3. 建立一个新的目录sample@foo.net,然后将刚才的扩展目录也就是~/extensions/myExtension or C:\extensions\myExtension\中所有的文件拷贝到目录sample@foo.net下。

现在我们可以测试扩展了!

启动火狐。火狐会发现并安装你的扩展。当浏览器的主窗口显示时,在其右下方,状态栏中,应该能看到文字 "Hello, World!"。

<center>

Image:firefox_extension_statusbar.PNG

</center>

打包

现在我们的扩展已经能工作了,在发布前,应该把它打个包。

把扩展所在目录下的文件,目录,子目录用 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) {{ languages( { "de": "de/Erweiterung_erstellen", "en": "en/Building_an_Extension", "es": "es/Creando_una_extensi\u00f3n", "fr": "fr/Construire_une_extension", "it": "it/Sviluppare_un\'Estensione", "ja": "ja/Building_an_Extension", "pl": "pl/Tworzymy_rozszerzenie", "pt": "pt/Construir_uma_Extens\u00e3o", "ru": "ru/\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f" } ) }}

修订版来源

<p>[ {{ mediawiki.external('== 快乐学习.快乐生活.. ==') }}<strong>]</strong></p>
<p>本文档逐步演示如何建立一个简单的扩展,在火狐的状态栏上添加一个小面板显示 "Hello,World!"</p>
<div class="note"><strong>注意</strong> 本文档适用于火狐 1.5或更新的版本。 为早期版本的火狐开发扩展请参考其它文档。</div>
<h4 name=".E5.BB.BA.E7.AB.8B.E5.BC.80.E5.8F.91.E7.8E.AF.E5.A2.83">建立开发环境</h4>
<p>扩展文件以 ZIP 方式打包发布,带有扩展名 <code>xpi</code> (<em>发音为 “zippy”</em>)。 XPI 文件展开后的目录结构类似于下面(我们也可以使用netbean进行扩展的开发,我们可以创建一个扩展的开发项目,netbean会为我们创建支持的文件):</p>
<pre class="eval">extension.xpi:
              /<a href="/cn/Install_Manifests" title="cn/Install_Manifests">install.rdf</a>                   
              <a href="#XPCOM_Components">/components/*</a>  
              <a href="#Application_Command_Line">/components/cmdline.js</a>                   
              <a href="#Defaults_Files">/defaults/</a>
              <a href="#Defaults_Files">/defaults/preferences/*.js</a>     
              /plugins/*                        
              /<a href="/cn/chrome.manifest" title="cn/chrome.manifest">chrome.manifest</a>                
              /<a href="/cn/chrome_window_icons" title="cn/chrome_window_icons">chrome/icons/default/*</a>       
              /chrome/
              /chrome/content/
     
</pre>
<p>在开发时最好采用相同目录结构,这样可以直接用于测试,比较方便。</p>
<p>好,我们现在开始写扩展。先建立一个目录,比如<code>~/extensions/myExtension/</code> 或者 <code>C:\extensions\myExtension\</code>。在这个目录下,建立一个子目录 <code>chrome</code>, 在 <code>chrome</code> 下,再建立一个目录 <code>content</code>。</p>
<p>(在类 unix 系统上,你可以同 <code>mkdir -p chrome/content</code> 同时建立 chrome 和 content 目录;在 windows 上,你可以 <code>md chrome/content</code> 来同时建立 chrome 和 content 目录)。</p>
<p>在扩展的 <strong>根</strong> 目录下,<code>chrome</code> 目录的旁边,创建立两个文本文件, <code>chrome.manifest</code> 和 <code>install.rdf</code>。完成之后的目录结构应该类似于:</p>
<p> </p>
<pre>&lt;ext path&gt;\
          install.rdf
          chrome.manifest
          chrome\
             content\</pre>
<p>建立开发环境的方法见:<a class="internal" href="/en/Setting_up_extension_development_environment" title="En/Setting up extension development environment">建立扩展的开发环境</a>.</p>
<h4 name=".E5.88.9B.E5.BB.BA.E5.AE.89.E8.A3.85.E9.85.8D.E7.BD.AE.E6.96.87.E4.BB.B6">创建安装配置文件</h4>
<p>把如下内容加入 install.rdf</p>
<pre class="eval">&lt;?xml version="1.0"?&gt;

&lt;RDF xmlns="<span class="nowiki">http://www.w3.org/1999/02/22-rdf-syntax-ns#</span>"
     xmlns:em="<span class="nowiki">http://www.mozilla.org/2004/em-rdf#</span>"&gt;

  &lt;Description about="urn:mozilla:install-manifest"&gt;
    &lt;em:id&gt;<strong><a class=" link-mailto" href="mailto:sample@foo.net" rel="freelink">sample@foo.net</a></strong>&lt;/em:id&gt;
    &lt;em:version&gt;<strong>1.0</strong>&lt;/em:version&gt;
    &lt;em:type&gt;2&lt;/em:type&gt;
   
    &lt;!-- Target Application this extension can install into, 
         with minimum and maximum supported versions. --&gt; 
    &lt;em:targetApplication&gt;
      &lt;Description&gt;
        &lt;em:id&gt;<strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong>&lt;/em:id&gt;
        &lt;em:minVersion&gt;<strong>1.0+</strong>&lt;/em:minVersion&gt;
        &lt;em:maxVersion&gt;<strong>1.5.0.*</strong>&lt;/em:maxVersion&gt;
      &lt;/Description&gt;
    &lt;/em:targetApplication&gt;
   
    &lt;!-- Front End MetaData --&gt;
    &lt;em:name&gt;<strong>Sample!</strong>&lt;/em:name&gt;
    &lt;em:description&gt;<strong>A test extension</strong>&lt;/em:description&gt;
    &lt;em:creator&gt;<strong>Your Name Here</strong>&lt;/em:creator&gt;
    &lt;em:homepageURL&gt;<strong><span class="nowiki">http://www.foo.com/</span></strong>&lt;/em:homepageURL&gt;
  &lt;/Description&gt;      
&lt;/RDF&gt;
</pre>
<ul> <li><strong><a class=" link-mailto" href="mailto:sample@foo.net" rel="freelink">sample@foo.net</a></strong> - 扩展的 ID. 这个值的作用是唯一标识这个扩展,并不是你的邮件地址。也可以直接使用 GUID。</li> <li>指明 <code>&lt;em:type&gt;2&lt;/em:type&gt;</code> -- 2 表示这是一个扩展 (其它类型看这里 <a href="/cn/Install_Manifests#type" title="cn/Install_Manifests#type">Install Manifests#type</a>)。</li> <li><strong>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</strong> - 火狐的唯一标识。</li> <li><strong>1.0+</strong> - 所兼容的火狐最低版本号。</li> <li><strong>1.5.0.*</strong> - 所兼容的火狐最高版本号。请勿把它设置为高于火狐当前的最高版本号。</li>
</ul>
<p>更多的属请看这里</p>
<p><a href="/cn/Install_Manifests" title="cn/Install_Manifests">Install Manifests</a>。</p>
<p>保存文件。</p>
<p><a class="external" href="http://www.google.com">link title</a></p>
<h4 name=".E7.94.A8_XUL_.E6.89.A9.E5.B1.95.E6.B5.8F.E8.A7.88.E5.99.A8">用 XUL 扩展浏览器</h4>
<p>火狐的用户界面是用 XUL 和 JavaScript 写成的。</p>
<p><a href="/cn/XUL" title="cn/XUL">XUL</a> 通过 XML 语法描述用户界面的 widgets 组织。widgets 可以与 JavaScript 代码绑定,提供各种功能。</p>
<p>通过加入或修改 widget,可以修改浏览器的用户界面。</p>
<p>browser(浏览器的主窗口) 所对应的 XUL 文件是 <code>browser.xul</code>(包含在<code>$FIREFOX_INSTALL_DIR/chrome/browser.jar</code> 中). 在 browser.xul 可以找到对状态栏的描述:</p>
<pre class="eval">&lt;statusbar id="status-bar"&gt;
 ... &lt;statusbarpanel&gt;s ...
&lt;/statusbar&gt;
</pre>
<p><code>&lt;statusbar id="status-bar"&gt;</code> 是 XUL 覆盖的一个“融合点”。</p>
<h5 name="XUL_.E8.A6.86.E7.9B.96">XUL 覆盖</h5>
<p> </p>
<p><a href="/cn/XUL_Overlays" title="cn/XUL_Overlays">XUL Overlays</a> 是一种动态添加 widgets 到 XUL 文档的一种方法。 一个 XUL 覆盖就是一个 .xul 文件,该文件描述了一段 XUL 代码通过哪一个“融合点” 插入到“主”文档中。插入的 XUL 代码可以描述 widgets 的插入,删除和修改。</p>
<p><strong>XUL 覆盖文档的例子</strong></p>
<pre class="eval">&lt;?xml version="1.0"?&gt;
&lt;overlay id="sample" 
         xmlns="<span class="nowiki">http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul</span>"&gt;
 &lt;statusbar id="<strong>status-bar</strong>"&gt;
  &lt;statusbarpanel id="my-panel" label="Hello, World"/&gt;
 &lt;/statusbar&gt;
&lt;/overlay&gt;
</pre>
<p>命名为<strong>status-bar</strong> 的 <code>&lt;statusbar&gt;</code> 元素指定了在 browser 窗口上附加元素的 “融合点”。</p>
<p>子元素 <code>&lt;statusbarpanel&gt;</code> 要添加的的 widget。</p>
<p>把上面的示例代码保存在一个文件 <code><strong>sample.xul</strong></code> 中,并把它复制到前面创建的 <code>chrome/content</code> 目录下。</p>
<h4 name="Chrome_.E8.B7.AF.E5.BE.84"><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p><span lang="EN-US">Chrome </span>路径<span lang="EN-US">(Chrome URIs)</span><span lang="EN-US"><br>
</span></p>
</h4>
<h6><span lang="EN-US">(translated by demonsimon</span>)</h6>
<p>XUL文件是Chrome包的一部分,Chrome包( Chrome Packages )其实是一些用户界面组件的集合,而这些用户界面组件(user interface components)是通过 <a class=" external" href="chrome://URIs" rel="freelink">chrome://URIs</a> 来载入。就像在磁盘中通过 <a class=" external" href="file://" rel="freelink">file://</a> URI 来访问浏览器一样,Firefox可能会因为运行平台的不同,所在的目录也不同,Mozilla的开发者们想出来一种通过将路径附加到XUL的内容中来解决的方法,这样,被安装的程序也会知道路径。</p>
<p>Firefox浏览器窗口的Chrome路径是 <a class=" external" href="chrome://browser/content/browser.xul" rel="freelink">chrome://browser/content/browser.xul</a> 。你可以尝试一下再Firefox的地址栏里输入上述地址!</p>
<p><br>
Chrome路径包含下面几个方面:</p>
<p>首先,路径类型URI scheme,就是“ <a class=" external" href="chrome://" rel="freelink">chrome://</a> ”会告诉Firefox的网络库这是一条Chrome路径。它表示这个路径指向的内容应该按照一个chrome来处理,就好像http会告诉Firefox这个地址应该按照网页处理一样。<br>
其次,一个Chrome包的名字(正如上面例子里的browser),是用来区别这些包的。因此,应用的名字尽量要与别人不同,以免引起不同扩展控件(extension)间的冲突。</p>
<p>再次,数据的类型。一共有三种类型:content,locale和skin。content是用XUL、JavaScript、XBL bindings等共同完成的应用界面(Application UI)的行为与框架。locale是由DTD、.properties文件等来描述UI位置的字符串。Skin则是用CSS和图片来制作的UI的主题。</p>
<p>最后,还要有载入文件的路径。</p>
<p>所以, <a class=" external" href="chrome://foo/skin/bar.png" rel="freelink">chrome://foo/skin/bar.png</a>  是从foo的主题中载入图片bar.png。</p>
<p>当你从一个Chrome路径载入content时,Firefox用Chrome注册文件(Chrome Registry)将这些URI翻译成真实硬盘上的原文件(或者JAR包内的文件)。</p>
<h4 name="Chrome_.E8.B7.AF.E5.BE.84"><code><span lang="EN-US"><o:p xmlns:o="#unknown"> </o:p></span></code></h4>
<h4 name=".E5.88.9B.E5.BB.BA_Chrome_.E6.B8.85.E5.8D.95">创建 Chrome 清单</h4>
<p>要了解更多关于 Chrome Manifests 的信息,请参考</p>
<p><a href="/cn/Chrome_Manifest" title="cn/Chrome_Manifest">Chrome Manifest</a>。</p>
<p>把下列代码加到 <strong>chrome.manifest</strong> 文件当中:</p>
<pre class="eval">content     sample    chrome/content/
</pre>
<p>(<strong>不要忘了最后的"<code>/</code>"!</strong> 少了它, 扩展加载会失败.)</p>
<p>这个文件指定如下内容:</p>
<ol> <li>chrome 包所包含的内容</li> <li>chrome 包的名字</li> <li>chrome 包对应文件的位置</li>
</ol>
<p>在我们的 chrome 包 <strong>sample</strong> 中,<strong>content</strong> 所包含的文件位于 <code>chrome/content</code> 下,这个路径是相对于 <code>chrome.manifest</code> 而言的。</p>
<p>注意,content, locale 和 skin 的文件必须放在 <code>chrome</code> 的子目录 conetnt, local, skin 中。如没有 local,skin 文件,则可以忽略。</p>
<p>在安装扩展时,火狐会根据这个文件来登记 chrome 包。</p>
<h4 name=".E7.99.BB.E8.AE.B0.E8.A6.86.E7.9B.96">登记覆盖</h4>
<p>若想在浏览器的主窗口显示时,我们所附加的 widget 也同时显示,必须向火狐登记。在 <code>chrome.manifest</code> 中添加一行:</p>
<pre class="eval">overlay <a class=" external" href="chrome://browser/content/browser.xul" rel="freelink">chrome://browser/content/browser.xul</a> <a class=" external" href="chrome://sample/content/sample.xul" rel="freelink">chrome://sample/content/sample.xul</a>
</pre>
<p>这表示在 browser.xul 加载时,同时加载覆盖<code>sample.xul</code>.</p>
<h4 name=".E6.B5.8B.E8.AF.95">测试</h4>
<p>首先,我们要把扩展安装到火狐中。在火狐 1.0 以前,必须把文件打包成 XPI 文件,并用火狐打开,安装。这很麻烦,现在已经有了更便捷的方法。</p>
<ol> <li>打开你的 <a class="external" href="http://kb.mozillazine.org/Profile_folder" title="http://kb.mozillazine.org/Profile_folder">Profile Folder</a> </li> <li>打开 <strong>extensions</strong> 目录 (如果没有,就创建一个)</li> <li>建立一个新的目录<a class="link-mailto" href="mailto:sample@foo.net">sample@foo.net</a>,然后将刚才的扩展目录也就是<code>~/extensions/myExtension</code> or <code>C:\extensions\myExtension\中所有的文件拷贝到目录</code><code><a class="link-mailto" href="mailto:sample@foo.net">sample@foo.net</a>下。<br> </code></li>
</ol>
<p>现在我们可以测试扩展了!</p>
<p>启动火狐。火狐会发现并安装你的扩展。当浏览器的主窗口显示时,在其右下方,状态栏中,应该能看到文字 "Hello, World!"。</p>
<center>
<p><img alt="Image:firefox_extension_statusbar.PNG" class="internal" src="/@api/deki/files/2659/=Firefox_extension_statusbar.PNG"></p>
</center>
<h4 name=".E6.89.93.E5.8C.85">打包</h4>
<p>现在我们的扩展已经能工作了,在发布前,应该把它打个包。</p>
<p>把扩展所在目录下的文件,目录,子目录用 zip 方式打个包,并带有后缀 .xpi。若你安装有 7z,可以这样:</p>
<pre class="eval">7z -tzip a sample.xpi *
</pre>
<p>现在可以把你的 .xpi 文件放到服务器上,确保该服务器能识别 <code>application/x-xpinstall</code> 类型. 你可以提供到这个文件的连接,这样用户就能通过火狐来安装它了。</p>
<p>比如:sample.xpi</p>
<p><a class="external" href="http://zhaxiaolei.googlepages.com/sample.xpi">点击安装</a></p>
<h4 name=".E4.BB.8E.E7.BD.91.E9.A1.B5.E5.AE.89.E8.A3.85.E6.89.A9.E5.B1.95">从网页安装扩展</h4>
<p>你能有很多种方法从网页上安装各种扩展,其中包括通过使用InstallTrigger对象直接点击后缀为xpi的链接。鼓励扩展提供商和网络创作者使用</p>
<p><a class="external" href="/en/docs/Installing_Extensions_and_Themes_From_Web_Pages" title="en/docs/Installing_Extensions_and_Themes_From_Web_Pages">InstallTrigger方法</a>来安装各类xpi,给用户提供最好的经验 --<a href="/User:Yyn9566" title="User:Yyn9566">Yyn9566</a> 07:02 2007年3月21日 (PDT) {{ languages( { "de": "de/Erweiterung_erstellen", "en": "en/Building_an_Extension", "es": "es/Creando_una_extensi\u00f3n", "fr": "fr/Construire_une_extension", "it": "it/Sviluppare_un\'Estensione", "ja": "ja/Building_an_Extension", "pl": "pl/Tworzymy_rozszerzenie", "pt": "pt/Construir_uma_Extens\u00e3o", "ru": "ru/\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f" } ) }}</p>
恢复到这个版本