繁体   English   中英

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

[英]Invoking NPAPI plugin functionality from Firefox extension

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

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

我无法轻松地使解决方案适应Firefox中的使用,因为该扩展名没有任何单独的文档支持,并且该扩展名没有写任何已经呈现的文档的权限。

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

“补充”问题是:

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

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

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

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

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

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

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

一旦您的叠加层在浏览器XUL的上下文中加载,并且插件在主浏览器窗口中初始化,您就可以在主窗口范围内通过将变量分配给您的变量来引用插件(在此,“ myPlugin”例)。

我不会在这里深入了解如何获取主窗口的上下文(请参阅下面的链接),但是一旦有了引用,就可以从内容脚本,侧边栏,工具栏等中调用公开的方法。

参考链接-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM