3

Webkitプラグイン機能を使用して<video>、組み込み環境にタグを実装しています。(興味のある人のために、私はこれに触発されました

プラグインのメソッドとプロパティを正常に接続して、HTML5タグがWebkitのMediaPlayerPrivateクラスで公開する必要があるものをマップしました(プロパティをクエリして単純なメソッドを呼び出す方法を知っています)が、プラグインがどのようにパスバックできるのか疑問に思っていますMediaPlayerインターフェースへのデータ。

私のプラグインaddEventListener()はJavaScriptでインターフェースを実装しているので、それを使用してMediaPlayerクライアントをEventListenerとして登録できると思いましたが、その方法がわかりません。

私がやりたいことはこのようなものです:

  Plugin                    WebKit
+--------------+         +-----------------------------+
|              |         |                             |
|          <-------------|-+addEventListener(callback) |
|              |         |                             |
|+----------+  |         |                             |
||          |  |         |                             |
|| onEvent  |  |         |                             |
|+----------+--------------> callback( EventData )     |
|              |         |                             |
+--------------+         +-----------------------------+

私が知らないaddEventListenerのは、プラグインのメソッドを呼び出して、C++の静的コールバックを参照するJSObjectを渡す方法です。

あなたはそれを行う方法について何か考えがありますか?

( AsciiflowのおかげでASCII図面)

4

1 に答える 1

3

興味のある人にとって、解決策は次のとおりです。

// event name is the name of the event I want to subscribe to
// callback is a static function with the 'JSObjectCallAsFunctionCallback' prototype
JSObjectRef callbackObject = JSObjectMakeFunctionWithCallback(ctx, JSStringRef(), callback);
JSValue js_cb[3] = {
    toJS(state, (const JSValueRef)JSValueMakeString (ctx, JSStringCreateWithUTF8CString(eventName))),
    toJS(state, (const JSValueRef)callbackObject),
    toJS(state, (const JSValueRef)JSValueMakeBoolean(ctx, false))
};
ArgList args(js_cb, 3);

return invokeMethod("addEventListener", args);

このコードを使用すると、プラグイン オブジェクトがイベントをブロードキャストするたびに、コードがcallback静的関数に到達することがわかります。

あとは、必要なプライベート データを渡す方法を見つけて、この静的関数から実行時の値を変更できるようにする必要があります。

于 2013-02-05T15:01:21.577 に答える