《JAVASCRIPT中调用二进制组件的方法.pdf》由会员分享,可在线阅读,更多相关《JAVASCRIPT中调用二进制组件的方法.pdf(10页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 (43)申请公布日 (21)申请号 201310367174.7 (22)申请日 2013.08.21 G06F 9/44(2006.01) (71)申请人 上海科泰世纪科技有限公司 地址 201203 上海市张江高科技园区碧波路 177 号华虹科技园 C 区 4 层 (72)发明人 贾靖 陈冬晓 宋宇培 (54) 发明名称 Javascript 中调用二进制组件的方法 (57) 摘要 本发明提供一种 Javascript 中调用二进 制组件的方法, 该方法包括 : Javascript 引擎获 取 Javascript 语句中的字符串并判定是否为 Javascript语言。
2、节点 ; 若不是Javascript语言节 点, 则 Javascript 引擎的异常拦截器拦截并获取 该字符串 ; 从二进制组件的加载路径中查询是否 存在该字符串对应的二进制组件 ; 创建该字符串 对应的二进制组件对象并封装为 Javascript 对 象。 该方法实现在Javascript脚本解析执行过程 中根据需要灵活加载二进制组件。 (51)Int.Cl. (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书1页 说明书5页 附图3页 (10)申请公布号 CN 104423932 A (43)申请公布日 2015.03.18 CN 104423932 A 1/1 页 。
3、2 1. 一种 Javascript 中调用二进制组件的方法, 应用于 Javascript 引擎中, 其特征在 于, 该方法包括以下步骤以 Javascript 引擎的异常拦截方式实现调用二进制组件 : 判定步骤 : Javascript 引擎获取 Javascript 语句中的字符串并判定该字符串是否为 Javascript 语言节点 ; 拦截步骤 : 若该字符串不是 Javascript 语言节点, Javascript 引擎的异常拦截器拦截 并获取该字符串 ; 检索步骤 : 从二进制组件的加载路径中查询是否存在该字符串对应的二进制组件 ; 创建步骤 : 当二进制组件的加载路径中存在与该。
4、字符串对应的二进制组件时, 创建该 字符串对应的二进制组件对象并封装为 Javascript 对象。 2. 如权利要求 1 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 包括 : 当判定 Javascript 语句中的字符串为 Javascript 语言节点, Javascript 引擎解释 并执行该 Javascript 语句。 3. 如权利要求 1 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 包括 : 当二进制组件的加载路径中未查询到该字符串对应的二进制组件时, Javascript 引 擎进行异常报错处理。 4. 如权。
5、利要求 1 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 以 XPCOM 组件封装二进制组件的方式实现调用二进制组件, 包括以下步骤 : 注册步骤 : 注册一个封装所有二进制组件的 XPCOM 组件 ; 重写步骤 : 重写该 XPCOM 组件创建对象的方法 ; 判定步骤 : 当 Javascript 引擎调用 XPCOM 组件对象的方法时, 若调用方法的对象为上 述 XPCOM 组件封装的二进制组件创建的对象, 则使用二进制组件内部自建的方法调用该对 象的方法, 若调用方法的对象为标准 XPCOM 组件创建的对象, 则调用 XPCOM 的标准 Call 方 法。
6、调用该对象的方法。 5. 如权利要求 1 或 4 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 当 调用的二进制组件为 CAR 组件, 在 Javascript 脚本中使用 CAR 组件的回调机制, 实现在 Javascript 中回调函数的同步和异步回调。 6. 如权利要求 5 所述的 Javascript 中调用二进制组件的方法, 其特征在于, 该方法还 包括 : 当调用的二进制组件为 CAR 组件, Javascript 引擎在初始化时, 创建一个回调执行线 程执行回调事件的回调函数。 7. 如权利要求 6 所述的 Javascript 中调用二进制组件的方法, 。
7、其特征在于, 当调用 CAR 组件对象的方法而触发回调事件时, 该回调事件的回调函数的执行过程为 : 当该回调事件属性为同步时, 若同步回调事件关联的回调函数为 Javascript 函数 则由 Javascript 引擎主线程直接执行该回调函数, 若同步回调事件关联的回调函数非 Javascript 函数则由回调执行线程执行该回调函数 ; 当该回调事件属性是异步时, Javascript 主线程发送该回调事件给回调执行线程, 回 调执行线程捕捉该异步回调事件, 若该异步回调事件关联的回调函数为 Javascript 函数, 则回调执行线程将该异步回调事件和回调函数打包并回抛给 Javascr。
8、ipt 引擎主线程, 若 该异步回调事件关联的回调函数非 Javascript 函数, 则由回调执行线程执行该回调函数。 权 利 要 求 书 CN 104423932 A 2 1/5 页 3 Javascript 中调用二进制组件的方法 技术领域 0001 本发明涉及 Javascript 中调用自定义组件的技术, 尤其涉及一种 Javascript 中 调用二进制组件的方法。 背景技术 0002 目前, 使用浏览器作为本地应用的平台已经有了广泛的实际应用, HTML/CSS 处理 页面显示和美化, Javascript 脚本处理页面逻辑。但是, Javascript 作为脚本语言存在一 定的。
9、先天局限性, 出于安全性方面的考量, Javascript 脚本不具备访问本地资源的能力, 对 于网络访问也受到同源策略 (Same Origin Policy) 的严格限制, 所以, 基于浏览器的应用 在获取外部资源和外部程序的支持时, 需要对浏览器进行额外的扩展, 目前多数浏览器通 过本地插件式扩展机制以扩展 Javascript 脚本的功能。 0003 实现Javascript脚本调用组件的可行策略是, 在Javascript引擎初始化时, 增加 一个组件的注册表, 将组件的所有信息全部注册到 Javascript 运行环境的全局变量中。但 是, 将组件所有信息在Javascript初始。
10、化时全部注册的话, 导致Javascript引擎初始化过 程耗时且内存占用量过大。 发明内容 0004 鉴于上述内容, 有必要提出一种 Javascript 中调用二进制组件的方法, 该方法可 以实现在 Javascript 脚本运行时灵活调用二进制组件以扩展 Javascript 脚本的功能。 0005 所述 Javascript 中调用二进制组件的方法, 包括步骤 : Javascript 引擎获取 Javascript 语句中的字符串并判定是否为 Javascript 语言节点 ; 若不是 Javascript 语 言节点, Javascript 引擎的异常拦截器拦截并获取该字符串 ; 。
11、从二进制组件的加载路径中 查询是否存在该字符串对应的二进制组件 ; 创建该字符串对应的二进制组件对象并封装为 Javascript 对象。 0006 相比于现有技术, 本发明所述 Javascript 中调用二进制组件的方法, 通过修改 Javascript 引擎的异常处理机制的方式, 使得在 Javascript 脚本运行时活加载二进制组 件。另外, 当调用的二进制组件为支持同步和异步回调的 CAR 组件, 在 Javascript 脚本中 调用该 CAR 组件对象的方法而触发回调事件时, 能够同步或是异步回调该回调事件的回调 函数。 附图说明 0007 图 1 是通过修改 Javascri。
12、pt 引擎的异常处理机制实现 Javascript 中调用 CAR 组 件的方法流程图。 0008 图 2 是一个 CAR 组件示例 FooBar 组件的的程序代码。 0009 图 3 是触发回调事件执行异步回调的示意图。 说 明 书 CN 104423932 A 3 2/5 页 4 具体实施方式 0010 本较佳实施例中以 CAR 组件作为二进制组件的示例进行说明, 本领域的技术人员 可以将该方法应用到其他二进制组件中, 以实现在 Javascript 中调用二进制组件。 0011 所述 CAR 组件 (Component Assembly Runtime) 是上海科泰世纪科技有限公司开 发。
13、的一种二进制组件, 该 CAR 组件技术是在 Elastos 平台上 (Elastos, 一种组件化操作系 统 ) 面向组件的编程模型, 规定了组件之间相互调用的标准, 并且二进制组件能够自我描 述。 0012 所述 CAR 组件采用 C+ 编写, 携带有元数据 (metadata), 通过该元数据 CAR 组件 可以实现反射机制。 该元数据是描述数据的数据, 对数据的抽象, 主要包括了数据的类型信 息, 例如CAR组件的模块信息、 接口信息、 类信息等数据, 且元数据与CAR组件的可执行代码 存储在一起, 是 CAR 组件的二进制描述。 0013 所述 CAR 组件的反射机制, 提供统一调用。
14、 CAR 组件内封装的所有接口的 Invoke 方 法, 形如 : Invoke(object_name, method_name, parameters) 以实现对 CAR 组件的统一封装。 例如, 在 Javascript 或是 C 语言的环境中调用某一 CAR 组件对象 foo 的方法 Bar( 例如 : foo.Bar(), 则在执行时通过反射机制调用 Invoke 方法 ( 例如 : Invoke(foo, Bar, Null), 实现了对 CAR 组件对象所有方法具体调用的封装。 0014 以上是对 CAR 组件的简单描述, 关于 CAR 组件的详细内容可参考 CAR 组件的使用 。
15、说明手册等。 0015 参阅图 1 所示, 是通过修改 Javascript 引擎的异常处理机制实现 Javascript 中 调用 CAR 组件的方法流程图。 0016 步骤 S01, Javascript 引擎获取 Javascript 语句中的字符串。 0017 Javascript 是一种解释执行的语言, 由浏览器的 Javascript 引擎解释执行。在 Javascript 中调用自定义组件时, 一般是在 Javascript 引擎初始化时预先注册自定义组 件, 使得在调用过程中能够将自定义组件正确解析执行。 而本较佳实施例中, 对Javascript 引擎的异常处理机制进行扩展,。
16、 以实现在 Javascript 脚本解析执行时根据需要灵活加载 CAR 组件。 0018 步骤 S02, 判定上述字符串是否为 Javascript 的标准语言节点, 若是则进入步骤 S03, 否则进入步骤 S04。 0019 例如, Javascript脚本中var foonew CFoo(), CFoo()为CAR组件中的一个类, CFoo() 在当前 Javascript 脚本的上下文 (Context) 中并未定义, Javascript 引擎无法执 行 new CFoo() 以创建 foo 对象, 此时, Javascript 引擎因该 CFoo() 不是 Javascript 标。
17、准 语言节点, 无法识别而抛出异常。 0020 步骤 S03, Javascript 引擎解释并执行该 Javascript 语句。 0021 步骤 S04, Javascript 引擎的异常拦截器进行拦截并获取该异常 ( 非 Javascript 的标准语言节点 ) 的字符串。 0022 接续上述举例, 当 Javascript 引擎抛出异常节点 CFoo(), 异常拦截器拦截并获取 异常的字符串或语言节点。 0023 步骤S05, 从CAR组件加载路径中查询是否存在该字符串对应的CAR组件, 若存在, 则进入步骤 S07, 否则进入步骤 S06。 说 明 书 CN 104423932 A 。
18、4 3/5 页 5 0024 步骤 S06, Javascript 引擎异常报错处理。 0025 当不存在该字符串对应的 CAR 组件, 该节点既不是 Javascript 的语言节点, 也不 是 CAR 组件, 则 Javascript 引擎无法识别该字符串, 无法解释执行, 则进行报错处理。 0026 步骤 S07, Javascript 引擎创建该字符串对应的 CAR 组件对象。 0027 步骤S08, 利用Javascript引擎的API(Application Programming Interface, 应 用程序接口 ) 将创建的 CAR 组件对象封装为 Javascript 对。
19、象返回到 Javascript 的运行环 境中。 0028 以上拦截 Javascript 引擎异常的方式实现 Javascript 中调用 CAR 组件, 根据 Javascript 脚本中调用组件的情形灵活加载 CAR 组件。 0029 在实际应用中, 当浏览器为 Mozilla 组织提供的浏览器 ( 例如 : Firefox 火狐浏览 器)或Javascript引擎为Mozilla组织所提供的SpiderMonkey, 还可以通过以XPCOM组件 形式接入 CAR 组件, 实现在 Javascript 脚本中调用 CAR 组件。 0030 所述 Mozilla 组织 (Mozilla, 。
20、哥斯拉 ) 是一个支持和领导开源的 Mozilla 项目而 设立的非盈利组织。所述 SpiderMonkey 是 Mozilla 项目的一部分, 是一个用 C 语言实现的 Javascript脚本引擎, 该引擎支持在Javascript脚本中调用XPCOM组件。 所述XPCOM(Cross Platform Component Object Model, XPCOM), 是Mozilla的跨平台组件对象模型, 类似微软 的 COM(Component Object Model, 组件对象模型 )。 0031 所述以 XPCOM 组件形式接入 CAR 组件, 通过以下步骤实现 : 0032 a)。
21、在Javascript引擎中注册封装所有CAR组件的一个XPCOM组件, 如注册一个名 为 elastos 的 XPCOM 组件 ; 0033 b) 重写上述的 XPCOM 组件 elastos 创建对象的方法 createInstance 方法, 例如, var foo elastos.createInstance(“path/class_name : version” ), 创建 elastos 封装 的某一个 CAR 组件的一个类对象 foo, createInstance 的参数为 “CAR 组件加载路径 / 类 名 : 版本号” ; 0034 c) 修改 Javascript 引擎中。
22、调用 XPCOM 组件对象的方法的 Call 方法, 在调用组件 对象的方法时增加一个判定, 若调用方法的对象是 elastos 创建的对象时, 则使用 CAR 组 件内部自建的 Invoke 方法调用该组件对象的方法 ; 若为其他标准 XPCOM 组件创建的对象 时, 则使用 XPCOM 组件的标准 Call 方法调用组件对象的方法。例如, 上述 CAR 组件的类对 象 foo, 在 Javascript 中执行 foo.doWork(), doWork() 为 foo 的一个方法, 若 foo 为标准 XPCOM组件创建的对象, 则Javascript引擎通过调用Call方法来调用执行do。
23、Work()方法 ; 若 foo 为 elastos 这个 XPCOM 组件创建的对象, 则 Javascript 引擎通过调用 CAR 组件内部 的 Invoke 方法来调用执行 doWork() 方法。 0035 需要说明, 上述 XPCOM 组件封装 CAR 组件的方式实现 Javascript 脚本中调用 CAR 组件, 具有一定局限性, 仅针对于 Mozilla 的浏览器。 0036 需要指出的是, Javascript 语法中对于回调的支持形式单一, 仅支持同步回调及 定时延迟回调, 并没有支持异步回调。基于上述两种不同方式实现 Javascript 脚本中调 用 CAR 组件的基。
24、础上 ( 拦截 Javascript 引擎异常或 XPCOM 组件封装 CAR 组件 ), 进一步在 Javascript脚本中使用CAR组件的回调机制, 实现在Javascript中对回调函数的同步和异 步回调。 说 明 书 CN 104423932 A 5 4/5 页 6 0037 结合图 2 所示的 CAR 组件示例 FooBar 组件的程序代码, 详细说明 Javascript 中 调用 CAR 组件的同步和异步回调机制。 0038 1) 修改 Javascript 引擎的异常处理机制或是注册 elastos 的 XPCOM 组件, Javascript 引擎初始化时创建 CAR 组件。
25、的回调执行线程。 0039 2) 在 Javascript 页面中创建 CAR 组件对象。 0040 形如 : 0041 var foobar new CFooBar() ; / 拦截异常方式调用 CAR 组件 0042 var foobar elastos.createInstance( 0043 “Com.Elastos.Components.Foobar.eco/CFooBar : 1” ) ; 0044 /XPCOM 形式调用 CAR 组件 0045 如图 2 所示, FooBar 组件中包括有一个名为 CFooBar 的类, 该类实现了接口 IFoo 和 IBar 的 Foo() 方。
26、法和 Bar() 方法, 其中, Foo() 方法中的代码 Callback : FooEvent() 是指在 Foo() 方法被调用执行时会触发异步回调事件 FooEvent, Bar() 方法中的代码 Delegate : : FooErrand()是指在Bar()方法被调用执行时会触发同步回调事件FooErrand。 0046 3) 在 Javascript 代码中定义回调事件的回调函数。 0047 形如 : 0048 0049 4) 关联注册回调事件和回调函数。 0050 形如 : 0051 foobar.addCallback(FooEvent, FooEventHandler) ;。
27、 0052 foobar.addCallback(FooErrand, FooErrandHandler) ; 0053 5)Javascript 脚本中调用 CAR 组件对象的方法而触发回调事件。 0054 形如 : 0055 foobar.Foo() ; /Foo 方法调用执行, 触发异步回调事件 FooEvent 0056 foobar.Bar() ; /Bar 方法调用执行, 触发同步回调事件 FooErrand 0057 Javascript 编程人员通过 CAR 组件的说明手册, 可以明确知道 CAR 组件所包括 的类、 方法及方法调用时触发的回调事件, 回调事件的属性是同步或是异。
28、步 (delegate 或 callback) 是由 CAR 组件的开发人员在开发时指定, 可以为编程人员所获悉。 0058 JavaScript 代码中的 foobar.Foo() 和 foobar.Bar() 的调用会触发定义的回 说 明 书 CN 104423932 A 6 5/5 页 7 调事件, 至于这个回调事件的属性是同步回调还是异步回调, 取决于调用的 CAR 组件方法 触发回调事件时所调用的是异步回调接口 (Callback : FooEvent) 还是同步回调接口 (Delegate : FooErrand)。 0059 6) 触发回调事件, 当该回调事件属性是同步时, 若该。
29、回调事件关联的回调函数 为 Javascript 函数则 Javascript 引擎主线程执行该回调函数, 若关联的回调函数非 Javascript 函数 ( 如 C 或 C+ 的函数 ) 则回调执行线程执行该回调函数 ; 当该回调事件属 性是异步时, 如图 3 示, Javascript 主线程发送该回调事件给回调执行线程, 回调执行线程 捕捉该回调事件, 若该异步回调事件关联的回调函数为 Javascript 函数, 则回调执行线程 将该异步回调事件以及回调函数打包并回抛给 Javascript 引擎主线程, 若关联的回调函 数非 Javascript 函数, 则回调执行线程执行该回调函数。
30、。 0060 以 FooEvent 该异步回调事件为例, 详细说明异步回调执行过程 : 如图 2 所示, CAR 组件中 Foo 方法是调用异步回调接口 Callback : FooEvent, 则该回调事件 FooEvent 为异 步事件 ; 如图 3 所示 Javascript 引擎主线程执行 foobar.Foo() 的方法调用, 该方法 Foo() 触发产生回调事件 FooEvent ; Javascript 引擎主线程将该异步回调事件发送给回调执行 线程 ; 回调执行线程接收该回调事件并进行处理 ; 若该回调事件的回调函数为 C 或 C+ 语 言编写, 则回调执行线程执行该回调函数 。
31、; 若该回调事件的回调函数为 Javascript 语言编 写, 则回调执行线程将该回调事件和关联的回调函数打包并回抛给 Javascript 引擎主线 程, Javascript 引擎主线程的消息队列接收回抛的回调事件并依序处理该回调事件的回调 函数。 0061 需要说明的是, 由于 Javascript 引擎限定所有 Javascript 代码必须由且仅由 Javascript 引擎主线程执行, 该限定使得当触发异步回调事件时, 虽 Javascript 引擎主线 程将该回调事件抛到回调执行线程中, 但是由于回调执行线程无法执行 Javascript 代码 的回调函数, 故只能将该回调事件重新回抛至 Javascript 引擎主线程。 0062 最后需要指出的是, 以上具体实施方式仅用于说明本发明的技术方案而非限制, 本领域的普通技术人员应当理解, 对本发明的技术方案进行等同替换或是修改, 都不应脱 离本发明技术方案的精神范围。 说 明 书 CN 104423932 A 7 1/3 页 8 图 1 说 明 书 附 图 CN 104423932 A 8 2/3 页 9 图 2 说 明 书 附 图 CN 104423932 A 9 3/3 页 10 图 3 说 明 书 附 图 CN 104423932 A 10 。