从Firefox扩展调用NPAPI插件功能

从Firefox扩展调用NPAPI插件功能,firefox,npapi,browser-plugin,Firefox,Npapi,Browser Plugin,我已经编写了一个NPAPI插件,它实现了所需的所有逻辑,现在我正在编写一个扩展,希望使用插件中提供的功能。这种架构为我提供了一个机会,可以为Mozilla Firefox和谷歌浏览器编写相同的C++代码。 在Chrome中,我通过将构造写入扩展所拥有的单独文档(它自动提供给我的Chrome插件),来实例化插件中定义的对象。这很管用。在C++代码中,我执行插件对象构造函数中需要的所有工作。 我无法轻松地调整我的解决方案以在Firefox中使用它,因为扩展没有任何单独的文档支持,并且我的扩展没有写入

我已经编写了一个NPAPI插件,它实现了所需的所有逻辑,现在我正在编写一个扩展,希望使用插件中提供的功能。这种架构为我提供了一个机会,可以为Mozilla Firefox和谷歌浏览器编写相同的C++代码。 在Chrome中,我通过将
构造写入扩展所拥有的单独文档(它自动提供给我的Chrome插件),来实例化插件中定义的对象。这很管用。在C++代码中,我执行插件对象构造函数中需要的所有工作。 我无法轻松地调整我的解决方案以在Firefox中使用它,因为扩展没有任何单独的文档支持,并且我的扩展没有写入任何已呈现文档的权限

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

"补充问题包括:


如何在Mozilla Firefox中实例化插件?我在哪里可以得到FF“解释”的文档,这样扩展就可以写入它

我自己不知道怎么做,但这里有一个开源的firefox扩展可以做到这一点:

您的firefox扩展需要使用“”。对于浏览器的不同部分,有许多类型的覆盖,它们在指定文档中加载(覆盖),如文件中定义的那样

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

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

下面是一个示例XUL文件,它只不过加载内容类型为“application/x-example-plugin”的NPAPI插件,并将插件对象分配给变量“myPlugin”


myPlugin=document.getElementById(“myPlugin”);
myPlugin=document.getElementById(“myPlugin”);
警报(myPlugin.someFunction());
需要注意的一些重要事项

  • “xmlns:html=…”声明非常关键,因为插件对象正在html:object中加载,该声明告诉XUL解析器如何呈现该对象
  • 窗口的id(“主窗口”)很重要,因为这是XUL解析器覆盖项的方式(在“主”窗口内)
  • 对象id(“本例中为myPlugin”)是您稍后通过JavaScript在中引用插件对象的方式
  • 因为我们不使用插件显示内容,而只是调用插件提供的公共方法,所以让CSS可见性“隐藏”并将大小设置为1x1像素很重要。如果不这样做,最终可能会在浏览器UI中呈现大量空白。此外,重要的是使用CSS“可见性”属性,而不是“显示”属性。如果您将display属性设置为“none”,那么您的插件在覆盖中实际初始化时就会出现问题
  • 在扩展文件中,必须将“unpack”属性指定为“true”,即:
    true
  • 一旦在浏览器XUL的上下文中加载了覆盖,并且在主浏览器窗口中初始化了插件,就可以在主窗口的范围内通过分配给它的变量(“本例中的myPlugin”)引用插件

    这里我将不深入讨论如何获取的上下文(参见下面的链接),但是一旦有了引用,就可以从内部调用公开的方法,等等

    参考链接-

    可能的副本
    overlay     chrome://browser/content/browser.xul            content/firefoxOverlay.xul
    
    <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>