2013-07-23 75 views
3

Firefox提供XPCOM API接口,用於編寫C++中的附加類,並允許第三方Web應用程序訪問它們。我想知道 - 是否有其他方式來實現這些好處(例如,在C++中編寫附加程序並提供JavaScript接口,以便任何JavaScript應用程序都可以使用此接口並最終使用C++類功能)?C++中的Firefox附件

回答

1

是的,可以用C++(或Javascript)編寫XPCOM組件並將它們公開給網站。您可以在JavaScript-global-propertyJavaScript-global-constructor等類別或類別中註冊它們。 這些東西一般沒有很好的記錄,如果有的話。如果您想了解更多信息,請閱讀代碼(例如mxr)。

但這樣做是非常不鼓勵的原因有很多:

  • 這是很難保證這樣的事情實際上是安全的,並使其工作可靠。
  • 很難控制什麼網站可能實際使用新的API。 JavaScript-global-property和朋友將可用於所有網站!
  • 您的加載項將引入新名稱到全局JavaScript名稱空間中,這可能與網站代碼衝突。 (因此,許多新的WebAPI不是直接引入到全局命名空間中,而是作爲導航器的屬性)。
  • 由於這些原因,addons.mozilla.org網站將只接受使用此機制的插件作爲規則的例外情況,並且僅在作者證明使用是必需的且沒有實際替代方法時。

MDN有一些關於網頁到擴展通信的文章,反之亦然,您可以使用它們,例如, "Interaction between privileged and non-privileged pages"

另外,還鼓勵以擴展內發貨二進制的XPCOM組件:

  • 你需要重新編譯你對每個壁虎版本的二進制文件(每六個星期),因爲二進制組件的版本,因爲標籤Firefox 4.
  • (點)版本之間的二進制API/ABI不像您希望的那樣穩定。實際上API/ABI經常在遊戲後期被不經意地破壞,導致許多用戶發生大量不必要的崩潰,例如, bug 828296
  • 平臺開發者officially said binary components in extensions are a hassle

相反,你應該嘗試儘可能使用JavaScript和/或創建一個普通的二進制庫(的.so,.dll文件,名爲.dylib)與C-API/ABI和使用js-ctypes。你可以在JavaScript中實現你的XPCOM組件,然後用js-ctypes調用你的庫。 AFAIK大多數插件現在切換到js-ctypes。

+0

非常感謝您的詳盡解答!你可以請建議什麼是這個可能的替代品http://stackoverflow.com/questions/17955147/ideas-needed-javascriptxpcomc-add-on? – peetonn