每次嘗試去看看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)建堆棧:
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的形成邏輯:
RenderLayer Tree是最后顯示網(wǎng)頁的重要組件。
對于這三棵樹形成過程,分析可以參看下blog:網(wǎng)上文章
之后,有時間的話,去從這里開始深入看看網(wǎng)頁的渲染邏輯。
blink kernel對網(wǎng)頁的下載、解析及三棵樹的合成邏輯也比較復(fù)雜,細(xì)節(jié)上的東西比較多。這里只是總結(jié)了下我最近看這塊代碼的邏輯。以后有時間的話,還要深入研究下這塊??纯慈绾卧趦?nèi)核中去操作dom樹(節(jié)點的增加,或者刪除)等等