来自NPAPI插件的浏览器主线程

时间:2012-12-09 18:21:53

标签: multithreading plugins browser model npapi

我正在开发一个NPAPI插件,我需要从浏览器的主线程中运行一些代码。

NPAPI插件的线程模型是什么? NPAPI执行的默认线程是什么?如何从浏览器的主线程运行我的代码?

2 个答案:

答案 0 :(得分:4)

正如smorgan所说,浏览器的线程模型是任何对浏览器的调用都必须在主线程上进行。这有一两个奇怪的例外,但支持有点不一致。

引入了{p> NPN_PluginThreadAsyncCall来解决这个问题;它接受一个函数指针和一个void *,用于传递给它的数据,并将在主线程上调用该函数。当然,这里有一些棘手的事情,因为如果你在插件关闭期间因为固有的竞争条件而调用NPN_PluginThreadAsyncCall,你不能保证你的函数会被调用。 FireBreath做一些非常奇特的伏都教来照顾这个并防止内存泄漏。

当你开始尝试支持除FireFox之外的其他浏览器时,事情变得更加浓厚; AFAIK FireFox在所有版本中都支持此API调用,但至少某些版本的Safari(特别是64位)不支持NPN_PluginThreadAsyncCall;最有趣的是,他们有时似乎支持它,但你最终得到一个糟糕的函数指针,当你尝试使用它时崩溃。这可能是在最新版本中修复的,我不知道,因为我们很久以前改为在Mac上使用NSTimer,以避免无法正确检测是否支持它的问题。另外,Windows上的Opera也不支持它。 FireBreath使用消息HWND并使用PostMessage在Windows浏览器上的主线程上进行调用而不支持它。

我不知道Linux上是否存在类似的问题;您没有指定您关注的平台。我没有听说过有关linux的任何问题,但这可能是也可能没有任何意义。

有关该主题的其他值得阅读的问题: Generating async Javascript events from browser plugin (NPAPI) How to callback plugin thread on Safari 5.1 on OSX?

祝你好运

答案 1 :(得分:2)

线程模型是浏览器将在主线程中调用您的插件,您必须从主线程调用NPN_*方法。