2012-12-09 24 views
1

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

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

回答

2

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

+0

哇;我做了下面所有的工作,甚至没有+1帮助澄清?苛刻。 – taxilian

4

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

NPN_PluginThreadAsyncCall被引入来解决这个问题;它接受一个函数指针和一个void *来传递数据,并在主线程中调用该函数。当然,这里有一些棘手的事情发生,因为如果在插件关闭期间由于固有的竞争条件而致电NPN_PluginThreadAsyncCall,则无法保证您的函数将被调用。 FireBreath做一些相当异乎寻常的巫术来照顾这一点,并防止内存泄漏。

当你开始尝试支持除FireFox之外的其他浏览器时,事情会变得更加粗糙; AFAIK FireFox支持所有版本的API调用,但至少某些版本的Safari(特别是64位)不支持NPN_PluginThreadAsyncCall;最有趣的是,他们有时似乎支持它,但最终会遇到一个糟糕的函数指针,当你尝试使用它时会崩溃。这可能是在一个非常新的版本中修复的,我不知道,因为我们很久以前就改用Mac上的NSTimer来避免无法正确检测它是否被支持的问题。另外,Opera上的Windows已知不支持它。 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?

好运