首页> 中国专利> 支持异步调用的JavaScript事件扩展方法

支持异步调用的JavaScript事件扩展方法

摘要

本发明涉及一种支持异步调用的JavaScript事件扩展方法,该方法基于WebKit实现,包括:在WebCore内按照DOM事件的命名方式扩展JavaScript事件的名称;按照WebCore中JavaScript对象的创建方式创建JavaScript事件对象;将所创建的JavaScript事件对象扩展为EventTarget;将WebCore中的事件封装为V8中的事件对象;编译并部署动态库。

著录项

  • 公开/公告号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来调用 实际的监听函数。

最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管 参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明 的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均 应涵盖在本发明的权利要求范围当中。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号