3

我正在使用 Webkit 插件工具<video>在嵌入式环境中实现标签。(对于那些感兴趣的人,我受到了启发)

我成功地连接了我的插件的方法和属性,以映射 HTML5 标记应该在 Webkit 的MediaPlayerPrivate类中公开的那些(我知道如何查询属性和调用简单的方法),但我现在想知道我的插件如何传回数据到 MediaPlayer 接口。

我的插件addEventListener()在 JavaScript 中实现了接口,所以我想我可以使用它将 MediaPlayer 客户端注册为 EventListener,但我不知道如何。

我想做的是这样的:

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

我不知道的是如何调用addEventListener插件的方法并将其传递给引用 C++ 中的静态回调的 JSObject。

你对如何做到这一点有任何想法吗?

(ASCII 绘图感谢Asciiflow

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 回答