Javascript中调用二进制组件的方法
【专利摘要】本发明提供一种Javascript中调用二进制组件的方法,该方法包括:Javascript引擎获取Javascript语句中的字符串并判定是否为Javascript语言节点;若不是Javascript语言节点,则Javascript引擎的异常拦截器拦截并获取该字符串;从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件;创建该字符串对应的二进制组件对象并封装为Javascript对象。该方法实现在Javascript脚本解析执行过程中根据需要灵活加载二进制组件。
【专利说明】Javascript中调用二进制组件的方法
【技术领域】
[0001] 本发明涉及Javascript中调用自定义组件的技术,尤其涉及一种Javascript中 调用二进制组件的方法。
【背景技术】
[0002] 目前,使用浏览器作为本地应用的平台已经有了广泛的实际应用,HTML/CSS处理 页面显示和美化,Javascript脚本处理页面逻辑。但是,Javascript作为脚本语言存在一 定的先天局限性,出于安全性方面的考量,Javascript脚本不具备访问本地资源的能力,对 于网络访问也受到同源策略(SameOriginPolicy)的严格限制,所以,基于浏览器的应用 在获取外部资源和外部程序的支持时,需要对浏览器进行额外的扩展,目前多数浏览器通 过本地插件式扩展机制以扩展Javascript脚本的功能。
[0003] 实现Javascript脚本调用组件的可行策略是,在Javascript引擎初始化时,增加 一个组件的注册表,将组件的所有信息全部注册到Javascript运行环境的全局变量中。但 是,将组件所有信息在Javascript初始化时全部注册的话,导致Javascript引擎初始化过 程耗时且内存占用量过大。
【发明内容】
[0004] 鉴于上述内容,有必要提出一种Javascript中调用二进制组件的方法,该方法可 以实现在Javascript脚本运行时灵活调用二进制组件以扩展Javascript脚本的功能。
[0005] 所述Javascript中调用二进制组件的方法,包括步骤:Javascript引擎获取 Javascript语句中的字符串并判定是否为Javascript语言节点;若不是Javascript语 言节点,Javascript引擎的异常拦截器拦截并获取该字符串;从二进制组件的加载路径中 查询是否存在该字符串对应的二进制组件;创建该字符串对应的二进制组件对象并封装为 Javascript对象。
[0006] 相比于现有技术,本发明所述Javascript中调用二进制组件的方法,通过修改 Javascript引擎的异常处理机制的方式,使得在Javascript脚本运行时活加载二进制组 件。另外,当调用的二进制组件为支持同步和异步回调的CAR组件,在Javascript脚本中 调用该CAR组件对象的方法而触发回调事件时,能够同步或是异步回调该回调事件的回调 函数。
【专利附图】
【附图说明】
[0007] 图1是通过修改Javascript引擎的异常处理机制实现Javascript中调用CAR组 件的方法流程图。
[0008] 图2是一个CAR组件示例FooBar组件的的程序代码。
[0009] 图3是触发回调事件执行异步回调的不意图。
【具体实施方式】
[0010] 本较佳实施例中以CAR组件作为二进制组件的示例进行说明,本领域的技术人员 可以将该方法应用到其他二进制组件中,以实现在Javascript中调用二进制组件。
[0011] 所述CAR组件(ComponentAssemblyRuntime)是上海科泰世纪科技有限公司开 发的一种二进制组件,该CAR组件技术是在Elastos平台上(Elastos,一种组件化操作系 统)面向组件的编程模型,规定了组件之间相互调用的标准,并且二进制组件能够自我描 述。
[0012]所述CAR组件采用C++编写,携带有元数据(metadata),通过该元数据CAR组件 可以实现反射机制。该元数据是描述数据的数据,对数据的抽象,主要包括了数据的类型信 息,例如CAR组件的模块信息、接口信息、类信息等数据,且元数据与CAR组件的可执行代码 存储在一起,是CAR组件的二进制描述。
[0013] 所述CAR组件的反射机制,提供统一调用CAR组件内封装的所有接口的Invoke方 法,形如:Invoke(object_name,method_name,parameters)以实现对CAR组件的统一封装。 例如,在Javascript或是C语言的环境中调用某一CAR组件对象foo的方法Bar(例如: foo.BarO),则在执行时通过反射机制调用Invoke方法(例如:Invoke(foo,Bar,Null), 实现了对CAR组件对象所有方法具体调用的封装。
[0014] 以上是对CAR组件的简单描述,关于CAR组件的详细内容可参考CAR组件的使用 说明手册等。
[0015] 参阅图1所示,是通过修改Javascript引擎的异常处理机制实现Javascript中 调用CAR组件的方法流程图。
[0016] 步骤S01,Javascript引擎获取Javascript语句中的字符串。
[0017]Javascript是一种解释执行的语言,由浏览器的Javascript引擎解释执行。在 Javascript中调用自定义组件时,一般是在Javascript引擎初始化时预先注册自定义组 件,使得在调用过程中能够将自定义组件正确解析执行。而本较佳实施例中,对Javascript 引擎的异常处理机制进行扩展,以实现在Javascript脚本解析执行时根据需要灵活加载 CAR组件。
[0018] 步骤S02,判定上述字符串是否为Javascript的标准语言节点,若是则进入步骤 S03,否则进入步骤S04。
[0019] 例如,Javascript脚本中varfoo=newCFoo(),CFoo()为CAR组件中的一个类, CFoo()在当前Javascript脚本的上下文(Context)中并未定义,Javascript引擎无法执 行newCFoo()以创建foo对象,此时,Javascript引擎因该CFoo()不是Javascript标准 语言节点,无法识别而抛出异常。
[0020] 步骤S03,Javascript引擎解释并执行该Javascript语句。
[0021] 步骤S04,Javascript引擎的异常拦截器进行拦截并获取该异常(非Javascript 的标准语言节点)的字符串。
[0022] 接续上述举例,当Javascript引擎抛出异常节点CFoo(),异常拦截器拦截并获取 异常的字符串或语言节点。
[0023] 步骤S05,从CAR组件加载路径中查询是否存在该字符串对应的CAR组件,若存在, 则进入步骤S07,否则进入步骤S06。
[0024] 步骤S06,Javascript引擎异常报错处理。
[0025] 当不存在该字符串对应的CAR组件,该节点既不是Javascript的语言节点,也不 是CAR组件,则Javascript引擎无法识别该字符串,无法解释执行,则进行报错处理。
[0026] 步骤S07,Javascript引擎创建该字符串对应的CAR组件对象。
[0027]步骤S08,利用Javascript引擎的API(ApplicationProgrammingInterface,应 用程序接口)将创建的CAR组件对象封装为Javascript对象返回到Javascript的运行环 境中。
[0028] 以上拦截Javascript引擎异常的方式实现Javascript中调用CAR组件,根据 Javascript脚本中调用组件的情形灵活加载CAR组件。
[0029] 在实际应用中,当浏览器为Mozilla组织提供的浏览器(例如:Firef〇X火狐浏览 器)或Javascript引擎为Mozilla组织所提供的SpiderMonkey,还可以通过以XPC0M组件 形式接入CAR组件,实现在Javascript脚本中调用CAR组件。
[0030] 所述Mozilla组织(Mozilla,哥斯拉)是一个支持和领导开源的Mozilla项目而 设立的非盈利组织。所述SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的 Javascript脚本引擎,该引擎支持在Javascript脚本中调用XPC0M组件。所述XPC0M(Cross PlatformComponentObjectModel,XPC0M),是Mozilla的跨平台组件对象模型,类似微软 的COM(ComponentObjectModel,组件对象模型)。
[0031] 所述以XPC0M组件形式接入CAR组件,通过以下步骤实现:
[0032] a)在Javascript引擎中注册封装所有CAR组件的一个XPC0M组件,如注册一个名 为elastos的XPC0M组件;
[0033]b)重写上述的XPC0M组件elastos创建对象的方法createlnstance方法,例如, varfoo=elastos.createlnstance( "path/class_name:version"),创建elastos封装 的某一个CAR组件的一个类对象foo,createlnstance的参数为"CAR组件加载路径/类 名:版本号";
[0034]c)修改Javascript引擎中调用XPC0M组件对象的方法的Call方法,在调用组件 对象的方法时增加一个判定,若调用方法的对象是elastos创建的对象时,则使用CAR组 件内部自建的Invoke方法调用该组件对象的方法;若为其他标准XPC0M组件创建的对象 时,则使用XPC0M组件的标准Call方法调用组件对象的方法。例如,上述CAR组件的类对 象foo,在Javascript中执行foo.doWork(),doWork()为foo的一个方法,若foo为标准 XPC0M组件创建的对象,则Javascript引擎通过调用Call方法来调用执行doWorkO方法; 若foo为elastos这个XPC0M组件创建的对象,则Javascript引擎通过调用CAR组件内部 的Invoke方法来调用执行doWorkO方法。
[0035] 需要说明,上述XPC0M组件封装CAR组件的方式实现Javascript脚本中调用CAR 组件,具有一定局限性,仅针对于Mozilla的浏览器。
[0036] 需要指出的是,Javascript语法中对于回调的支持形式单一,仅支持同步回调及 定时延迟回调,并没有支持异步回调。基于上述两种不同方式实现Javascript脚本中调 用CAR组件的基础上(拦截Javascript引擎异常或XPC0M组件封装CAR组件),进一步在 Javascript脚本中使用CAR组件的回调机制,实现在Javascript中对回调函数的同步和异 步回调。
[0037] 结合图2所示的CAR组件示例FooBar组件的程序代码,详细说明Javascript中 调用CAR组件的同步和异步回调机制。
[0038] 1)修改Javascript引擎的异常处理机制或是注册elastos的XPC0M组件, Javascript引擎初始化时创建CAR组件的回调执行线程。
[0039] 2)在Javascript页面中创建CAR组件对象。
[0040]形如:
【权利要求】
1. 一种Javascript中调用二进制组件的方法,应用于Javascript引擎中,其特征在 于,该方法包括以下步骤以Javascript引擎的异常拦截方式实现调用二进制组件: 判定步骤:Javascript引擎获取Javascript语句中的字符串并判定该字符串是否为 Javascript语言节点; 拦截步骤:若该字符串不是Javascript语言节点,Javascript引擎的异常拦截器拦截 并获取该字符串; 检索步骤:从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件; 创建步骤:当二进制组件的加载路径中存在与该字符串对应的二进制组件时,创建该 字符串对应的二进制组件对象并封装为Javascript对象。
2. 如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还 包括:当判定Javascript语句中的字符串为Javascript语言节点,Javascript引擎解释 并执行该Javascript语句。
3. 如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还 包括:当二进制组件的加载路径中未查询到该字符串对应的二进制组件时,Javascript引 擎进行异常报错处理。
4. 如权利要求1所述的Javascript中调用二进制组件的方法,其特征在于,该方法还 以XPCOM组件封装二进制组件的方式实现调用二进制组件,包括以下步骤: 注册步骤:注册一个封装所有二进制组件的XPCOM组件; 重写步骤:重写该XPCOM组件创建对象的方法; 判定步骤:当Javascript引擎调用XPCOM组件对象的方法时,若调用方法的对象为上 述XPCOM组件封装的二进制组件创建的对象,则使用二进制组件内部自建的方法调用该对 象的方法,若调用方法的对象为标准XPCOM组件创建的对象,则调用XPCOM的标准Call方 法调用该对象的方法。
5. 如权利要求1或4所述的Javascript中调用二进制组件的方法,其特征在于,当 调用的二进制组件为CAR组件,在Javascript脚本中使用CAR组件的回调机制,实现在 Javascript中回调函数的同步和异步回调。
6. 如权利要求5所述的Javascript中调用二进制组件的方法,其特征在于,该方法还 包括:当调用的二进制组件为CAR组件,Javascript引擎在初始化时,创建一个回调执行线 程执行回调事件的回调函数。
7. 如权利要求6所述的Javascript中调用二进制组件的方法,其特征在于,当调用 CAR组件对象的方法而触发回调事件时,该回调事件的回调函数的执行过程为: 当该回调事件属性为同步时,若同步回调事件关联的回调函数为Javascript函数 则由Javascript引擎主线程直接执行该回调函数,若同步回调事件关联的回调函数非 Javascript函数则由回调执行线程执行该回调函数; 当该回调事件属性是异步时,Javascript主线程发送该回调事件给回调执行线程,回 调执行线程捕捉该异步回调事件,若该异步回调事件关联的回调函数为Javascript函数, 则回调执行线程将该异步回调事件和回调函数打包并回抛给Javascript引擎主线程,若 该异步回调事件关联的回调函数非Javascript函数,则由回调执行线程执行该回调函数。
【文档编号】G06F9/44GK104423932SQ201310367174
【公开日】2015年3月18日 申请日期:2013年8月21日 优先权日:2013年8月21日
【发明者】贾靖, 陈冬晓, 宋宇培 申请人:上海科泰世纪科技有限公司