Webkit中HTML5 Video的实现分析(五) - WebKit中视频事件的传递

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

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

[WebKit]为JavaScript
Binding添加新DOM对象的三种方式及实作

对于视频元素,可以对应看看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如何解析视频的属性吗? 可以看看这里:

Webkit中HTML5 Video的实现分析 (一) - 基本结构及HTMLMediaElement & MediaPlayer

同样是在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

上一篇: Webkit中HTML5 Video的实现分析 (四)
- 视频加载及播放的时序图


下一篇:  Webkit中HTML5 Video的实现分析 (六) - Safari视频机制分析

时间: 2024-09-21 02:59:10

Webkit中HTML5 Video的实现分析(五) - WebKit中视频事件的传递的相关文章

Webkit中HTML5 Video的实现分析(六) - Safari视频机制分析

Safari中的视频相关操作封装在QuickTime Plugin里面,存放于/Library/Internet Plugin目录下.   下图是相关类的class diagram: 其中的QuickTime Plugin是通过已淘汰的Apple之前定义的Webkit Plugin协议来实现的,而不是现在支持的Netscape API的机制. 可以参考以下文档:        Introduction to WebKit Plugin Programming Topic           We

Webkit中HTML5 Video的实现分析 (四) - 视频加载及播放的时序图

MediaPlayer同MediaPlayerPrivateInterface,再同播放控件的交互过程应当要简单.清晰.MediaPlayer通过自身的状态(Network States 和 Ready States)来控制操作的步骤.MediaPlayerPrivateInterface具体到不同的平台和视频格式,使用的具体的播放控件会不同. 这里仅贴一张时序图,其中没有特别区分HTMLVideoElement,使用的播放控件是Webkit默认的QuickTime组件.在调试时,最好要将UA调

Webkit中HTML5 Video的实现分析 (一) - 基本结构及HTMLMediaElement &amp;amp; MediaPlayer

以下为针对Webkit中HTML5 Video实现原理的分析和学习总结.至于其中的UML图档,可以到下面的github链接中下载. 首先预览一下Webkit中和Video相关的主要的类的层次结构: 其中主要的类为HTMLMediaElement, MediaPlayer以及RenderVideo(左下角). HTMLMediaElement代表了DOM结点,其继承关系可以追溯到Node,也就是DOM的结点.网页中Video/Audio元件的解析就是由它的创建开始.JavaScript的视频操作A

Webkit中HTML5 Video的实现分析 (三) - MediaPlayer &amp;amp; MediaPlayerPrivate的生命周期

明确主要类的生命周期有助于更好理解Webkit中视频的工作流程.下图展示了类间的引用关系. 如HTMLVideoElement与一个MediaPlayer对应,MediaPlayer与MediaPlayerPrivate一一对应,它们都是一个组合关系,当所有者自身被析构时,会自动释放引用的实例.这个过程都是使用OwnPtr智能指针来实现的.   OwnPtr赋值操作的代码:        OwnPtr& operator=(std::nullptr_t) { clear(); return *t

Webkit中HTML5 Video的实现分析 (二) - MediaPlayerFactory &amp;amp; RenderVideo的绘制操作

MediaPlayerFactory MediaPlayerFactory像是一个解码库一样,初始化时,各个可用的播放器(MediaPlayerPrivate)向它注册.当需要解码时,由它给出一个合适的播放器(呼叫MediaPlayerPrivate::constructor,即MediaPlayerPrivate::create)创建一个实例[由MediaPlayer:: loadWithNextMediaEngine执行]).所以MediaPlayer与MediaPlayerPrivate应

php中return的用法实例分析

 这篇文章主要介绍了php中return的用法,实例分析了php中return的功能及常见的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php中return的用法.分享给大家供大家参考.具体分析如下: 首先,它的意思就是返回;return()是语言结构而不是函数,仅在参数包含表达式时才需要用括号将其括起来.当返回一个变量时通常不用括号,这样可以降低PHP的负担. 基本用法: a).return expression // 返回一个表达式结果 b).return(e

JS中prototype的用法实例分析

 这篇文章主要介绍了JS中prototype的用法,实例分析了JS中prototype的常见使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JS中prototype的用法.分享给大家供大家参考.具体分析如下: JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A

js检测浏览器是否支持html5中的video标签的方法

 这篇文章主要介绍了使用js检测浏览器是否支持html5中的video标签的方法,需要的朋友可以参考下 代码如下: //检测是否支持HTML5 function checkVideo() {     if (!!document.createElement('video').canPlayType) {         var vidTest = document.createElement("video");         oggTest = vidTest.canPlayType

使用js检测浏览器是否支持html5中的video标签的方法_javascript技巧

复制代码 代码如下: //检测是否支持HTML5function checkVideo() {    if (!!document.createElement('video').canPlayType) {        var vidTest = document.createElement("video");        oggTest = vidTest.canPlayType('video/ogg; codecs="theora, vorbis"');