2011-04-05 69 views
4

我第一次嘗試了Firefox擴展開發,到目前爲止它一直很順利,但我遇到了一個問題;我需要做的事情之一是覆蓋內置的nsIPromptService並將其替換爲我自己的東西。如何覆蓋Firefox插件中內置的XPCOM組件?

我通過基本XPCOM組件創建教程走到這裏,並得到了世界你好一個工作:

https://developer.mozilla.org/en/creating_xpcom_components

,一切都在這看似很正常,但沒有什麼我已經能夠找到或研究顯示我可以如何覆蓋JavaScript的界面。我已經看到了C++和Java中似乎能夠覆蓋內置組件的東西,但是我無法找到任何有關從javascript執行此操作的內容,只是試圖更改合同ID不起作用;當我嘗試從合同ID獲得服務時(如下所示),它只是返回原始的內置組件版本。

var myComponent = Components.classes['@mozilla.org/embedcomp/prompt-service;1'] 
               .getService(Components.interfaces.nsIPromptService); 

這裏有什麼東西真的很明顯,我失蹤了嗎?這是錯誤的方式去重寫組件(我似乎無法找到任何地方,所以我不知道我應該做什麼..)。

+1

我自己並沒有這樣做,但我認爲訣竅是傳入* your *服務的合同ID,然後將相同的接口傳遞給getService()。除此之外,我認爲你最好的選擇就是看看現有的插件是否可以做你想做的事。我相信HttpFox使用這種東西,僅舉一例。 – MatrixFrog 2011-04-06 02:24:26

+0

感謝您的建議!問題在於,我需要連接所有的提示/警報/等等,而不僅僅是我自己打電話給我的那些人,這意味着每個人都必須打電話給我的服務地址(贏得了沒有發生)。我會看看HttpFox,看看我能看到他們做了什麼。 – DivineWolfwood 2011-04-06 17:59:26

回答

3

尼爾,謝謝你的建議。這就是我認爲我在做的事情(和我一樣),但是如果你實際上覆蓋了一個合同(而不是定義一個新合同),看起來答案是你必須去nsIComponentRegistrar並且實際註冊你的工廠(而不是依靠chrome.manifest來處理它)。這方面的一個例子是:

Components.manager.nsIComponentRegistrar.registerFactory(CLASS_ID, CLASS_NAME, CONTRACT_ID, MyPromptServiceFactory); 

凡的constans是:

const CLASS_ID = Components.ID("{a2112d6a-0e28-421f-b46a-25c0b308cbd0}"); 

// description 
const CLASS_NAME = "My Prompt Service"; 

// textual unique identifier 
const CONTRACT_ID = "@mozilla.org/embedcomp/prompt-service;1"; 

凡類標識碼/ CONTRACT_ID者爲預先存在的服務的ID。

+0

你可以請你完整的代碼,如何做到這一點,我一直在努力完成這個很長一段時間。 – Noitidart 2014-03-18 06:20:48

0

您需要使用要覆蓋的服務的合同標識註冊組件。