0

ロード時にJavascript関数を呼び出す単純なNPRuntimeプラグインを作成しました。ベースの例はseamonkeyのもので、Google Chromeでは正常に機能しますが、FireFoxでは機能しません。

コードをトレースして何が問題なのかを見つけ、この行を見つけました。

NPObject* window;
NPError err = NPN_GetValue(pNPP, NPNVWindowNPObject, &window);
if (!window)
    _log("Can not get DOM window %d", err);

errはNPERR_INVALID_PARAMを返します。

この簡単な例は、Firefoxの古いバージョンでうまくいくかもしれません... 12.0?13.0?(よくわかりません)現在、最新バージョンのFireFox15.0を使用しています。

どんな助けでもありがたいです。

4

1 に答える 1

1

したがって、他のスレッドからNPN_呼び出しを行うことはできないため、実際の質問は別のスレッドからjavascriptのものを呼び出す方法に関するもののようです。簡単な答えは、あなたはできないということです。より長く、より複雑な答えは、それは苦痛ですが、それは可能であるということです。

NPAPIには、 NPN_PluginThreadAsyncCallという関数があります。2つのパラメータを受け入れます。1つ目はvoidを返し、void *を受け入れる関数ポインタであり、2つ目はその関数に渡されるvoid*です。この関数は任意のスレッドから呼び出すことができ、「近いうちに」メインスレッドでコールバックがコールバックされます。

秘訣は、void *が、その呼び出し中にアクセスする必要のあるものに戻るために必要なすべてのデータを確実に提供することです。より大きなトリックは、それが必要な場合、これを同期しているように見せることです。1つ目は、ポインターを使用して実行でき、自分の後でクリーンアップすることを確認します。2つ目は、賢い場合はミューテックスとシグナルを使用して実行できます。

これは、正しく理解するのが難しい難しいことです。オプションの場合は、FireBreathを使用することを検討してください。FireBreathがすべてを代行してくれるからです。特にFireBreathには、NPN_PluginThreadAsyncCallをサポートしないさまざまなランダムブラウザ(OperaやSafari 5.1以降の一部のバージョンなど)に対する回避策があるためです。

于 2012-09-14T13:20:33.200 に答える