在较新的 XULRunner 中重写 PromptService
我们的应用程序使用嵌入式 xulrunner。我们重写默认的 PromptService 来提供警报、提示等自定义对话框
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
显示警报和提示。
我已在 Google 上搜索过此问题,但找不到修复 NS_ERROR_FACTORY_EXISTS
错误或使用 MyPromptServiceFactory
的解决方案。
有什么帮助/建议吗?
Our application uses embedded xulrunner. We override the default PromptService to provide custom dialogs for alert, prompt, etc by
componentRegistrar.RegisterFactory (PROMPTSERVICE_CID, aClassName, aContractID, MyPromptServiceFactory);
where,
PROMPTSERVICE_CID is "a2112d6a-0e28-421f-b46a-25c0b308cbd0"
CONTRACT_ID is "@mozilla.org/embedcomp/prompt-service;1"
When using XULRunner 1.9.* versions, this works perfectly and the call comes to MyPromptSerivceFactory
. But, this doesn't work on newer XULRunner versions (>= 4.0)
I have modified the PROMPTSERVICE_CID
to "7ad1b327-6dfa-46ec-9234-f2a620ea7e00"
(copied from nsPrompter.manifest
). While registering the factory I get the error NS_ERROR_FACTORY_EXISTS
.
If I continue to use the old PROMPTSERVICE_CID
, then nsIPromptService2
is not used instead nsIWindowCreator2.CreateChromeWindow2
is used to display alerts and prompts.
I have googled on this, but I couldn't find a solution to either fix the NS_ERROR_FACTORY_EXISTS
error or for MyPromptServiceFactory
to be used.
Any help/suggestions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
像 Firefox 那样使用现有的提示服务可能比替换它更好。如果您查看 nsPrompter.openPrompt (),在打开模式对话框之前,它会尝试定位并调用 JavaScript 函数包含浏览器的窗口中的
getTabModalPrompt()
。它期望获得一个promptBox
元素 返回并调用方法其上的appendPrompt()
和removePrompt()
。显然,您不必给它一个promptBox
元素,只需给它一个行为类似的元素 - 并以您喜欢的任何方式显示消息。但如果您确实想替换系统组件,则不应重复提示器的 CID - 使用您自己的 CID,但使用
@mozilla.org/prompter;1
作为合约 ID(旧合约 ID 是为了向后兼容)仅有的)。It would probably be better to use the existing prompt service the way Firefox does it rather than replace it. If you look at nsPrompter.openPrompt(), before opening a modal dialog it will try to locate and call a JavaScript function
getTabModalPrompt()
in the window containing the browser. It expects to get apromptBox
element back and will call methodsappendPrompt()
andremovePrompt()
on it. Obviously, you don't have to give it apromptBox
element, just something that behaves similarly - and displays a message any way you like.But if you really want to replace system components, you shouldn't duplicate prompter's CID - use your own one but
@mozilla.org/prompter;1
as contract ID (the old contract ID is for backwards compatibility only).