Вызов функциональности плагина 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>

Некоторые важные вещи, на которые стоит обратить внимание

  1. Объявление "xmlns:html=..." является критически важным, поскольку объект плагина загружается в html:object, и это объявление сообщает синтаксическому анализатору XUL, как визуализировать объект.
  2. Идентификатор окна ("главное окно") важен, потому что именно так синтаксический анализатор XUL будет перекрывать элемент (в "главном" окне)
  3. Идентификатор объекта (в данном примере "myPlugin") - это то, как вы будете ссылаться на объект плагина через JavaScript позже.
  4. Поскольку мы не показываем контент с помощью нашего плагина, а просто вызываем открытые методы, предоставляемые им, важно, чтобы видимость CSS была "скрытой" и имела размер 1x1 пикселей. Без этого вы можете получить большие пробелы, отображаемые в интерфейсе браузера. Кроме того, важно использовать свойство CSS "видимость", а не свойство "отображение". Если вы установите для свойства display значение none, у вас будут проблемы с инициализацией вашего плагина в оверлее.
  5. В вашем расширении файла install.rdf вы должны указать свойство "unpack" как "true", то есть: <em:unpack>true</em:unpack>

После того, как ваше наложение загружено в контексте XUL браузера и ваш плагин инициализирован в главном окне браузера, вы можете ссылаться на ваш плагин из области видимости главного окна по переменной, которой вы его присвоили ("myPlugin" в этом пример).

Я не буду здесь углубляться в то, как получить контекст главного окна (см. Ссылки ниже), но если у вас есть ссылка, вы можете вызывать открытые методы из сценариев содержимого, боковых панелей, панелей инструментов и т. Д.

Ссылочные ссылки -

Другие вопросы по тегам