在较新的XULRunner中重写PromptService



我们的应用程序使用嵌入式xulrunner。我们通过

覆盖默认的PromptService,为alert、prompt等提供自定义对话框。
componentRegistrar.RegisterFactory (PROMPTSERVICE_CID, aClassName, aContractID, MyPromptServiceFactory);

,

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被使用。

任何帮助/建议吗?

按照Firefox的方式使用现有的提示服务可能会更好,而不是替换它。如果你看一下nsPrompter.openPrompt(),在打开一个模态对话框之前,它会尝试在包含浏览器的窗口中定位并调用一个JavaScript函数getTabModalPrompt()。它期望返回一个promptBox元素,并在其上调用appendPrompt()removePrompt()方法。显然,你不需要给它一个promptBox元素,只需要一些类似的行为-并以任何你喜欢的方式显示消息。

但是如果你真的想替换系统组件,你不应该复制提示符的CID -使用你自己的,但@mozilla.org/prompter;1作为合同ID(旧的合同ID仅用于向后兼容)。

最新更新