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



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

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

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

引入NPN_PluginThreadSyncCall正是为了解决这个问题;它接受一个函数指针a void*,用于将数据传递到其中,并将在主线程上调用该函数。当然,这里有一些棘手的事情,因为如果您在插件关闭期间由于固有的竞争条件而调用NPN_PluginThreadSyncCall,则不能保证您的函数会被调用。FireBreath做了一些相当奇特的巫毒来处理这个问题并防止内存泄漏。

当你开始尝试支持FireFox之外的其他浏览器时,事情会变得更加复杂;AFAIK FireFox在所有版本中都支持此API调用,但至少Safari的某些版本(尤其是64位)不支持NPN_PluginThreadSyncCall;最有趣的是,他们有时似乎支持它,但当你试图使用它时,你会遇到一个坏的函数指针,它会崩溃。这可能在最近的版本中已经修复了,我不知道,因为我们很久以前就在Mac上改为使用NSTimer,以避免无法正确检测它是否受支持的问题。windows上的Opera也不支持它。FireBreath使用消息HWND并执行PostMessage在不支持它的windows浏览器上调用主线程。

我不知道linux上是否存在类似的问题;你没有具体说明你关心的是哪个平台。我没有听说linux有任何问题,但这可能意味着什么,也可能不意味着什么。

其他值得一读的问题:从浏览器插件(NPAPI)生成异步Javascript事件如何在OSX上回调Safari 5.1上的插件线程?

祝好运

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

最新更新