2011-11-16 42 views
0

我們的應用程序使用嵌入式xulrunner。我們通過在更新的XULRunner中重寫PromptService

componentRegistrar.RegisterFactory (PROMPTSERVICE_CID, aClassName, aContractID, MyPromptServiceFactory); 

其中,覆蓋默認PromptService提供警報,提示等自定義對話框

PROMPTSERVICE_CID is "a2112d6a-0e28-421f-b46a-25c0b308cbd0" 
CONTRACT_ID is "@mozilla.org/embedcomp/prompt-service;1" 

當使用XULRunner的1.9。*的版本,這個完美的作品和呼叫來MyPromptSerivceFactory。但是,這在更新的XULRunner版本上不適用(> = 4.0)

我已將PROMPTSERVICE_CID更改爲"7ad1b327-6dfa-46ec-9234-f2a620ea7e00"(複製自nsPrompter.manifest)。在註冊工廠時,我收到錯誤NS_ERROR_FACTORY_EXISTS

如果我繼續使用舊的PROMPTSERVICE_CID,則不使用nsIPromptService2代替nsIWindowCreator2.CreateChromeWindow2用於顯示警報和提示。

我已經使用了這個,但我找不到解決方案或者修復NS_ERROR_FACTORY_EXISTS錯誤或MyPromptServiceFactory被使用。

任何幫助/建議嗎?

回答

0

使用Firefox提供的現有提示服務可能會更好,而不是取代它。如果你看看nsPrompter.openPrompt(),在打開模式對話框之前,它會嘗試在包含瀏覽器的窗口中找到並調用JavaScript函數getTabModalPrompt()。它預計會得到一個promptBox element,並將在其上調用方法appendPrompt()removePrompt()。很明顯,您不必爲它提供一個promptBox元素,只是表現類似的東西 - 並以任何您喜歡的方式顯示消息。

但是,如果您真的想替換系統組件,則不應該複製提示器的CID - 使用您自己的一個,但@mozilla.org/prompter;1作爲合同ID(舊合同標識僅用於向後兼容)。

+0

非常感謝!使用@ mozilla.org/prompter; 1作爲合同ID,我可以解決這個問題。如何讓我自己的CID在RegisterFactory中使用? – lakshmip

+0

@lakshmip:只需生成一些UUID。例如。使用http://www.famkruithof.net/uuid/uuidgen –

+0

對不起,這個真的很老的線程necro'ing,但有沒有任何參考準確地如何做到這一點與xulrunner? Google-fu給我的任何東西似乎都無法正常工作...... – Kyudos