从 Firefox 扩展调用 NPAPI 插件功能

Posted

技术标签:

【中文标题】从 Firefox 扩展调用 NPAPI 插件功能【英文标题】:Invoking NPAPI plugin functionality from Firefox extension 【发布时间】:2012-12-14 07:12:33 【问题描述】:

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

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

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

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

“补充”问题是:

如何在 Mozilla Firefox 中实例化插件?我在哪里可以获得将由 FF “解释”并且扩展能够写入的文档?

【问题讨论】:

Embedding NPAPI plugin in background using just Firefox Addon SDK的可能重复 【参考方案1】:

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

【讨论】:

【参考方案2】:

您的 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"   style="visibility:hidden;"></html:object>
        </vbox>
    </window>
</overlay>

需要注意的一些重要事项

    “xmlns:html=...”声明很关键,因为插件对象被加载到一个 html:object 中,并且该声明告诉 XUL 解析器如何呈现该对象。 窗口的 id(“主窗口”)很重要,因为 XUL 解析器就是这样覆盖项目的(在“主”窗口中) 对象 ID(在本例中为“myPlugin”)是您稍后通过 JavaScript 引用插件对象的方式。 因为我们不使用我们的插件显示内容,只是调用它提供的公共方法,所以重要的是让 CSS 可见性“隐藏”,并将大小设置为 1x1 像素。如果不这样做,您最终可能会在浏览器 UI 中呈现大的空白区域。此外,使用 CSS 的“可见性”属性很重要,而不是“显示”属性。如果您将 display 属性设置为“none”,您的插件实际上会在叠加层中初始化时遇到问题。 在您的扩展install.rdf 文件中,您必须将“unpack”属性指定为“true”,即:&lt;em:unpack&gt;true&lt;/em:unpack&gt;

一旦您的覆盖在浏览器 XUL 的上下文中加载,并且您的插件在主浏览器窗口中初始化,您可以在主窗口范围内通过您分配给它的变量(“myPlugin "在本例中)。

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

参考链接-

XUL Overlays Install manifests (chrome.manifest) Working with windows in chrome code Interaction between privileged and non-privileged pages Source files for one of my Firefox extensions using an NPAPI plugin

【讨论】:

以上是关于从 Firefox 扩展调用 NPAPI 插件功能的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 Firefox Addon SDK 在后台嵌入 NPAPI 插件

Firefox 实例化 NPAPI 插件时崩溃

Firefox 未检测到 NPAPI 插件

Firefox 扩展和 COM 组件之间的 IPC

NPAPI 插件未在 Firefox 中加载

我正在寻找一个 NPAPI 插件吗?