日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

chromium kernel資源加載、解析、三樹合成淺析(chromium39)

 wusiqi111 2019-05-05

https://blog.csdn.net/u011882998/article/details/44493605


        每次嘗試去看看chromium kernel中具體邏輯的實現(xiàn)的時候,都會費一些時間去看代碼,找邏輯。當(dāng)然了,網(wǎng)上很多資料可以參看,但是每次看完這些資料,我都會要問一問:確實如此么?新版本的kernel是否這塊邏輯更改了呢?

       所以,為了讓自己釋惑,還是要親自去看源碼,一點點查看調(diào)用堆棧。然后再能在整體上理解下kernel的原理。

      最近了看了看chromium kernel中,blink kernel part的網(wǎng)頁的加載、html解析、以及三樹(Dom tree、 Render Tree、Render Layer Tree)合成的邏輯。在這里總結(jié)下,以后有時間繼續(xù)深入研究下。

>> chromium kernel 與blink kernel概念差異

     剛接觸到chromium項目的同學(xué),往往有個疑惑,瀏覽器內(nèi)核中,chromium kernel 和blink kernel有什么區(qū)別呢?

    首先,要解釋下,blink(webkit的google分支),是渲染內(nèi)核,它是chromium kernel的一部分。提供了網(wǎng)頁的加載、解析、渲染的基本機制,并提供port供不同的瀏覽器內(nèi)核去實現(xiàn)。

     而chromium kernel是一個瀏覽器內(nèi)核,瀏覽器內(nèi)核是對blink的一層封裝與擴展再實現(xiàn),chromium kernel不僅僅要提供網(wǎng)頁的加載、解析、渲染功能,還有提供tab的前進(jìn)、后退、刷新;多tab管理;歷史記錄與書簽;各個回調(diào)接口等等諸多工作。并且可以再實現(xiàn)blink kernel的一些功能,比如渲染等等。

   故總結(jié)一句:blink kernel是chromium kernel的 heart part。

>>加載

    前面的blog中,總結(jié)了網(wǎng)頁加載中住資源的下載邏輯。這里不再贅述。

    總結(jié)一點:網(wǎng)頁資源的加載是分步的、多線程的。

    加載過程,從加載主資源開始,然后將整個主資源下載完畢之后,形成一個字符串(或者幾個字符串),然后解析,形成dom樹,此時遇到需要加載的標(biāo)簽,比如img、srcipt等,就啟動相應(yīng)的子資源加載過程

>>dom 解析

   主資源下載下來,是字符串的形式存在,然后將該字符串進(jìn)行標(biāo)簽化。具體的解析語法可以參看網(wǎng)上文章

   DOM樹創(chuàng)建之后,Render Tree 及RenderLayer Tree并行創(chuàng)建的,他們的創(chuàng)建與子資源的加載是并行的。

>>三顆樹相應(yīng)關(guān)系

      Dom樹到RenderTree的解析過程,可以參看文章:網(wǎng)上文章

      Dom樹的合成中,HTMLTreeBuilder.cpp是關(guān)鍵對象。其中方法:HTMLTreeBuilder::constructTree是將上一步中解析到的所有token,進(jìn)行dom樹的構(gòu)建。

    這里貼出從網(wǎng)頁的字符串到dom樹的構(gòu)建堆棧:

  1. W/WebKit ( 7420): BackgroundHTMLParser::appendDecodedBytes

  2. W/WebKit ( 7420): BackgroundHTMLParser::pumpTokenizer()

  3. W/WebKit ( 7420): BackgroundHTMLParser::sendTokensToMainThread()

  4. W/WebKit ( 7420): BackgroundHTMLParser::pumpTokenizer()

  5. W/WebKit ( 7420): HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser

  6. W/WebKit ( 7420): HTMLDocumentParser::pumpPendingSpeculations()

  7. W/WebKit ( 7420): HTMLDocumentParser::processParsedChunkFromBackgroundParser

  8. W/WebKit ( 7420): HTMLDocumentParser::constructTreeFromCompactHTMLToken

  9. W/WebKit ( 7420): HTMLTreeBuilder::constructTree

     Dom樹的節(jié)點是Node類。關(guān)于節(jié)點的類型及子類的繼承等邏輯關(guān)系,可以自己查看下代碼。

     RenderTree的根節(jié)點是RenderView類,其中的各個節(jié)點是RenderObject。關(guān)于RenderTree中的各個節(jié)點,可以自己查看下代碼,對于RenderObject有好多的子類。

    RenderTree的構(gòu)建中,會創(chuàng)建多個RenderTreeBuilder對象。

    RenderLayerTree的節(jié)點是RenderLayer對象

   

   這里貼出部分從renderLayer的形成邏輯:

  1. W/WebKit ( 5275): Element::attach

  2. W/WebKit ( 5275): RenderTreeBuilder::RenderTreeBuilder

  3. W/WebKit ( 5275): RenderTreeBuilder::createRendererForElementIfNeeded()

  4. W/WebKit ( 5275): RenderObject::setStyle

  5. W/WebKit ( 5275): RenderBlock::styleDidChange

  6. W/WebKit ( 5275): RenderLayerModelObject::styleDidChange

  7. W/WebKit ( 5275): RenderLayerModelObject::createLayer

  8. W/WebKit ( 5275): RenderLayer::RenderLayer

    RenderLayer Tree是最后顯示網(wǎng)頁的重要組件。

   對于這三棵樹形成過程,分析可以參看下blog:網(wǎng)上文章

   之后,有時間的話,去從這里開始深入看看網(wǎng)頁的渲染邏輯。 

    blink kernel對網(wǎng)頁的下載、解析及三棵樹的合成邏輯也比較復(fù)雜,細(xì)節(jié)上的東西比較多。這里只是總結(jié)了下我最近看這塊代碼的邏輯。以后有時間的話,還要深入研究下這塊??纯慈绾卧趦?nèi)核中去操作dom樹(節(jié)點的增加,或者刪除)等等

    本站是提供個人知識管理的網(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ā)表

    請遵守用戶 評論公約

    類似文章 更多