webkit的加載過程

類圖

類介紹
Frame
--包含FrameLoader

FrameLoader
--指針Frame
--指針FrameLoaderClient
--引用DocumentLoader
--引用DocumentLoader(provisional)
--引用DocumentLoader(policy)
--引用FrameNetworkingContext
--包含ResourceLoadNotifier
--包含FrameLoaderStateMachine

DocumentLoader
--包含DocumentWriter
--引用MainResourceLoader
--指針Frame
--引用ResourceLoaderSet(sub resource, multipart subresource, plugin streamloader)
--包含ResourceRequest(origin request)

FrameNetworkingContext
--繼承自NetworkingContext,不同的平臺有不同的實現
gtk使用soup實現

WebCore::FrameLoaderClient
--接口類,需要繼承實現
主要負責和客戶端通信等用途
如dispatchxxx等函數

MainResourceLoader
--繼承自ResourceLoader
--繼承自ResourceHandleClient
--引用DocumentLoader (指向當前frame loader的active document)
--引用Frame
--引用ResourceHandle
--MainResourceLoader只用於provisional的資源加載

CachedResourceLoader
--manages the loading of scripts/images/stylesheets for a single document
--使用CachedResourceHandle
--使用CachedResource
--CachedResourceLoader和ResourceLoader沒有聯繫
也沒有使用ResourceHandle(在soup方式下使用了相同的readcallback方式)

ResourceHandle
--不同平臺有不同的實現

DocumentWriter
--指針Frame
--引用DocumentParser
--引用TextResourceDecoder
--生成document

DocumentParser
--使用writer
##################################################################################################
加載網頁過程

FrameLoader包含三種DocumentLoader,有documentLoader,provisional document loader和policy document loader。
當點擊一個鏈接的時候,FrameLoader首先生成一個policy document loader,然後進行判斷是否應該繼續下去(使用一個專門的PolicyChecker來實現檢查,有很少的情況下不繼續,如空地址等)。如果繼續,則先清除provisional已有的document loader,再設置成policy的document loader,然後再清除policy的document loader;如果是不能繼續,則清除policy的document loader之後退出。
在provisional document loader設置之後,會創建MainResourceLoader。使用MainResourceLoader的好處是,將網絡響應和document的處理分開,生命週期也進行了解耦。
MainResourceLoader接收到數據後,在第一次調用callback函數時轉變了狀態爲commit狀態,這裏做了兩個重要的工作。一個是在FrameLoader::transitionToCommitted()中進行provisional document loader到documentLoader的轉換,轉換過程類似policy到privisional。另外一個是這裏還調用DocumentWriter生成了新的document對象(過程比較曲折,DocumnetLoader調用了FrameLoader成員client的committedLoad()方法,FrameLoaderClient又調用回到DocumentLoader,當第一次接受數據時生成document對象,並開始打開document對象)。不管如何,document終於粉墨登場了!
documentLoader當MainResourceLoader接收到最後的數據後,調用FrameLoader::finishedLoading(),並結束DocumentWriter的生成document,MainResourceLoader也完成了自己的使命。而當document解析中,還會產生一些新的http請求。
隨着MainResourceLoader和其他的一些http請求不斷的接收到數據,Html不斷的解析出來,在解析的過程中FrameView會不斷生成render對象,並設置成的isNonVisualEmpty屬性,並觸發FrameView的layout請求。在每次layout之後會有些post處理,如果沒有未解析的css,就會通知FrameLoaderClient進入NonEmptyLayout的狀態。這個是一個重要的狀態,意味着現在可以顯示界面了。

每當一個資源最後的數據結束的時候,都會引起FrameLoader檢查。如果所有的資源都加載完畢,就會觸發狀態轉變成最後的complete狀態,並通知client進入finished狀態。加載完畢。

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