更新 Firefox 3 扩展

本文提供的信息对希望更新扩展以使其在 Firefox 3 中正常工作的开发人员很有用。

在继续之前,我们可以提供一个有用的提示:如果您的扩展只需要更改安装清单中的 maxVersion 字段,并且您在 addons.mozilla.org 上托管您的扩展,您实际上不需要上传扩展的新版本!使用 AMO 上的开发人员控制面板调整 maxVersion。这样可以避免您的扩展重新审核。

步骤 1:更新安装清单

第一步,也是对大多数扩展来说唯一的步骤,是更新 安装清单 文件,install.rdf,以指示与 Firefox 3 兼容。

找到指示 Firefox 兼容的最大版本的行(对于 Firefox 2,可能看起来像这样)

xml
<em:maxVersion>2.0.*</em:maxVersion>

将其更改为指示与 Firefox 3 兼容

xml
<em:maxVersion>3.0.*</em:maxVersion>

然后重新安装您的扩展。

请注意,Firefox 3 取消了版本号中的额外 ".0",因此您只需使用 3.0.*,而不是使用 3.0.0.*

已经(并将继续)发生许多 API 更改,这些更改可能会破坏一些扩展。我们仍在努力编制这些更改的完整列表。

注意:如果您的扩展仍然使用 Install.js 脚本而不是 安装清单,您现在需要过渡到安装清单。Firefox 3 不再支持 XPI 文件中的 install.js 脚本。

向安装清单添加本地化

Firefox 3 支持安装清单中的新属性,以指定本地化的描述。旧方法仍然有效,但新的方法允许 Firefox 即使在附加组件被禁用并等待安装时也能获取本地化。有关更多详细信息,请参阅 本地化扩展描述

步骤 2:确保您提供安全的更新

如果您自己托管附加组件,而不是在像 addons.mozilla.org 这样的安全附加组件托管提供商上托管,那么您必须提供一种安全的更新附加组件的方法。这将涉及将您的更新托管在 SSL 网站上,或使用加密密钥对更新信息进行签名。阅读 安全更新 了解更多信息。

步骤 3:处理更改的 API

一些 API 发生了重大改变。其中最重大的变化,可能会影响大量扩展,包括

DOM

来自外部文档的节点应使用 document.importNode()(或使用 document.adoptNode() 采用)克隆,然后才能将其插入当前文档。有关 Node.ownerDocument 问题的更多信息,请参阅 W3C DOM 常见问题解答

Firefox 目前不强制执行此规则(在 Firefox 3 的开发过程中强制执行了一段时间,但当强制执行此规则时,太多网站会出错)。我们鼓励 Web 开发人员修复其代码以遵循此规则,以提高未来的兼容性。

书签和历史记录

如果您的扩展以任何方式访问书签或历史记录数据,则需要进行大量的修改才能与 Firefox 3 兼容。访问这些信息的旧 API 已被新的 Places 架构取代。请参阅 Places 迁移指南,了解有关将现有扩展更新为使用 Places API 的详细信息。

下载管理器

下载管理器 API 发生了轻微更改,因为从 RDF 数据存储过渡到使用 Storage API。这应该是一个相当容易的过渡。此外,监视下载进度的 API 已更改为支持多个下载管理器侦听器。请参阅 nsIDownloadManagernsIDownloadProgressListener监视下载 了解更多信息。

密码管理器

如果您的扩展使用密码管理器访问用户登录信息,则需要更新为使用新的登录管理器 API。

  • 文章 使用 nsILoginManager 包含示例,包括演示如何编写扩展以与密码管理器和登录管理器都一起工作,因此它将与 Firefox 3 和早期版本兼容。
  • nsILoginInfo
  • nsILoginManager

您还可以覆盖内置密码管理器存储,如果您想在扩展中提供自己的密码存储实现。有关详细信息,请参阅 创建登录管理器存储模块

弹出窗口(菜单、上下文菜单、工具提示和面板)

XUL 弹出窗口系统在 Firefox 3 中进行了大量修改。弹出窗口系统包括主菜单、上下文菜单和弹出面板。创建了一个关于 使用弹出窗口 的指南,详细介绍了该系统的工作原理。需要注意的是,popup.showPopup 已被新的 popup.openPopuppopup.openPopupAtScreen 弃用。

自动完成

nsIAutoCompleteController 接口的 handleEnter() 方法已更改为接受一个参数,该参数指示文本是来自自动完成弹出窗口还是用户在键入文本后按回车键。

