Webkit之video事件流程分析

HTML的每个元素都可以让JavaScript在某些事件发生时,进行处理。就比如οnclick="clickButton()"之类的属性设定。

像下面这篇博客所讲的一样,在WebKit中每个元素都有其对应的JS绑定的实现:

对于视频元素,可以对应看看JSHTMLMediaElement.cpp和JSHTMLVideoElement.cpp中的实现。

这里只说一下事件的处理机制。就是在WebKit中有事件发生时,如何调用JavaScript对应的处理函数。

视频元素除了一般的HTML DOM Node的事件外,还有一些特定的事件,比如played, paused, ended等。这些在JSHTMLMediaElement.cpp中都可以看到:
static const HashTableValue JSHTMLMediaElementTableValues[] =
{
    {  "error" ,  DontDelete  |  ReadOnly , ( intptr_t ) static_cast < PropertySlot :: GetValueFunc >( jsHTMLMediaElementError ), ( intptr_t )0,  NoIntrinsic  },
      {  "played" ,  DontDelete  |  ReadOnly , ( intptr_t ) static_cast < PropertySlot :: GetValueFunc >( jsHTMLMediaElementPlayed ), ( intptr_t )0,  NoIntrinsic  },
    {  "seekable" ,  DontDelete  |  ReadOnly , ( intptr_t ) static_cast < PropertySlot :: GetValueFunc >( jsHTMLMediaElementSeekable ), ( intptr_t )0,  NoIntrinsic  },
    {  "ended" ,  DontDelete  |  ReadOnly , ( intptr_t ) static_cast < PropertySlot :: GetValueFunc >( jsHTMLMediaElementEnded ), ( intptr_t )0,  NoIntrinsic  },
...


还记得WebKit如何解析视频的属性吗? 可以看看这里:

同样是在HTMLMediaElement::parseAttribute函数中,有如下的代码段:
        ......
    else  if  ( attrName  ==  onabortAttr )
         setAttributeEventListener ( eventNames (). abortEvent ,  createAttributeEventListener ( this ,  attr ));
     else  if  ( attrName  ==  onbeforeloadAttr )
         setAttributeEventListener ( eventNames (). beforeloadEvent ,  createAttributeEventListener ( this ,  attr ));

setAttributeEventListener()的就是将新指定的事件处理函数通过EventTarget::addEventListener()加入到EventTarget对象内部的hash表中(EventListenerMap)。它的第二个参数就是一个EventListener,负责最终执行这个事件处理函数。

当需要触发某个事件时,使用如下方式调用:
if  ( m_networkState  ==  NETWORK_LOADING  ||  m_networkState  ==  NETWORK_IDLE )
         scheduleEvent ( eventNames (). abortEvent );
上面的代码表示如果条件成立,将触发一个abort事件给JavaScript。

scheduleEvent主要是创建一个EventTarget对象加到所谓的GenericEventQueue的队列中,以异步的方式执行。 在执行时(GenericEventQueue::timerFired())再交由EventTarget来执行。最终会检查已注册的事件处理函数,对应执行JavaScript函数。

下面是比较完整的时序图供参考 ( 注意HTMLMediaElement的继承关系回到Node时,你会现HTMLMediaElement也是继承自EventTarget的):



转载请注明出处: http://blog.csdn.net/horkychen
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值