初入firefox的大门(学习webidl的趣谈)

来源:互联网 发布:易考吧软件下载 编辑:程序博客网 时间:2024/06/11 09:34

这是我第一次写文章,不是很专业,还请多多关注,主要目的是对之前的东西的进行回顾,还是个新人。哈哈哈

基于基础的js的知识可以去w3school网站去学习,今天主要讲讲webidl的使用。

说实在的话,一开始遇到这个名词,我是拒绝的,根本不知道这是个什么东西。所以我就要弄清楚它的字面意思是什么?

a.Mozilla官方的WebIDL参考文章在这里:https://developer.mozilla.org/zh-CN/docs/Mozilla/WebIDL_bindings

b.字面上说WebIDL bindings在编译的时候通过WebIDL文件和一个配置文件生成,它们列出了将WebIDL映射到Gecko内部代码的一些元数据。相当于webidl是app层,gecko层和hal层建立联系之间的桥梁,补给站。

由于之前实习期间都是看camera模块,今天阿水就以camera的使用来扯扯webidl的使用:

刚接触项目时,需要对Firefox OS的Camera做一些修改(在当时自己还什么不明白)主要是增加一些feature实现。由于相对于Android来说, Firefox OS的接口太少,所以只能通过增加接口的方式实现。从整个功能实现的角度上来说,包含两部分:Gaia和Gecko之间的接口,以及Gecko和HAL之间的接口。这里的Gaia和Gecko之间的接口,也就是Camera的WebIDL接口的实现。

针对模块代码而言:

a.所有的WebIDL文件都放在dom/webidl目录下,并且会被加入到moz.build文件的列表中。

b.配置文件dom/bindings/Bindings.conf,是一个Python词典,它是接口名和接口描述之间的一个映射。

在camera模块里,目前增加接口,主要有两种情况:

(1).Gaia层直接调用Gecko层接口(2).Gaia层设置回调函数到Gecko层

接下来我就上面两种情况做一些操作的解释:可能很不专业。

针对第一种情况:

在gecko/dom/webidl/CameraControl.webidl 文件中增加接口,注意[Throws]是有意义的。
在gecko/dom/camera/DOMCameraControl.h 文件中增加WebIDL对应的函数声明。
在gecko/dom/camera/DOMCameraControl.cpp 文件中增加对应的函数实现。

对于WebIDL来说,到这部分工作已经完成了,具体到向下调用,需要修改ICameraControl.h、CameraControlImpl.h和CameraControlImpl.cpp等相关文件。
调用:在gaia层js中加入调用的代码,就能执行到gecko层。

说了这么多文字,显得有些空洞,我直接举上例子(如左图):


同理,第二种情况:

(1)在gecko/dom/webidl/CameraControl.webidl 文件中增加attribute和interface引用。

(2)增加interface绑定定义在gecko/dom/bindings/Bindings.conf文件中,用addExternalIface引入,注意nativeType就是本地interface类型。

(3)增加本地interface类型定义,修改gecko/dom/camera/nsIDOMCameraManager.idl ,可以参考nsICameraRecorderStateChange的写法,也就是里面的handleStateChange函数。
(4)在gecko/dom/camera/DOMCameraControl.h 文件中增加set/get函数声明,与WebIDL对应。

(5)在gecko/dom/camera/DOMCameraControl.cpp 文件中增加set/get函数实现。
(6)到这里WebIDL已经完成了,但以attribute这种回调函数而言,做到这里还没有意义,需要再增加handleStateChange函数的回调。

(7)在gecko/dom/camera/ICameraControl.h文件中增加虚函数定义,DOMCameraControl.cpp中的set/get函数实现会调到ICameraControl.h中的set/get函数。
(8)在gecko/dom/camera/CameraControlImpl.h 文件中增加对上面虚函数继承的定义。

(9)在gecko/dom/camera/CameraControlImpl.cpp文件中增加对上面虚函数继承的实现,以CameraRecorderStateChange为例,在CameraControlImpl.cpp里面会调用到它的HandleStateChange,也就会触发到Gaia层的onRecorderStateChange。

调用:在gaia层加上回调函数,再在gecko层通过某个消息回调,就能在gaia层收到回调。

例子如上图(右图)。

今天就主要胡扯这些,明天继续(用webidl实现Camera的连拍功能)。



原创粉丝点击