【问题标题】:Scriptable NPAPI plugin doesn't work with Firefox可编写脚本的 NPAPI 插件不适用于 Firefox
【发布时间】:2011-04-16 19:15:00
【问题描述】:

我正在开发协同工作的 FF 扩展和插件。 My Extension 将 npapi 插件注入到 html 中,并在事件发生后调用插件的某些方法。

这是我用于注入的代码:

if (window.content.document.getElementById("rondyoHookMessageElement") == null) {
            var element = window.content.document.createElement("object");
            element.type = "application/x-hook-msg";
            element.id = "rondyoHookMessageElement";
            element.width = 0;
            element.height = 0;
            window.content.document.body.appendChild(element);
}

当我需要使用插件的方法时,我会执行以下操作:

var element = window.content.document.getElementById("rondyoHookMessageElement");
element.SomeFunc();

我确认已找到该元素,但记录 element.SomeFunc 会返回 undefined

如果我手动注入 npapi 插件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
</head>
<body>
<object id="plugin" type="application/plugin-mime" width=200 height=200 border=5></object>
<script type="text/javascript">
    var plugin = document.getElementById("plugin");
    dump(plugin.SomeFunc + "\n");
</script>
</body>
</html>

它返回function SomeFunc() { [native code] }

操作系统:Mac OS X 10.6.7

FF:3.6.13

【问题讨论】:

    标签: macos firefox firefox-addon npapi firefox3.6


    【解决方案1】:

    如果您在 FireFox 4 中执行此操作,您很有可能会导致浏览器崩溃(该错误已被记录,但尚未修复)。在将对象标签注入 DOM 之前设置它的类型不是一个好主意;您将在每个浏览器上获得不同的行为。等到您将对象放入 dom 中,然后再注入它。

    另一个可能的问题是,有时浏览器在将其注入 DOM 后需要一段时间才能访问插件,因此如果您使用 setTimeout 等待半秒左右,它可能会在此时开始工作。

    【讨论】:

    • 已经有一些超时。我认为这是一个安全问题:扩展的 JS 代码不能使用注入页面 html 的 NPAPI 插件。但我不确定,我还没有测试过。
    【解决方案2】:

    我通过扩展调用 SomeFunc 的脚本解决了这个问题:

    if (window.content.document.getElementById("rondyoHookMessageElement") == null) {
                var element = window.content.document.createElement("object");
                element.type = "application/x-hook-msg";
                element.id = "rondyoHookMessageElement";
                element.width = 0;
                element.height = 0;
                window.content.document.body.appendChild(element);
    
                var script = doc.createElement("script");
                script.type = "text/javascript";
                script.innerHTML = 'function f(doc, messageId, data) { document.getElementById("rondyoHookMessageElement").SomeFunc(doc, messageId, data); };';
                doc.body.appendChild(script);
    }
    

    当我需要从我做的扩展调用这个函数时:

    window.content.document.defaultView.wrappedJSObject.f(null, mes, false);
    

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多