Как переписать встроенный компонент XPCOM в аддоне Firefox? - PullRequest
4 голосов
/ 06 апреля 2011

Я впервые участвую в разработке расширений Firefox, и до сих пор это было довольно удобно, но я столкнулся с проблемой; одна из вещей, которые мне нужно сделать, переписать встроенный nsIPromptService и заменить его чем-то своим.

Я прошел здесь базовый урок по созданию компонентов XPCOM и начал работать над "Hello World":

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

И все в этом, кажется, работает нормально, но ничего из того, что я не смог найти, или исследование показывает, как я могу переписать интерфейс из javascript. Я видел вещи в C ++ и Java, которые, кажется, могут перезаписывать встроенные компоненты, но я ничего не могу найти в этом, используя javascript, и просто попытка изменить идентификатор контракта не сработала; когда я пытаюсь получить сервис из идентификатора контракта (как показано ниже), он просто возвращает исходную версию встроенного компонента.

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

Есть ли здесь что-то действительно очевидное, чего мне не хватает? Это неправильный способ переопределения компонентов (кажется, я нигде не могу найти ничего, поэтому я не совсем уверен, что мне следует делать ...).

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Нил, спасибо за предложение.Это то, что я думал, что делал (и был), но если вы на самом деле переопределяете контракт (вместо определения нового), похоже, ответ заключается в том, что вам нужно перейти к 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 были идентификаторами для существующей службы.

0 голосов
/ 11 апреля 2011

Вам необходимо зарегистрировать свой компонент, используя идентификатор контракта службы, которую вы хотите переопределить.

...