答案是是……又不是……
如果需要支持较旧的浏览器(firefox 3之前),可以自己实现 NPN_PluginThreadAsyncCall 函数。在 Windows 上,您可以通过创建一个可以保存函数指针和 void* 不透明指针的数据结构来实现此目的,然后将自定义消息发布到主窗口,并将指向数据结构的指针作为 LPARAM。
主窗口 WINPPROC 在 UI 线程上运行,该线程是可以与 Javascript 对话的线程。因此,当您在 WINPROC 中收到该消息时,只需将 LPARAM 强制转换回指针,使用不透明数据调用该方法,然后释放数据结构。
在 Mac 上,您可以使用队列执行类似的操作来存储事件,然后对 NULL 事件(Mac OS 在每次更新时发送)检查其中是否有任何内容。如果是这样,请将其弹出,调用该方法,释放它,然后继续。
也许有一种方法可以在Linux上做到这一点,但我不知道它是什么。
您可以在以下位置找到 Windows 版本的示例火息项目.
winproc 消息的处理位于此文件中:https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.cpp
事件和数据结构在其头文件中定义:https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.h
触发该事件的方法如下:
void ActiveXBrowserHost::ScheduleAsyncCall(void (*func)(void *), void *userData)
{
if (m_hWnd != NULL)
::PostMessage(m_hWnd, WM_ASYNCTHREADINVOKE, NULL,
(LPARAM)new FB::WINDOWS_ASYNC_EVENT(func, userData));
}