0

我做了一个简单的 NPRuntime 插件,它在加载时调用 Javascript 函数。基于的示例是 seamonkey,它在 Google Chrome 上运行良好,但在 FireFox 上却不行。

我跟踪代码以找出问题所在,并找到了这一行。

NPObject* window;
NPError err = NPN_GetValue(pNPP, NPNVWindowNPObject, &window);
if (!window)
    _log("Can not get DOM window %d", err);

错误返回 NPERR_INVALID_PARAM。

这个简单的例子可能适用于旧版本的 Firefox 我猜... 12.0?13.0?(我不确定)现在我使用的是最新版本的 FireFox 15.0。

任何帮助将不胜感激。

4

1 回答 1

1

所以看起来你真正的问题是关于如何从另一个线程调用 javascript 的东西,因为你不能从其他线程进行 NPN_ 调用。简短的回答是你不能;更长,更复杂的答案是这很痛苦,但可以做到。

NPAPI 有一个名为NPN_PluginThreadAsyncCall的函数。它接受两个参数;第一个是返回 void 并接受 void* 的函数指针,第二个是将传递给该函数的 void*。您可以从任何线程调用此函数,它会导致您的回调“很快”在主线程上被回调。

诀窍是确保您的 void* 为您提供所需的所有数据,以便在通话期间恢复您需要访问的任何内容。如果你需要的话,更大的技巧是让它看起来是同步的。第一个可以用指针完成,并确保你自己清理;第二个可以用互斥锁和信号来完成,如果你很聪明的话。

这是一件棘手且难以做到的事情。如果可以选择,您可能会考虑使用FireBreath,因为它可以为您完成所有这些工作。特别是因为 FireBreath 为不支持 NPN_PluginThreadAsyncCall 的各种随机浏览器提供了解决方法(如某些版本的 Opera 和 Safari 5.1 及更高版本)。

于 2012-09-14T13:20:33.200 回答