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 中載入您的指令碼。例如,您可以這樣做:

js
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 更改

nodePrincipalbaseURIObject 已從 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 屬性;如果此屬性存在,則表示該標籤頁自上次成為活動標籤頁以來已發生更改。您可以使用它來為自使用者上次檢視以來已發生更改的標籤頁設定不同的樣式。在當前會話中尚未被檢視過的標籤頁上也存在此屬性。