在较新的 XULRunner 中重写 PromptService

发布于 2024-12-15 21:43:22 字数 938 浏览 4 评论 0原文

我们的应用程序使用嵌入式 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

や三分注定 2024-12-22 21:43:22

像 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 a promptBox element back and will call methods appendPrompt() and removePrompt() on it. Obviously, you don't have to give it a promptBox 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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文