什么是JavaScript Binding?
在html页面中,我们可以通过JavaScript语句来访问DOM节点,例如document.createElement(“canvas”); 可是document所指向的对象HTMLDocument存在于WebKit中,通过C++实现的,并不存在于JavaScript的引擎中,所以如果想要在web页面中也能通过JavaScript来访问webkit定义的对象,这就需要把WebKit中的对象注入到JavaScript引擎中,而JavaScript引擎中对象的表示方式与WebKit中对象的表示方式存在差别,就需要存在一种方式,把WebKit中的对象转换成JavaScript引擎能识别的对象,这一过程就称为JavaScript Binding。例如以V8引擎为例,HTMLDocument --> V8HTMLDocument --> v8::Object.
在Google开发Blink(来自于WebKit)以前,WebKit存在两种JavaScript引擎,即v8和JSC(JavaScriptCore)。v8是由Google公司开发的,应用在Chrome和Android原生浏览器中。JSC是有Apple公司开发,应用Safari中。那么WebKit中也同样存在两种相对应的JavaScript Binding,即JSC Binding和v8 binding。除了JavaScript Binding之外,WebKit中还存在一些其他的语言binding,例如Objective-C binding, GObject binding和CPP binding。Objective-Cbinding让JavaScript可以访问Objective-C的对象和方法,GObject binding存在于GTK中。
JavaScript Binding如何工作?
如果需要把WebKit中实现的DOM对象或HTML5对象暴露给JavaScript,让web开发者在JavaScript中能够访问,就需要在WebKit中为每个对象实现相应的JavaScript Binding文件,以v8引擎为例,我们需要为HTMLDocument对象实现一个V8HTMLDocument的对象,目的是转化HTMLDocument对象为v8::Object。只是WebKit中的DOM对象如此庞大,再加上后续添加的HTML5对象,如果需要为每个对象都亲自完成一个cpp文件实现一个相应的转换类,工作量是可想而知的。WebKit为了解决上述问题,编写了一套工具,可以让WebKit在编译时自动生成相应的binding文件,省去了开发者重复劳动的麻烦。
在介绍binding工具之前,首先介绍一个Web IDL。Web IDL是W3C Web工作组为了定义Web接口定义的一套标准接口,全称为Web Interface Description Language. 如果浏览器需要实现某项新功能,一般的流程是W3C委员会先讨论该功能,并给出该功能的接口定义,也就是Web IDL,然后各个浏览器厂商来实现该接口,这样就能最大程度的保证各个浏览器的兼容性,才不至于Web开发者采用标准接口开发的Web网页或应用程序只能在某个特定浏览器上运行。
这里给一个Web IDL的简单实例:
interface WebSocket { readonlyattribute DOMString URL; // WebSocket对象的只读属性; [RaisesException]void send(ArrayBuffer data); // WebSocket的send方法,当WebSocket对象的状态不正确时可能会抛异常。 ...; };
那么binding工具的工作就是把这个Web IDL翻译成相应的cpp文件。
JavaScript Binding自动化工具
WebKit中的binding自动化脚本通过perl语言编写,具体流程如下: