Firefox 9 扩展更新
Firefox 9 的变动不多,不应该会对扩展开发者造成兼容性问题。但是,有几处可能会让您遇到麻烦,让我们来看看。
您需要做些什么吗?
如果您的扩展发布在 addons.mozilla.org (AMO) 上,它已经通过了一个自动化的兼容性验证工具进行了检查。没有使用 Firefox 8 中更改的 API 且不包含二进制组件(需要为每个主要的 Firefox 版本重新编译)的扩展,已在 AMO 上自动更新,以表明它们可以在 Firefox 9 中运行。
所以,您应该首先访问 AMO,查看您的扩展是否需要进行任何工作。
注意: 即使您的扩展已自动升级,您仍应在 Firefox 9 上测试您的扩展。可能存在一些自动检测不到的边缘情况。
一旦您确认需要进行更改,请返回此页面继续阅读。
引导式扩展可移除延迟加载脚本
如果您的扩展使用了 nsIChromeFrameMessageManager.loadFrameScript() 并设置了延迟加载标志,则该脚本将从那时起加载到每个创建的 frame 中。这很方便,但直到 Firefox 9,都没有办法停止加载该脚本,因此即使在扩展关闭后,它也会一直加载。
从 Firefox 9 开始,您应该调用新的 nsIChromeFrameMessageManager.removeDelayedFrameScript() 方法,以停止在新创建的 frames 中加载您的脚本。例如,您可以这样做:
browser.messageManager.removeDelayedFrameScript(
"chrome://my-extension/content/some-script.js",
);
接口更改
nsIURL接口已略有更改。nsIURL.param属性已被移除,而nsIURLParser.parsePath()方法的参数比以前少两个。- 从
nsIBrowserHistory中移除了两个方法:registerOpenPage()和unregisterOpenPage()。这些方法已被弃用。 nsIEditorSpellCheck.saveDefaultDictionary()方法已被移除,这是支持每个站点拼写检查设置的一部分。此外,nsIEditorSpellCheck.updateCurrentDictionary()不再接受参数。nsIGlobalHistory3接口已被移除。它对扩展的使用范围非常有限(如果有用的话),所以这不应该影响任何人。- 几个专用通道的属性已被合并到基础的
nsIChannel接口中。这不应该影响兼容性,因为这些接口本身就继承自nsIChannel。
首选项更改
geo.wifi.* 首选项不再有默认值,尽管如果存在,它们仍然有效。如果您的代码在读取这些首选项时没有处理它们不存在的情况,您需要更新您的代码以处理它们不存在时抛出的异常。
XPConnect 更改
nodePrincipal 和 baseURIObject 已从 nsDOMClassInfo 移动到 XrayWrapper。这不应该影响很多扩展,因为它只会在它们尝试使用 enablePrivilege() 请求 XPConnect 权限的非特权脚本访问 DOM Node 对象的这些属性时才成为问题。
DOM 更改
- 长期废弃的
Navigator.taintEnabled()方法已被移除。这个方法很久以来都没有什么用处了,但由于它是 Netscape 特有的,经常被用于浏览器检测脚本。从 Firefox 9 开始,调用此方法会抛出异常。 - 事件处理程序现在实现为标准的 IDL 接口。对于大多数情况,这不会影响您,除非您正在设置或访问 DOM 属性对象的事件处理程序。现在您不能,例如,更改
Window.prototype.onload。
其他可能影响二进制兼容性的更改
这些更改值得注意,因为它们可能会影响二进制 XPCOM 组件。这些组件无论如何都需要重新编译,因为每个主要的 Firefox 版本都需要这样做,但这可能会引入编译时错误,因此它们尤其值得注意。
nsIDOMHTMLDocument接口现在有了一个新的scripts属性,它实现了Document.scripts属性。- 添加了
nsIJumpListShortcut.iconImageUri()方法,以便能够为 Windows 上的跳转列表 URI 条目设置网站图标。
主题更改
<tab> 元素已添加 pending 属性。如果此属性存在,则表示该标签页正在被会话存储服务恢复。您可以使用它在恢复过程中为标签页设置样式。值得注意的是,如果用户启用了“未选中前不加载标签页”首选项,则标签页在被加载之前会设置 pending 属性。
类似地,标签页现在也有一个 unread 属性;如果此属性存在,则表示该标签页自上次成为活动标签页以来已发生更改。您可以使用它来为自用户上次查看以来已发生更改的标签页设置不同的样式。在当前会话中尚未被查看过的标签页上也存在此属性。