Вызов функциональности плагина NPAPI из расширения Firefox
Я написал плагин NPAPI, который реализует всю необходимую логику, и сейчас я пишу расширение, которое, как ожидается, будет использовать функциональность, предоставляемую в плагине. Эта архитектура дает мне возможность написать один и тот же код C++ для Mozilla Firefox и Google Chrome.
В Chrome я создаю экземпляр объекта, который определен в плагине, написав <embed ...>
создание отдельного документа, принадлежащего моему расширению (оно предоставляется автоматически для моего плагина Chrome). Это просто работает. В коде C++ я выполняю все работы, необходимые в конструкторе моего объекта плагина.
Я не могу легко адаптировать свое решение для использования его в Firefox, потому что расширение не поддерживается каким-либо отдельным документом, и у моего расширения нет прав на запись в любой из уже отрендеренных документов.
Мой основной вопрос в наиболее распространенной форме - как я могу использовать функциональность, предоставляемую плагином, многократно и передавать список аргументов моей нативной функции, когда пользователь нажимает кнопку или выбирает мою запись в раскрывающемся меню (т. Е. Метод с аргументы должны вызываться после определенного события, а не только в произвольное время)?
"Дополнительные" вопросы:
Как я могу создать плагин в Mozilla Firefox? Где я могу получить документ, который будет "интерпретирован" FF и такой, что расширение сможет писать в него?
2 ответа
Я не знаю, как это сделать сам, но вот расширение Firefox с открытым исходным кодом, которое делает это: https://github.com/kylehuff/webpg-firefox
Ваше расширение Firefox должно использовать " наложение браузера ". Существует много типов оверлеев для различных частей браузера, и они загружаются (overlay'ed) в указанный документ, как определено в файле chrome.manifest.
Например, следующее применяет оверлей к файлу browser.xul (который является основным окном браузера)
overlay chrome://browser/content/browser.xul content/firefoxOverlay.xul
Теперь в этом оверлейном файле вы можете загрузить свой плагин и вызвать методы, предоставляемые плагином.
Вот пример XUL-файла, который делает не что иное, как загрузку плагина NPAPI типа контента "application/x-example-plugin" и присваивает объект плагина переменной "myPlugin"
<script type="text/javascript">
myPlugin = document.getElementById("myPlugin");
</script>
<?xml version="1.0" encoding="UTF-8"?>
<overlay id="myOverlay" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="text/javascript">
myPlugin = document.getElementById("myPlugin");
alert(myPlugin.someFunction());
</scrpit>
<window id="main-window">
<vbox collapsed="true">
<html:object id="myPlugin" type="application/x-example-plugin" height="1" width="1" style="visibility:hidden;"></html:object>
</vbox>
</window>
</overlay>
Некоторые важные вещи, на которые стоит обратить внимание
- Объявление "xmlns:html=..." является критически важным, поскольку объект плагина загружается в html:object, и это объявление сообщает синтаксическому анализатору XUL, как визуализировать объект.
- Идентификатор окна ("главное окно") важен, потому что именно так синтаксический анализатор XUL будет перекрывать элемент (в "главном" окне)
- Идентификатор объекта (в данном примере "myPlugin") - это то, как вы будете ссылаться на объект плагина через JavaScript позже.
- Поскольку мы не показываем контент с помощью нашего плагина, а просто вызываем открытые методы, предоставляемые им, важно, чтобы видимость CSS была "скрытой" и имела размер 1x1 пикселей. Без этого вы можете получить большие пробелы, отображаемые в интерфейсе браузера. Кроме того, важно использовать свойство CSS "видимость", а не свойство "отображение". Если вы установите для свойства display значение none, у вас будут проблемы с инициализацией вашего плагина в оверлее.
- В вашем расширении файла install.rdf вы должны указать свойство "unpack" как "true", то есть:
<em:unpack>true</em:unpack>
После того, как ваше наложение загружено в контексте XUL браузера и ваш плагин инициализирован в главном окне браузера, вы можете ссылаться на ваш плагин из области видимости главного окна по переменной, которой вы его присвоили ("myPlugin" в этом пример).
Я не буду здесь углубляться в то, как получить контекст главного окна (см. Ссылки ниже), но если у вас есть ссылка, вы можете вызывать открытые методы из сценариев содержимого, боковых панелей, панелей инструментов и т. Д.
Ссылочные ссылки -