一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

WebKit內(nèi)核源代碼分析(五)

 My鏡像站 2011-12-26

摘要:本文分析WebKithtml的解析過程,DOM節(jié)點樹的建立。

關(guān)鍵詞:WebKit,html解析,html tree construction,WebCore,

DOM節(jié)點樹,dlmu2001

1.    HTML解析模型

                                                                               

1 HTML解析模型圖

上圖是HTML解析模型圖,HTML解析分成TokeniserTree Construction兩個步驟,在”WebKit中的html詞法分析

(http://blog.csdn.net/dlmu2001/archive/2010/11/09/5998130.aspx)一文中,我們已經(jīng)對Tokeniser這一步進(jìn)行了分析,本文的目標(biāo)是Tree Construction這一步。

Tree Construction輸入是token流,輸出是DOM節(jié)點樹。

2.    DOM

HTML DOM定義了一套標(biāo)準(zhǔn)來將html文檔結(jié)構(gòu)化,它定義了表示和修改文檔所需的對象、這些對象的行為和屬性以及對象之間的關(guān)系,可以把它理解為頁面上數(shù)據(jù)和結(jié)構(gòu)的一個樹形表示。

NodeDOM模型中的基礎(chǔ)類,它可以分成13類(見NodeType),在HTML解析中,最常見的是DocumentElement,Text三類。

l  Document是文檔樹的根節(jié)點,在HTML文檔中,他派生為HTMLDocument

l  在文檔中,所有的標(biāo)簽轉(zhuǎn)化為Element類,一般它有標(biāo)簽名,并根據(jù)標(biāo)簽名繼承為特定的子類。

l  Element之間的原始文本轉(zhuǎn)化成Text類。

以一個簡單的html頁面為例:

<html>

<head>

<title>test</title>

</head>

<body>

<h1>hl1</h1>

<h2>hl2</h2>

<h3>hl3</h3>

</body>

</html>

經(jīng)過解析后的節(jié)點樹如下(忽略換行符):


2 HTML DOM節(jié)點樹示例

如果沒有忽略換行符,則每個換行符就是一個Value”\n”Text節(jié)點。

3.    Tree Construction原理

將圖二中的節(jié)點樹以WebKit中的類具體化(同樣忽略換行符)。

3 Webkit HTML DOM節(jié)點樹示例

看到這里,你是不是覺得仿佛看到了一個呼之欲出的Tree Construction輪廓?是的,最簡化的情況就是這樣,根據(jù)輸入的token,創(chuàng)建出相應(yīng)的Element派生類,然后添加到DOM樹中合適的位置,這就是Tree Construction干的事情。當(dāng)然,添加到合適的位置,這個需要一系列復(fù)雜的規(guī)則,另外,WebKitRender樹的創(chuàng)建也放到了Tree Construction階段中來,再加上CSS,Javascript,所以,這就是你看到的復(fù)雜的代碼。

放出兩個函數(shù)原型,熱熱身,培養(yǎng)培養(yǎng)感情。

  1. PassRefPtr<Element> HTMLConstructionSite::createHTMLElement(AtomicHTMLToken& token);  
  2.   
  3. void HTMLConstructionSite::insertHTMLElement(AtomicHTMLToken& token);<span style="color:#595959;FONT-SIZE: 12pt"> </span>  

Tree Construction流程由一個狀態(tài)“Insertion Mode”進(jìn)行控制,它影響token的處理以及是否支持CDATA部分,HTML5中給出了詳細(xì)的規(guī)則(http://www./specs/web-apps/current-work/multipage/parsing.html#the-insertion-mode)。它也控制了在特定狀態(tài)下能夠處理的token,比如在head里面,再出現(xiàn)head標(biāo)簽,顯然是不應(yīng)該處理的。

4.    開放元素堆棧

為了維護(hù)即將解析的標(biāo)簽同已解析的標(biāo)簽之間的關(guān)系(此時即將解析的標(biāo)簽還沒有加入到DOM樹中),引入了開放元素堆棧m_openElements,初始狀態(tài)下,這個堆棧是空的,它是向下增長的,所以最上面的節(jié)點是最早加入到堆棧中的,在html文檔中,最上面的節(jié)點就是html元素,最底部的節(jié)點就是最新加入到堆棧中的。Tree Builder的時候,每碰到一個StartTagtoken,就會往m_opnElements中壓棧,碰到EndTagtoken,則出棧。像Character這樣的token,則不需要進(jìn)行壓棧出棧的動作,只有可以包含子節(jié)點的tag,才做壓棧出棧的動作。Html5的文檔中對開放元素堆棧也有說明,http://www./specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements。

對于正在解析的token,除了根節(jié)點html,它必然是堆棧底部元素(m_openElements.top())的子節(jié)點,所以在形成DOM樹的時候,就可以通過ContainerNode::parserAddChild這樣的接口加入到DOM節(jié)點樹中。

除了正常的堆棧和壓棧,對于html,head,body元素,棧結(jié)構(gòu)(HTMLElementStack)中有專門的成員m_htmlElement,m_headElement,m_bodyElement記錄,主要是用于檢錯糾錯處理。

在本文的html范例中,當(dāng)解析到<h2>hl2</h2>hl2這個charactertoken的時候,它的開放元素堆棧如下,HTMLHeadingElement是堆棧的top,所以它是hl2這個Text節(jié)點的parent。

4 開放元素堆棧示例

此時的DOM節(jié)點樹如下:

5 Webkit DOM節(jié)點數(shù)示例

5.    元素的創(chuàng)建

HTMLElementFactory類提供了元素的創(chuàng)建方法createHTMLElement。傳入為對應(yīng)的標(biāo)簽名,所屬的document,所屬的form(如果屬于form),在parser的時候,最后一個參數(shù)為true。

  1. PassRefPtr<HTMLElement> HTMLElementFactory::createHTMLElement(const QualifiedName& qName, Document* document, HTMLFormElement* formElement, bool createdByParser);  

HTMLElementFactory中,通過一個Hash Maptag name和對應(yīng)的元素構(gòu)造函數(shù)對應(yīng)起來(gFunctionMap)。tag一般對應(yīng)一個派生于HTMLElement的類。如下是HTMLHeadingElement的類層次結(jié)構(gòu)圖。

6 HTMLHeadingElement類層次圖

6.    其它

HTMLConstructionSite::attach中的attach一詞,地瓜理解主要是attachDOM節(jié)點數(shù)上,當(dāng)然,它同時調(diào)用了Element::attachElement類的attach主要是attachRender樹上,它會創(chuàng)建對應(yīng)該ElementRendrObject

除了m_openElements,HTMLConstructionSite同時維護(hù)了Format 元素列表m_activeFormattingElements,Formating元素就是那些格式化標(biāo)簽,包括a,b,big,code,em,font,I,fot,I,nobr,s,small,strike,strong,tt,u。為了處理這些Formatting元素的嵌套關(guān)系(此時它們可能不是父子關(guān)系,而是平級,不加入到m_openElements),HTML5引入了這個列表(http://www./specs/web-apps/current-work/multipage/parsing.html#list-of-active-formatting-elements)。

使用gdb調(diào)試的童子,可以運行Tools/gdb/webkit.py腳本,在print結(jié)構(gòu)體的時候得到易于理解的表示,還可以打印出節(jié)點樹,具體參考http://trac./wiki/GDB。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩人妻毛片中文字幕| 色丁香之五月婷婷开心| 好吊妞视频免费在线观看| 亚洲精品深夜福利视频| 欧美亚洲91在线视频| 亚洲综合日韩精品欧美综合区| 日韩欧美国产三级在线观看| 日本在线高清精品人妻| 麻豆tv传媒在线观看| 免费特黄欧美亚洲黄片| 国产欧美日本在线播放| 青青操视频在线观看国产| 综合久综合久综合久久| 亚洲国产av精品一区二区| 黑丝袜美女老师的小逼逼| 亚洲第一区二区三区女厕偷拍| 婷婷色网视频在线播放| 亚洲婷婷开心色四房播播| 国产精品色热综合在线| 日本高清一道一二三区四五区| 欧美一区二区黑人在线| 欧美一区二区三区视频区| 国产熟女一区二区不卡| 欧洲一级片一区二区三区| 日韩特级黄片免费在线观看| 老司机精品在线你懂的| 99久久精品午夜一区二区| 日本免费一区二区三女| 美女露小粉嫩91精品久久久 | 暴力三级a特黄在线观看| 亚洲免费视频中文字幕在线观看| 久热人妻中文字幕一区二区| 欧美日韩国内一区二区| 欧美大胆美女a级视频| 国产欧美一区二区久久 | 日韩午夜老司机免费视频| 婷婷开心五月亚洲综合| 在线观看视频成人午夜| 欧美激情床戏一区二区三| 九九热最新视频免费观看| 久久亚洲成熟女人毛片|