我想編寫一個XPCOM組件,該組件在網頁中作爲javascript對象公開。像Google Gears這樣的東西就是我正在尋找的東西。也就是說,在安裝Google Gears Firefox擴展程序之後,任何想要使用它的網頁都可以使用javascript對象'google.gears'。我在XPCOM開發中發現了許多mozilla文檔,但是沒有公開將組件暴露給網頁中運行的JavaScript。 XPCOM有可能嗎?我需要編寫一個Firefox插件而不是擴展嗎?將XPCOM組件暴露給網頁中的javascript
回答
我正在使用Firefox 4中的一個新API - nsiDOMGlobalPropertyInitializer - 它可以讓您創建一個JS對象,以便連接到所有窗口。這是Firefox 4中新的Web控制檯的創建方式。
你必須在你的組件以下QI屬性:
QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer]),
這裏是一個擴展的完整實現的一個例子:
https://github.com/daviddahl/domcrypt/blob/master/extension/domcrypt/components/domcrypt.js
所以基本上,齊詞.nsIDOMGlobalPropertyInitializer,然後確保您的清單具有如下行:
category JavaScript-global-property crypt @droplettr.com/domcrypt;1
請參閱:https://github.com/daviddahl/domcrypt/blob/master/extension/domcrypt/components/domcrypt.manifest
This article很有前途:
一般來說,不可信的內容 (如網頁)不能做任何事情 與大多數XPCOM組件,包括 創建它們。當然有 這個政策的例外 - DOM 對象,例如,榮耀 XPCOM組件具有明確定義的 接口供公衆使用。對於網頁 頁面使用組件,但是, 包括調用任何方法或 屬性,組件必須明確告訴Mozilla什麼是 什麼是允許的,什麼不是。 nsISecurityCheckedComponent接口 定義瞭如何完成。
來源:http://weblogs.mozillazine.org/weirdal/archives/017211.html
這是可行的,但你必須代理XPCOM組件的調用。請記住,它也可能相當危險。
查看我的回答here瞭解如何將鉻對象暴露給內容代碼。
舊的3.x方法是在「JavaScript全局屬性」類別中註冊組件。 (這仍然適用於4.x,但您必須使用「JavaScript-global-property」類別,因爲類別名稱不再允許包含空格。)您的對象必須實現nsIClassInfo接口,以及任何接口想要公開內容。這不是非常有用,因爲您無法知道哪個內容腳本正在訪問您的對象。
你可以用網絡擴展做到這一點,我已經閱讀並不再有支持
- 1. 將網址暴露給webservice
- 2. 如何將C#元組暴露給C++
- 3. 組件暴露給所有用戶嗎?
- 4. 將C++類暴露給QML
- 5. 將C++ API暴露給C#
- 6. 將.NET暴露給COM
- 7. 將COM事件暴露給VBScript(ATL)
- 8. ASP.NET將控件暴露給其他類
- 9. 將屬性暴露給Silverlight中的Intellisense
- 10. Firefox插件將鉻功能暴露給網站
- 11. ATL ActiveX控件如何將布爾值暴露給javascript
- 12. 暴露組件功能ES6
- 13. React - 將組件功能暴露給其子女
- 14. 將您自己的API暴露給YQL
- 15. 在Qt中將C++對象暴露給Javascript
- 16. 如何使用javascript xpcom組件的C++ xpcom組件
- 17. 將母版頁中的正文標記暴露給ASP.NET中的內容頁面
- 18. 如何將攔截器暴露給JMX?
- 19. 將EF Model暴露給各種客戶
- 20. 將類庫DLL暴露給COM使用
- 21. 將變量暴露給Google Analytics
- 22. 如何將java對象暴露給LuaJ
- 23. 將c#DLL暴露給VB6時出錯
- 24. SailsJS將數據暴露給客戶端
- 25. 如何將QVariantHash變量暴露給QtScript?
- 26. 將關係模型暴露給backgrid.js
- 27. 將django admin暴露給用戶。有害?
- 28. 將屬性暴露給Spark皮膚類
- 29. 將C#對象暴露給Lua腳本
清單線總是要看起來像'類的JavaScript全局屬性{屬性名} {組件合同ID}' – sdwilsh
不好意思在你身邊,但JS全局屬性並沒有什麼新鮮之處。 nsIDOMGlobalPropertyInitializer接口是新的,但對於提問者詢問的內容並不需要。這很酷,因爲如果你的JS全局屬性實現它,它可以找出它連接到哪個窗口對象。這在Firefox 4之前是不可能的。 –