2012-06-14 141 views
2

我正在嘗試編寫一個Firefox擴展,它攔截某個HTTP請求並返回靜態內容,而不會將請求發送到實際的服務器(類似於AdBlock)。瞭解Firefox擴展結構

我查了教程,我有一個基本的文件佈局。我也研究過,我需要使用nsITraceableChannel API並添加一個觀察者來做我想做的事情,並且我有示例代碼。

問題是,我究竟在哪裏放這段代碼?什麼時候我的擴展實際加載並執行?它是不斷在後臺運行,還是在後臺加載?

這個文檔看起來不太清楚。這個擴展不需要GUI,所以我不需要佈局XUL文件(或我?)。我試着寫一些XPCOM(我不認爲我做了它),它註冊在chrome.manifest,但它似乎並沒有運行。

任何人都可以準確解釋Firefox擴展是如何工作的,以及我應該在哪裏放置實際的JavaScript代碼來監視請求?或者我是否完全明白擴展是錯誤的?附加組件,擴展和插件有什麼區別?

回答

8

關於附加組件,擴展和插件的區別,你應該看看this answer。但總的來說,你似乎有正確的想法。

的問題是,目前有三個非常不同類型的擴展:

  1. 經典擴展(不是無需重啓):從這個覆蓋這些通常會overlay the browser window和運行代碼。由於每個窗口都有一個覆蓋圖,因此將有多少個代碼實例與瀏覽器窗口一樣多。但是,經典擴展也可以註冊XPCOM組件(via chrome.manifest as of Gecko 2.0)。該組件將在第一次使用時加載,並在整個瀏覽會話期間停留。您可能希望在瀏覽器啓動時加載組件,因此,您應該在profile-after-change類別中註冊該組件,並執行nsIObserver
  2. 無重啓擴展,也稱爲bootstrapped extensions:這些不能註冊覆蓋,這使瀏覽器UI的工作稍微複雜一些。相反,他們有一個bootstrap.js腳本,當擴展程序被激活時會加載該腳本,這種上下文將保持在後臺,直到瀏覽器關閉或擴展功能被禁用。您也可以將XPCOM組件安裝在無重啓擴展中,但您必須手動註冊(通過nsIComponentRegistrar.registerFactory()nsICategoryManager.addCategoryEntry())。如果分機關機,您還必須注意取消註冊組件。如果你只需要添加一個觀察者,這是不必要的,nsIObserverService將採取任何實現nsIObserver的對象,而不僅僅是一個已經被註冊爲XPCOM組件的對象。最大的缺點是:大多數MDN示例都是關於經典擴展的,並沒有解釋如何在重啓擴展中執行某些操作。
  3. 基於Add-on SDK的擴展:這些擴展基於產生無重啓擴展的框架。附加SDK有其own API,這與你通常在Firefox擴展中做的很不一樣 - 但它很簡單,它主要負責關閉擴展,以便不必手動完成。此處的擴展包含多個模塊,其中main.js會自動加載並可根據需要加載其他模塊。一旦加載,只要擴展處於活動狀態,每個模塊都會保持運行。他們運行沙盒,但您仍然可以直接訪問XPCOM並且可以訪問XPCOM。但是,您可能會改用內部observer-service module
+0

謝謝,引導擴展似乎是我以後。 – tangrs

+2

@tangrs:Side-note:Adblock Plus不使用nsITraceableChannel,而使用nsIContentPolicy(https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIContentPolicy)。請參閱[testpolicy.xpi](http://adblockplus.org/trash/testpolicy.xpi)獲取最小(和引導)內容策略實現。 –