gpt4 book ai didi

javascript - 如何覆盖 Firefox 插件中内置的 XPCOM 组件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:06:49 25 4
gpt4 key购买 nike

我是第一次涉足 Firefox 扩展开发,到目前为止进展顺利,但我遇到了一个问题;我需要做的事情之一是覆盖内置的 nsIPromptService 并将其替换为我自己的东西。

我在这里完成了基本的 XPCOM 组件创建教程,并让 hello world one 开始工作:

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

其中的所有内容似乎都可以正常工作,但我找不到或研究的任何内容都表明我可以如何从 javascript 覆盖接口(interface)。我在 C++ 和 Java 中看到过似乎能够覆盖内置组件的东西,但我找不到任何有关从 javascript 执行此操作的信息,只是尝试更改契约(Contract) ID 也没有用;当我尝试从契约(Contract) ID 获取服务时(如下所示),它只返回原始的内置组件版本。

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

这里有什么明显的东西是我遗漏的吗?这是覆盖组件的错​​误方法吗(我似乎无法在任何地方找到任何东西,所以我不确定我应该做什么......)。

最佳答案

尼尔,谢谢你的建议。这就是我认为我正在做的事情(我曾经是),但是如果你真的要覆盖一个契约(Contract)(而不是定义一个新契约(Contract)),看起来答案是你必须去 nsIComponentRegistrar 并实际注册你的工厂(而不是依靠 chrome.manifest 来为您处理)。这方面的一个例子是:

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

常量在哪里:

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";

其中 CLASS_ID/CONTRACT_ID 是预先存在的服务的 ID。

关于javascript - 如何覆盖 Firefox 插件中内置的 XPCOM 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5559849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com