我第一次涉足 Firefox 扩展开发,到目前为止进展顺利,但我遇到了一个问题;我需要做的一件事是覆盖内置的 nsIPromptService 并用我自己的东西替换它。
我在这里完成了基本的 XPCOM 组件创建教程,并让 hello world 开始工作:
https://developer.mozilla.org/en/creating_xpcom_components https://developer.mozilla.org/en/creating_xpcom_components
其中的一切似乎都工作正常,但我无法找到或研究表明如何从 javascript 覆盖接口。我在 C++ 和 Java 中看到过一些东西似乎能够覆盖内置组件,但是我找不到任何关于从 javascript 中执行此操作的信息,并且仅仅尝试更改合约 ID 是行不通的;当我尝试从合同 ID 获取服务时(如下所示),它只返回原始的内置组件版本。
var myComponent = Components.classes['@mozilla.org/embedcomp/prompt-service;1']
.getService(Components.interfaces.nsIPromptService);
这里有什么明显的东西是我遗漏的吗?这是覆盖组件的错误方法吗(我似乎在任何地方都找不到任何东西,所以我不太确定我应该做什么..)。
尼尔,谢谢你的建议。这就是我认为我正在做的事情(而且我确实这样做了),但是如果您实际上要覆盖合同(而不是定义新合同),那么答案似乎是您必须转到 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)