答えはイエス...そしてノー...
古いブラウザー (Firefox 3 より前) をサポートする必要がある場合は、NPN_PluginThreadAsyncCall 関数を自分で実装できます。Windows では、関数ポインターと void* opaque ポインターを保持できるデータ構造を作成し、データ構造へのポインターを LPARAM としてメイン ウィンドウにカスタム メッセージを投稿することで、これを行うことができます。
メイン ウィンドウ WINPPROC は、Javascript と対話できるスレッドである UI スレッドで実行されます。そのため、WINPROC でそのメッセージを受け取ったら、単純に LPARAM をポインターにキャストし直し、不透明なデータを使用してメソッドを呼び出し、データ構造を解放します。
Mac では、イベントを格納するキューを使用して同様のことを行うことができます。次に、NULL イベント (ティックごとに Mac OS によって送信される) で、その中に何かがあるかどうかを確認します。もしそうなら、ポップオフし、メソッドを呼び出して解放し、続行します。
おそらくLinuxでもそれを行う方法がありますが、それが何であるかはわかりません。
firebreath プロジェクトで 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));
}