WebKit的JS Binding解析

WebCore與JavaScriptCore之間使用了Proxy模式,WebCore爲JSC提供了一層binding層做爲封裝。
Webkit參照W3C Web IDL(之前稱爲Language Bindings for DOM Specifications)描述DOM接口,但不完全相同。其完整的名稱爲WebKitIDL, 詳細的定義可以參考下面的鏈接:
 
每一個DOM組件除了實現文件外,都有一個IDL文件定義它的接口規格。可以在WebCore相關的目錄下找到。

 

WebKit提供了一組perl腳本完成IDL轉換功能。入口腳本爲generate-binding.pl, 示意圖如下:

 

生成的接口通過JSNode與Node關聯,從而實現了與DOM各組件的關聯。

 

JSDocument會在初始化時被JSGlobalObject的addStaticGlobals壓入一個jsNull到JSC的Heap, 在準備解析腳本前將一個對象通過JSDomWindowBase::updateDocument更新到JSC::Heap中,供JSC在執行期使用。Frame的setDocument方法也會在讀到腳本時被調用,以更新合適的document對象到JSC。

JavaScript以document爲接口,呼叫如getElementById獲取組件時, 其執行序列如下:

 

下面是jsDocumentPrototypeFunctionGetElementById的實現:

EncodedJSValue JSC_HOST_CALL jsDocumentPrototypeFunctionGetElementById(ExecState* exec)

{

    JSValue thisValue = exec->hostThisValue();

……

    JSC::JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(impl->getElementById(elementId)));

    return JSValue::encode(result);

}

*其中的impl就是通過JSNode接口關聯到的Document對象.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章