簡體   English   中英

如何在Firefox插件中覆蓋內置的XPCOM組件?

[英]How to overwrite built in XPCOM component in Firefox addon?

我是第一次涉足Firefox擴展開發,到目前為止它一直很舒服,但我遇到了一個問題; 我需要做的一件事就是覆蓋內置的nsIPromptService並將其替換為我自己的東西。

我在這里瀏覽了基本的XPCOM組件創建教程,並讓hello world工作了:

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。

您需要使用要覆蓋的服務的合同ID注冊組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM