2013-03-28 37 views
0

我想實現nsIDOMGlobalPropertyInitializer :: Init()。Firefox二進制擴展:nsISupports to JS :: Value

我有一個現有的對象(基於谷歌齒輪),我試圖擴展到支持JAVASCRIPT_GLOBAL_PROPERTY_CATEGORY(因爲JAVASCRIPT_DOM_CLASS似乎不再在FF17中工作)。我正在調用nsIDOMGlobalPropertyInitializer :: Init()的實現,但是如何將我的C++對象(它實現nsISupports並公開適當的IDL)轉換爲JS:Value,使我的對象在Java Script中可用?

如果我返回NS_ERROR_NOT_IMPLEMENTED或不實現nsIDOMGlobalPropertyInitializer接口,FF(正確)抱怨對象公開no方法或屬性。

+0

也許通過nsXPConnect :: WrapNativeToJSVal? – paa

+0

但是nsXPConnect從哪裏來? –

+0

'nsXPConnect * xpc = nsXPConnect :: GetXPConnect();' – paa

回答

0

您不必將您的對象轉換爲JS:Value。如果您實現像nsISupports這樣的XPCOM接口,它們將以JavaScript形式提供。從描述中不清楚你的對象是做什麼的,但是你可能必須在IDL中編寫一個自定義接口並在你的對象中實現它。然後你可以通過這個接口在JS中操縱它。您應該也可以執行nsISecurityCheckedComponentnsIClassInfo

+0

是的,我的對象已經實現了nsISupports。 JAVASCRIPT_GLOBAL_CONSTRUCTOR_CATEGORY不再適用於FF 17了,所以我嘗試實現JAVASCRIPT_GLOBAL_PROPERTY_CATEGORY。但是如果我這樣做了,FF在我的對象上看不到任何屬性或方法,因爲它需要實現nsIDOMGlobalPropertyInitializer接口。而要實現nsIDOMGlobalPropertyInitializer :: Init,我需要將我的對象轉換爲JS :: Value。 –

+0

您是否嘗試過實施'nsISecurityCheckedComponent'?這很可能是因爲JS沒有看到你的組件的屬性。據我所知你不需要實現'nsIDOMGlobalPropertyInitializer',除非你希望你的組件可以訪問窗口(儘管他們可能已經改變了這一點,因爲我喜歡實現一個JS全局屬性)。 –

+0

nsIDOMGlobalPropertyInitializer沒有幫助:-(FF甚至不查詢我的對象爲該接口。 –