初入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的连拍功能)。
- 初入firefox的大门(学习webidl的趣谈)
- 初入Csdn的大门
- 初入代码的领域,打开编程的大门
- 初入linux大门
- 轻松垮入移动应用程序开发的大门
- 辛兴涛老师讲 windows 8 初步认识 及html5的 vs工具涉入 (2) 之 html5 初入大门
- 初入C++大门第一天
- 初入android和HTML+js大门
- 【Firefox】【kaios】如何添加一个webidl
- 迈进程序员的大门
- 迈进程序员的大门
- 走进ReactiveCocoa的大门
- 推开HTML5的大门
- 【bzoj2163】复杂的大门
- 打开新世界的大门
- 迈进算法的大门
- 《“计算机的功能”趣谈》
- 趣谈软件产品的一生
- 数据读写分离
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别
- HDU 6184 && 2017广西邀请赛:Counting Stars(三元环)
- Unity 二维数组的转置
- Java数据类型
- 初入firefox的大门(学习webidl的趣谈)
- 新手之hibernate配置(hibernate.cfg.xml)
- UGUI 进度条拉伸解决
- 算法-时间复杂度分析
- ArcGIS低版本切片迁移到高版本(或相同版本迁移)
- 算法分析与时间复杂度
- 欢迎使用CSDN-markdown编辑器
- HAL向上层提供接口的分析
- mysql包含二进制字段的数据导出导入及可能遇到的问题