公开/公告号CN105630473A
专利类型发明专利
公开/公告日2016-06-01
原文格式PDF
申请/专利权人 中国科学院声学研究所;
申请/专利号CN201410610824.0
申请日2014-11-03
分类号G06F9/44;
代理机构北京方安思达知识产权代理有限公司;
代理人王宇杨
地址 100190 北京市海淀区北四环西路21号
入库时间 2023-12-18 15:46:39
法律状态公告日
法律状态信息
法律状态
2019-01-22
授权
授权
2016-06-29
实质审查的生效 IPC(主分类):G06F9/44 申请日:20141103
实质审查的生效
2016-06-01
公开
公开
技术领域
本发明涉及嵌入式领域,特别涉及一种支持异步调用的JavaScript事件扩展方 法。
背景技术
在嵌入式设备上,用户不仅可以通过浏览器来获取互联网上的信息,同时还可 以通过浏览器操控设备与本地功能组件交互。以浏览器为载体的Web应用正逐渐兴 起,Web应用具有开发门槛低,容易移植等优点。在构建Web应用的时候,一个重 要的问题是需要将本地组件的接口扩展为JavaScript接口,供Web应用调用。将本 地组件接口扩展为JavaScript,具有广泛的需求。本地组件和JavaScript之间的同步 调用比较容易实现,但是由于异步调用时需要跨线程之间做消息传递,以及异步处 理后需要将结果以回调的方式返回等特点,本地组件与JavaScript之间做异步调用比 较困难。
发明内容
本发明的目的在于克服现有技术中本地组件与JavaScript之间的异步调用较为 困难的缺陷,从而提供一种能够较好地实现本地组件和JavaScript异步调用的方法。
为了实现上述目的,本发明提供了一种支持异步调用的JavaScript事件扩展方 法,该方法基于WebKit实现,包括:
步骤1)、在WebCore内按照DOM事件的命名方式扩展JavaScript事件的名称;
步骤2)、按照WebCore中JavaScript对象的创建方式创建JavaScript事件对象;
步骤3)、将步骤2)中所创建的JavaScript事件对象扩展为EventTarget;
步骤4)、将WebCore中的事件封装为V8中的事件对象;
步骤5)、编译并部署动态库。
上述技术方案中,所述步骤2)包括:
扩展WebCore中JavaScript对象的事件,得到JavaScript事件对象;
声明所述JavaScript事件对象继承Event对象,并定义所述JavaScript事件对象 的属性;
在WebCore中,将与所述JavaScript事件对象所对应的C++类继承WebCore中 的Event类,实现属性的getter方法。
上述技术方案中,所述步骤3)包括:
令JavaScript对象继承EventTarget;
将JavaScript事件声明为所述JavaScript对象的一个属性;
在WebCore中,令与所述JavaScript对象所对应的C++类继承EventTarget,并 在该类中定义JavaScript事件监听函数的setter和getter方法;
在所述JavaScript对象中实现一个创建并发起JavaScript事件的函数。
上述技术方案中,所述的步骤4)包括:
在JavaScript对象所对应的C++类的基类EventTarget中加入getter方法,该方法 为虚函数,同时在该JavaScript对象所对应的C++类中重写该方法,返回this指针;
在WebCore中的Event类中加入判断事件类型的方法,该方法同样是虚函数, 在Event的派生类,即JavaScript事件对象所对应的C++类中重写该方法;
将WebCore中的Event类封装为V8Event,加入事件的类型判断并将WebCore 中的Event类封装为V8的数据格式。
本发明的优点在于:
1、本发明可有效地解决本地组件和JavaScript之间的异步调用问题。所扩展的 JavaScript对象和本地组件之间不仅可以同步调用,还可以异步调用,拓宽了本地组 件和扩展JavaScript对象之间的调用方式。
2、本发明提出的异步调用方法,是在浏览器内部通过native方式实现,在嵌入 式设备计算资源有限的环境下,能够节省计算资源,特别适合在本地组件和JavaScript 对象之间有频繁异步调用的情景。
附图说明
图1是本发明的支持异步调用的JavaScript事件扩展方法的应用场景示意图;
图2是本发明的支持异步调用的JavaScript事件扩展方法的流程图;
图3是本发明的支持异步调用的JavaScript事件扩展方法中WebCore的DOM事 件模型静态结构图;
图4是本发明的支持异步调用的JavaScript事件扩展方法中OTTVideo事件的函 数调用序列图。
具体实施方式
现结合附图对本发明作进一步的描述。
本发明的方法是基于WebKit实现的,为了便于理解,在对本发明的方法做详细 说明之前,首先对WebKit做简要的描述。
WebKit是一个开源网页排版引擎,WebKit内核中主要包含两大部分:WebCore 和JavaScript引擎。
WebCore是HTML文档排版引擎,负责解析、布局、渲染HTML文档。其中包 含DOM(DocumentObjectModule,文档对象模型)的实现,同时WebCore也有绑 定(binding)模块,它可以和JavaScript引擎绑定。这样JavaScript引擎可以操控DOM 模块,控制网页的行为。
JavaScript引擎是JavaScript语言的一个解释器,提供了JavaScript的运行环境, 可以解析并执行JavaScript脚本。同时,JavaScript引擎与WebCore中的bindings模 块相联系,使得JavaScript脚本可以操作DOM元素。
下面结合实例对本发明的方法做进一步说明。
图1为本发明方法的应用场景的示意图,如图所示,一浏览器中包含有本地组 件,而在Web页面中运行JavaScript脚本。为了实现本地组件与JavaScript脚本间的 同步调用与异步调用(特别是异步调用),将本地组件的接口扩展为JavaScript接口。 所述的JavaScript接口基于WebKit实现,即在该接口中至少包括有WebCore和 JavaScript引擎。
在下面的实例中将以流媒体视频的播放为例,对本发明的方法如何将本地组件 的接口扩展为JavaScript接口做进一步的说明。
在流媒体视频播放的过程中,用户在Web页面上点击一个流媒体视频,由Web 页面中的JavaScript脚本调用本地组件,本地组件则通过异步方式获取视频的URL 地址,当本地组件准备好URL地址后,以DOM事件的方式通知Web页面。具体的 说,在本实施例中,将本地组件的JavaScript接口的WebCore中与流媒体视频播放 有关的对象记为OTTVideo对象;将Web页面的JavaScript脚本中与流媒体视频播放 有关的对象记为ottvideo对象;将OTTVideo对象向ottvideo对象所发送的DOM事 件记为onPlay。则前述的流媒体视频播放过程即为:OTTVideo对象通过异步方式向 本地组件请求流媒体视频的播放链接,本地组件准备好播放链接后,回调WebCore 中的OTTVideo对象,参数为含有播放链接URL的字符串;接着,WebCore中的 OTTVideo对象需要将该播放链接以DOM事件的形式(即事件onPlay)发送给 JavaScript端的ottvideo对象,参数为命名src,参数类型是一个字符串。
参考图2,本发明的方法包括:
步骤1、扩展以onPlay命名的事件
按照WebCore中DOM事件的命名方式,扩展自定义JavaScript事件的名称,方 便包含有JavaScript脚本的Web页面中使用该事件;具体的说,扩展以onPlay命名 的事件的方式如下:在WebCore/dom/EventNames.h文件的#define DOM_EVENT_NAMES_FOR_EACH(macro)宏中加入macro(Play)声明onPlay这个 事件。
步骤2、扩展ottvideoevent对象实例
按照WebCore中JavaScript对象的创建方式,创建JavaScript事件对象实例。创 建JavaScript事件对象实例包括:扩展WebCore中OTTVideo对象的特有事件,所得 到的JavaScript事件对象命名为ottvideoevent,在WebCore中与该JavaScript事件对 象对应的C++类命名为OTTVideoEvent;在扩展时,还需要在OTTVideoEvent.idl中 声明JavaScript对象ottvideoevent继承Event对象,并且定义了ottvideoevent的一个 只读属性:src;在WebCore中的OTTVideoEvent类则继承WebCore中的Event类, 实现了src属性的getter方法。
ottvideoevent对象实例经扩展后,当本地组件需要向页面发送消息时,本地组件 将消息的内容发给WebCore的JavaScript事件对象ottvideoevent。
步骤3、将OTTVideo对象扩展为EventTarget
将对象OTTVideo扩展为EventTarget。参考图3,将OTTVideo扩展为EventTarget 可通过由OTTVideo继承EventTarget实现。在图3中,三角形表示继承关系;菱形 表示组合关系;黑色菱形表示组合关系,并且声明周期一致;虚线箭头表示调用关 系。
在扩展时,还需要将onPlay事件声明为ottvideo对象的一个属性。具体的说, 在OTTVideo.idl中,将onPlay声明为ottvideo对象的一个属性,声明方法如下:
attributeEventListeneronPlay;
这样,在Web网页中就可用过DOM0级别的事件模型为ottvideo对象注册事件 监听函数。
WebCore中的OTTVideo类作为事件的发起者,说明OTTVideo是一种 EventTarget,所以OTTVideo应该继承EventTarget。同时,在OTTVideo类中应该定 义onPlay事件监听函数的setter和getter方法,因为EventTarget中已经定义了一个 给事件注册setter和getter方法的宏,我们直接使用这个宏即可,方法如下:
DEFINE_ATTRIBUTE_EVENT_LISTENER(Play);
当OTTVideo被本地组件回调时,应该发起onPlay事件,所以在扩展时还需要 实现一个创建并发起onPlay事件的函数fireEvent()。值得注意的是,WebCore中的 DOM事件处理必须在浏览器的主线程进行,本申请实现时,采用Socket回到浏览器 主线程,并在主线程中创建并发起onPlay事件。
在本步骤中,将事件对象扩展为EventTarget之后,事件对象就进入了WebCore 的DOM模型中的事件控制流中。当本地组件异步调用JavaScript代码时,WebCore 会利用自身的事件分发机制,传递事件给V8引擎(JavaScript引擎的一种),然后, V8引擎会触发相应的EventListener,以响应事件。其中,EventListener包含在 EventTarget中,它是发生事件的处理函数。
步骤4、将WebCore中的事件封装为V8事件。
将WebCore中的事件对象通过binding模块封装为V8可以识别的对象,这样可 以实现事件对象和JavaScript代码的交互。
具体的封装过程如下:
在OTTVideo的基类EventTarget中加入OTTVideo的getter方法,该方法为虚函 数,同时在派生类OTTVideo中重写该方法,返回OTTVideo的this指针。
同样,在WebCore中的Event类中加入判断事件类型的isOTTVideoEvent方法, 该方法同样是虚函数,在Event的派生类OTTVideoEvent中重写该方法。这样就可 以通过isOTTVideoEvent识别出来OTTVideoEvent,方便OTTVideo的事件发生时, 触发OTTVideo的事件监听器。
在Source/WebCore/bindings/v8/custom/V8EventCustom.cpp的函数toV8()中(此 函数将WebCore中的Event封装为V8Event),加入Event的类型判断:
if(impl->isOTTVideoEvent()){
returntoV8(static_cast<OTTVideoEvent*>(impl));
}
在V8Event中,voV8函数将WebCore中的Event封装为V8的数据格式,返回 给V8引擎。
步骤5、编译。
编译WebCore和V8,将支持扩展过的JavaScript事件的模块部署到应用环境中。
在Android源码external/webkit目录下编译,生成libwebcore.so动态库。
参考图4,经本发明的方法对本地组件做扩展后,本地组件与Web页面间的通 信过程如下:本地组件通过onPlay方法回调WebCore中的OTTVideo对象,在 WebCore中通过socket回到浏览器主线程,OTTVideo创建OTTVideoEvent对象,然 后通过fireEvent发起事件,通过dispatchEvent分发事件,然后调用fireEventListener 调用V8AbstractEvenListener中的handleEvent方法调用监听函数,接着在V8Event 中调用toV8方法将事件转换为V8中的事件,最后调用invokeEventHandler来调用 实际的监听函数。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管 参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明 的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均 应涵盖在本发明的权利要求范围当中。
机译: 在分布式数据网格中支持异步调用的系统和方法
机译: 在分布式数据网格中支持异步调用的系统和方法
机译: 在分布式数据网格中支持异步调用的系统和方法