NPAPI插件[FireFox]:Invoke()/ HasProperty()/ HasMethod()未被调用

时间:2013-07-22 14:16:56

标签: npapi browser-plugin

我正在为Windows开发Firefox的NPAPI插件。这是我的java脚本:

document.addEventListener('load', documentLoad, true);


function loadPlugin(doc) 
{
    var objWebMon = doc.getElementById("my_firefox");

    if(!objWebMon)
    {
        var objWebMonEmbed = doc.createElement('embed');
        objWebMonEmbed.setAttribute('id', 'my_firefox');
        objWebMonEmbed.setAttribute('type', 'application/npplugin');
        objWebMonEmbed.setAttribute('style', 'height: 10px; width:10px; display:block;');
        if(doc.body)
        {
            doc.body.insertBefore(objWebMonEmbed, doc.body.firstChild);

        }
    }
}
function documentLoad(event) {
    try 
    {
    var doc = event.originalTarget; // doc is document that triggered "onload" event
    loadPlugin(doc);
        var myplugin = doc.getElementById('my_firefox');
        if(myplugin)
        {
                myplugin();
            myplugin.myAction();

        }
    } catch(err) 
    {
    }
}

因为我正在调用myplugin()

bool ScriptablePluginObject::InvokeDefault(const NPVariant *args, uint32_t argCount, NPVariant *result)

成功调用但调用函数myplugin.myAction()

bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args,
                               uint32_t argCount, NPVariant *result)

函数未调用。我已经在ScriptablePluginObject::HasProperty(NPIdentifier name)内声明myAction,即使HasProperty方法也没有被调用。

在catch块中我收到此错误。 TypeError: fasso.myAction is not a function

1 个答案:

答案 0 :(得分:0)

以下是一些可以尝试的事情:

  1. 使用对象标记而不是嵌入 - 尽管使用嵌入广泛流行,但我在对象标记方面取得了更多的成功
  2. 在将对象添加到DOM之前,永远不要设置对象或嵌入标记的类型 - 这样做会导致它实例化插件,然后在移动时将其置于一种奇怪的状态。我不认为这次会引起你的问题,但值得一试。
  3. 在将hte插件插入DOM并使用它之间可能需要稍微延迟。尝试添加延迟50ms的setTimeout并在回调函数中访问插件。
  4. 老实说,#3是我认为最有可能产生影响的一个,但我提出了另外两个,因为他们过去曾经咬过我的奇怪事情。祝你好运!