DOMParser

  • 当实例化 DOMParser 时,它将继承调用代码的主体以及构造函数来自的窗口的 documentURIbaseURI
  • 如果调用者具有 UniversalXPConnect 权限,则可以将参数传递给 new DOMParser()。如果传递的参数少于三个,则剩余的参数将默认为 null
    • 第一个参数是要使用的主体;这将覆盖通常继承的默认主体。
    • 第二个参数是要使用的 documentURI
    • 第三个参数是要使用的 baseURI
  • 如果您使用契约初始化 DOMParser,例如通过调用 createInstance(),并且您没有调用 DOMParserinit() 方法,尝试启动解析操作将自动使用 null 主体和 null 指针为 documentURIbaseURI 创建和初始化 DOMParser

停止使用内部字符串 API

内部字符串 API 现在不再导出;您必须迁移到外部字符串 API。请参阅以下文章以获取有用信息

已删除的接口

以下接口已从 Gecko 1.9 中删除,Gecko 1.9 驱动 Firefox 3。如果您的扩展使用了这些接口中的任何一个,您需要更新您的代码

  • nsIDOMPaintListener
  • nsIDOMScrollListener
  • nsIDOMMutationListener
  • nsIDOMPageTransitionListener
  • nsICloseAllWindows(请参阅 Firefox 错误 386200

步骤 4:检查相关的 chrome 更改

chrome 布局有一些更改,可能会影响某些扩展。

新框

chrome 发生了一点小变化,可能需要您更改代码。添加了一个新的 vbox,名为“browser-bottombox”,它将浏览器窗口底部的查找栏和状态栏包围起来。虽然这不会影响显示的外观,但如果您的扩展相对于这些元素覆盖 chrome,它可能会影响您的扩展。

例如,如果您之前在状态栏之前覆盖了一些 chrome,像这样

xml
<window id="main-window">
  <something insertbefore="status-bar" />
</window>

您现在应该像这样覆盖它

xml
<vbox id="browser-bottombox">
  <something insertbefore="status-bar" />
</vbox>

或者使用以下技术使您的覆盖在 Firefox 2 和 Firefox 3 上都正常工作

xml
<window id="main-window">
  <vbox id="browser-bottombox" insertbefore="status-bar">
    <something insertbefore="status-bar" />
  </vbox>
</window>

更改的框

尝试覆盖“appcontent”框的扩展试图将 chrome 浮动到文档内容之上,将不再显示这些材料。您应该更新您的扩展以使用新的 <xul:panel> XUL 元素。如果您希望阻止面板在延迟后自动消失,可以将 noautohide 属性设置为 true

其他更改

在更新您的扩展以使其与 Firefox 3 兼容时,在此处添加您必须进行的简单更改。

  • 出于安全原因,chrome://browser/base/utilityOverlay.js 不再受支持。如果您之前使用过它,您应该切换到 chrome://browser/content/utilityOverlay.js
  • nsIAboutModule 实现现在需要支持 getURIFlags 方法。有关文档,请参阅 nsIAboutModule.idl。这会影响提供新的 about: URI 的扩展。(Firefox 错误 337746
  • <xul:tabbrowser> 元素不再是 "toolkit" 的一部分 (Firefox 错误 339964)。这意味着此元素不再可用于 XUL 应用程序和扩展。它仍然在主 Firefox 窗口 (browser.xul) 中使用。
  • 需要记录对 nsISupports_proxies 的更改,以及可能对线程相关接口的更改。
  • 如果您在 XUL 文件中使用 XML 处理指令,例如 <?xml-stylesheet ?>,请注意 Firefox 错误 319654 中所做的更改。
    1. XML PI 现在被添加到 XUL 文档的 DOM 中。这意味着 document.firstChild 不再保证是根元素。如果您需要在脚本中获取根文档,请使用 document.documentElement
    2. <?xml-stylesheet ?><?xul-overlay ?> 处理指令在文档序言之外不再有任何效果。
  • 加载 Web 内容 (浏览器页面加载) 时,不会触发 window.addEventListener("load", myFunc, true)。这是由于 Firefox 错误 296639 改变了内部和外部窗口之间的通信方式。这里简单的解决方法是使用 gBrowser.addEventListener("load", myFunc, true),如 这里 所述,并且在 Firefox 2 中也有效。
  • content.window.getSelection() 返回一个对象(可以通过 toString() 转换为字符串),这与现在已弃用的 content.document.getSelection() 不同,后者返回一个字符串。
  • event.preventBubble() 在 Firefox 2 中已弃用,并在 Firefox 3 中已删除。请使用 event.stopPropagation(),它在 Firefox 2 中也有效。
  • 由于对 Firefox 错误 52209 的修复,使用 setTimeout() 启动的计时器现在会被模式窗口阻止。您可以使用 nsITimer 代替。
  • 如果您的扩展需要允许不受信任的来源(例如,网站)访问扩展的 Chrome,那么您必须使用新的 contentaccessible 标志