向FFOS添加webidl
webidl简介
Web IDL(Interface Definition Language,接口定义语言)该规范定义了一个OMG IDL 3.0的语法子集,用来规范定义的接口。Web IDL 是一个具有多种功能的IDL 变量,便于规范Web平台中的常用脚本对象的操作。
webidl xpidl ipdl 区别
webidl:接口定义文件后缀为.webidl,用于定义webapi,比如gecko/dom/webidl/FMRadio.webidl
xpidl:接口定义文件后缀为.idl,用于定义xpcom组件接口,比如gecko/dom/wifi/nsIWifi.idl
ipdl:接口定义文件后缀为.ipdl,用于定义进程间通信接口,帮助gecko中webidl接口的实现,比如gecko/dom/fmradio/ipc/PFMRadio.ipdl
Gecko内部使用最多的还是基于XPConnect上的DOM Bindings,使用ScriptableHelper来帮助把XPCOM组件暴露在JavaScript上,但这种方式有一些内存管理和速度上的缺点,并且XPIDL(XPCOM界面定义语言)与WebIDL(Web界面定义语言)在语义上有一定的不同,会使各种加速方法和处理语义问题的 Wrapper需要手工地针对不同API进行修改。 因为XPIDL的一些问题,Firefox OS里还提供一种DOM bindings的方法。由于这个问题是在法国巴黎首次讨论的,所以最早被称为“Paris Bindings”。因为这些DOM API实际上不使用XPCOM的许多功能,所以它的速度比原有的XPConnect会快许多。通过WebIDL DOM bindings可以省略掉一些虚函数的开销,还可以节省掉XPCOM处理线程安全的花费,透过新的JIT技术,从JavaScript可以调用DOM API,甚至直接调用C++的实现。未来描述DOM API的语言可能统一为WebIDL。 |
如何向ffos 添加JS 实现的webidl
1. 编写webidl文件
在gecko/dom/webidl 目录下面编写webidl文件
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ [JSImplementation="@mozilla.org/mytest;1", NavigatorProperty="mytest" ]
interface MyTest { DOMString sayHello(); }; |
‘@mozilla.org/mytest;1 ‘ contractname,之后和js实现绑定。
NavigatorProperty 设置为navigator的属性
2. 编写manifest文件
在gecko/dom/mytest/ 中创建 MyTest.manifest 文件。
在MyTest.manifest文件中,将webidl接口与javascript实现绑定。
MyTest.manifest 文件如下:
component {50CD146F-75EE-4C5E-88FA-FB3871362156} MyTest.js contract @mozilla.org/mytest;1 {50CD146F-75EE-4C5E-88FA-FB3871362156} |
定义 一个component,然后将其与 @mozilla.org/mytest;1绑定
3. 编写js 文件,MyTest.js
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); function MyTest(){ dump("zyt mytest constractor"); }
MyTest.prototype = { classDescription: "zyt test xpcom", classID: Components.ID("{50CD146F-75EE-4C5E-88FA-FB3871362156}"), contractID: "@mozilla.org/mytest;1", QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsISupports]), sayHello : function(){ dump("this is zyt test to say hello"); return"this is my first webidl test"; }, };
this.NSGetFactory= XPCOMUtils.generateNSGetFactory([MyTest]); |
4. 创建dom/mytest/moz.build 文件
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/.
EXTRA_COMPONENTS += [ 'MyTest.js', 'MyTest.manifest', ] |
注:该文件必须按字母序排列。否则编译出错。
5. 修改dom/moz.build文件
diff --git a/dom/moz.build b/dom/moz.build --- a/dom/moz.build +++ b/dom/moz.build @@ -81,6 +81,7 @@ PARALLEL_DIRS += [ 'webidl', 'xbl', 'xslt', + 'mytest', ]
if CONFIG['OS_ARCH'] == 'WINNT': |
6. 添加到Firefox OS
修改 gecko/b2g/installer/package-manifest.in
:
;my test @BINPATH@/components/MyTest.js @BINPATH@/components/MyTest.manifest |