从Firefox扩展中调用NPAPI插件功能

时间:2012-12-14 07:12:33

标签: firefox npapi browser-plugin

我编写了一个NPAPI插件,它实现了所需的所有逻辑,现在我正在编写一个预期使用插件中提供的功能的扩展。这种架构让我有机会为Mozilla Firefox和Google Chrome编写相同的C ++代码。

在Chrome中,我通过将<embed ...>构造写入我的扩展程序所拥有的单独文档(它是自动提供给我的Chrome插件)来实例化插件中定义的对象。这才有效。在C ++代码中,我执行插件对象的构造函数中所需的所有工作。

我无法轻松调整我的解决方案以在Firefox中使用它,因为扩展程序不受任何单独文档的支持,并且我的扩展程序无权写入任何已呈现的文档。

我最常见的主要问题是如何多次使用插件提供的功能,并在用户点击按钮或在下拉菜单中选择我的条目时将参数列表传递给我的本机函数(即应该在特定事件之后调用带参数的方法,而不仅仅是在任意时间)?

“补充”问题是:

如何在Mozilla Firefox中实例化插件?我在哪里可以获得一个由FF“解释”的文档,以便扩展程序可以写入它?

2 个答案:

答案 0 :(得分:1)

我不知道自己该怎么做,但这是一个开源的firefox扩展程序:https://github.com/kylehuff/webpg-firefox

答案 1 :(得分:0)

您的Firefox扩展程序需要使用“browser overlay”。对于浏览器的各个部分,有多种类型的叠加层,它们在指定文档中加载(覆盖),如chrome.manifest文件中所定义。

例如,以下内容将overlay应用于“browser.xul”文件(这是主浏览器窗口)

overlay     chrome://browser/content/browser.xul            content/firefoxOverlay.xul

现在,在overlay文件中,您可以加载插件对象并调用插件提供的方法。

这是一个示例XUL文件,它只是加载内容类型“application / x-example-plugin”的NPAPI插件,并将插件对象分配给变量“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:对象中加载的,而该声明告诉XUL解析器如何渲染对象。
  2. 窗口的id(“主窗口”)很重要,因为这是XUL解析器覆盖项目的方式(在“主窗口”内)
  3. 对象id(在此示例中为“myPlugin”)是您稍后将通过JavaScript引用插件对象的方式。
  4. 因为我们没有使用我们的插件显示内容,只是调用它提供的公共方法,所以重要的是使CSS可见性“隐藏”,并且大小为1x1像素。如果不这样做,最终可能会在浏览器UI中呈现大的空白区域。此外,使用CSS“visibility”属性非常重要,不是“display”属性。如果您将display属性设置为“none”,那么您的插件实际上会在叠加层中初始化时会遇到问题。
  5. 在您的扩展程序install.rdf文件中,您必须将“unpack”属性指定为“true”,即:<em:unpack>true</em:unpack>
  6. 在浏览器XUL的上下文中加载叠加层,并且您的插件在主浏览器窗口中初始化后,您可以在主窗口范围内通过您指定的变量引用插件(“myPlugin” “在这个例子中。”

    我不会深入探讨如何获取main window的上下文(请参阅下面的链接),但是一旦有了引用,就可以从content scripts, sidebars, toolbars中调用公开的方法等等。

    参考链接 -