為 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 FAQ

Firefox 目前不強制執行此規則(在 Firefox 3 的開發過程中曾強制執行一段時間,但由於強制執行此規則導致太多站點中斷)。我們鼓勵 Web 開發者修復他們的程式碼以遵循此規則,以提高未來的相容性。

書籤和歷史

如果您的擴充套件以任何方式訪問書籤或歷史資料,它將需要進行大量工作才能與 Firefox 3 相容。訪問此資訊的舊 API 已被新的 Places 架構取代。有關更新現有擴充套件以使用 Places API 的詳細資訊,請參閱 Places 遷移指南

下載管理器

由於從 RDF 資料儲存過渡到使用 Storage API,下載管理器 API 略有變化。這應該是一個相當容易的過渡。此外,用於監控下載進度的 API 已更改為支援多個下載管理器監聽器。有關更多資訊,請參閱 nsIDownloadManagernsIDownloadProgressListener監控下載

密碼管理器

如果您的擴充套件使用密碼管理器訪問使用者登入資訊,則需要更新以使用新的登入管理器 API。

  • 文章 使用 nsILoginManager 包含示例,包括演示如何編寫您的擴充套件以同時使用密碼管理器和登入管理器,以便它可以在 Firefox 3 和早期版本中使用。
  • nsILoginInfo
  • nsILoginManager

如果您想在擴充套件中提供自己的密碼儲存實現,您還可以覆蓋內建的密碼管理器儲存。有關詳細資訊,請參閱 建立登入管理器儲存模組

彈窗(選單、上下文選單、工具提示和麵板)

XUL 彈窗系統在 Firefox 3 中進行了大量修改。彈窗系統包括主選單、上下文選單和彈窗面板。已建立 使用彈窗 指南,詳細說明了該系統的工作原理。需要注意的是,popup.showPopup 已棄用,取而代之的是新的 popup.openPopuppopup.openPopupAtScreen

自動完成

nsIAutoCompleteController 介面的 handleEnter() 方法已更改為接受一個引數,該引數指示文字是選自自動完成彈窗,還是使用者在輸入文字後按 Enter 鍵。

DOMParser

  • 當例項化 DOMParser 時,它繼承了呼叫程式碼的主體,以及建構函式來自的視窗的 documentURIbaseURI

  • 如果呼叫者具有 UniversalXPConnect 許可權,它可以將引數傳遞給 new DOMParser()。如果傳遞的引數少於三個,則其餘引數將預設為 null

    • 第一個引數是要使用的主體;這會覆蓋通常繼承的預設主體。
    • 第二個引數是要使用的 documentURI
    • 第三個引數是要使用的 baseURI
  • 如果您使用契約初始化 DOMParser,例如透過呼叫 createInstance(),並且您沒有呼叫 DOMParserinit() 方法,則嘗試啟動解析操作將自動建立並初始化具有 null 主體以及 documentURIbaseURI 的 null 指標的 DOMParser

停止使用內部字串 API

內部字串 API 不再匯出;您必須遷移到外部字串 API。請參閱以下文章以獲取有用的資訊

已移除的介面

以下介面已從 Gecko 1.9(驅動 Firefox 3)中移除。如果您的擴充套件使用了其中任何一個,您將需要更新您的程式碼

  • nsIDOMPaintListener
  • nsIDOMScrollListener
  • nsIDOMMutationListener
  • nsIDOMPageTransitionListener
  • nsICloseAllWindows(參見 Firefox bug 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 bug 337746

  • <xul:tabbrowser> 元素不再是“toolkit”的一部分(Firefox bug 339964)。這意味著此元素不再可用於 XUL 應用程式和擴充套件。它繼續在主 Firefox 視窗 (browser.xul) 中使用。

  • 需要記錄對 nsISupports_proxies 以及可能與執行緒相關介面的更改。

  • 如果您在 XUL 檔案中使用 XML 處理指令,例如 <?xml-stylesheet ?>,請注意 Firefox bug 319654 中所做的更改

    1. XML PI 現在已新增到 XUL 文件的 DOM 中。這意味著 document.firstChild 不再保證是根元素。如果您需要在指令碼中獲取根文件,請改用 document.documentElement
    2. <?xml-stylesheet ?><?xul-overlay ?> 處理指令在文件序言之外不再有效。
  • 載入網頁內容(瀏覽器頁面載入)時不會觸發 window.addEventListener("load", myFunc, true)。這是由於 Firefox bug 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 bug 52209,使用 setTimeout()setTimeout() 啟動的計時器現在被模式視窗阻止。您可以改用 nsITimer

  • 如果您的擴充套件需要允許不受信任的來源(例如,網站)訪問擴充套件的 chrome,則必須使用新的 contentaccessible 標誌