2011-02-28 30 views
3

我想編寫一個XPCOM組件,該組件在網頁中作爲javascript對象公開。像Google Gears這樣的東西就是我正在尋找的東西。也就是說,在安裝Google Gears Firefox擴展程序之後,任何想要使用它的網頁都可以使用javascript對象'google.gears'。我在XPCOM開發中發現了許多mozilla文檔,但是沒有公開將組件暴露給網頁中運行的JavaScript。 XPCOM有可能嗎?我需要編寫一個Firefox插件而不是擴展嗎?將XPCOM組件暴露給網頁中的javascript

回答

7

我正在使用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

+0

清單線總是要看起來像'類的JavaScript全局屬性{屬性名} {組件合同ID}' – sdwilsh

+0

不好意思在你身邊,但JS全局屬性並沒有什麼新鮮之處。 nsIDOMGlobalPropertyInitializer接口是新的,但對於提問者詢問的內容並不需要。這很酷,因爲如果你的JS全局屬性實現它,它可以找出它連接到哪個窗口對象。這在Firefox 4之前是不可能的。 –

1

This article很有前途:

一般來說,不可信的內容 (如網頁)不能做任何事情 與大多數XPCOM組件,包括 創建它們。當然有 這個政策的例外 - DOM 對象,例如,榮耀 XPCOM組件具有明確定義的 接口供公衆使用。對於網頁 頁面使用組件,但是, 包括調用任何方法或 屬性,組件必須明確告訴Mozilla什麼是 什麼是允許的,什麼不是。 nsISecurityCheckedComponent接口 定義瞭如何完成。

來源http://weblogs.mozillazine.org/weirdal/archives/017211.html

0

這是可行的,但你必須代理XPCOM組件的調用。請記住,它也可能相當危險。

查看我的回答here瞭解如何將鉻對象暴露給內容代碼。

1

舊的3.x方法是在「JavaScript全局屬性」類別中註冊組件。 (這仍然適用於4.x,但您必須使用「JavaScript-global-property」類別,因爲類別名稱不再允許包含空格。)您的對象必須實現nsIClassInfo接口,以及任何接口想要公開內容。這不是非常有用,因爲您無法知道哪個內容腳本正在訪問您的對象。

0

你可以用網絡擴展做到這一點,我已經閱讀並不再有支持