8

Web ブラウザー プラグイン (NPAPI) を作成しています。

私のプラグインはワーカー スレッドを開始します。ワーカーが進行するにつれて、イベントを Javascript に渡したいと思います。しかし、NPAPI スレッド モデルのため、ワーカー スレッドが NPAPI に直接コールバックすることは合法ではないため、ワーカー スレッドは Javascript を呼び出すことができません。

これに対する 1 つの解決策は、NPN_PluginThreadAsyncCall 関数です。しかし、これは比較的新しい機能です。たとえば、Firefox 3 以降でのみサポートされています。

NPN_PluginThreadAsyncCall を使用せずに NPAPI プラグインから非同期イベント配信/JavaScript 実行を取得する方法はありますか? この機能が追加される前に人々は何をしていましたか?

4

1 に答える 1

5

答えはイエス...そしてノー...

古いブラウザー (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));
}
于 2009-12-20T07:17:30.893 に答える