Webkit之載入流程概述
之前寫了幾篇載入流程的說明,是從下向上看,有點只見樹木不見森林的感覺。經過最近一段時間的學習,有了能加以概括抽象的方法。
WebKit載入流程和頁面組成是直接相關的,頁面就是WebKit要載入的物件。所以WebKit負責載入的類也與負責頁面管理的類相對應。Apple關於WebView的說明裡清楚表現了頁面檢視上的MVC結構:
一個頁面從元素上也有其層次結構,並且和載入類對應,如下:
從頁面元素上講WebView代表了一個頁面的呈現,對應一個Page. 一個Page包含一個或多個Frame,其中一個稱為Main Frame,其它的Frame(iframe或object元素引入HTML)稱為Sub Frame。每一個Frame,從JavaScript裡都有一個window和document物件。
頁面中的Frame,Document和子資源,對應到載入的FrameLoader, DocumentLoader和SubresourceLoader。其中Frame可以進行導航(Navigation)操作,即載入、重新載入、前進、後退操作,而Document則表示一個具體的HTML文件,沒有導航操作。
從這裡看到的幾個Loaders都是載入的邏輯表示,實際的載入行為交給ResourceLoader(s),即MainResourceLoader和SubresourceLoader來完成,其中包括了資源載入的佇列管理操作(ResourceLoadScheduler)。
ResourceHandle在WebKit中是一個重要的port介面,與各個平臺的網路層適配,代表了一個具體的網路載入任務。
主要類的關係
FrameLoader載入時序
從上面可以知道FrameLoader代表了Frame的載入行為,DocumentLoader代表了Document的載入行為。為了區分載入的程序,FrameLoader對載入狀態進行了區分,並且讓DocumentLoader在不同的狀態間轉換。除此之外FrameLoader還另外使用一個狀態機,管理Frame載入顯示的狀態(FrameLoaderStateMachine)。
除此之此,FrameLoader還要維護歷史項(HistoryController),以對應處理Navigation操作, 詳細專案定義在FrameLoaderTypes.h中。
Document Loader
相對FrameLoader而言,DocumentLoader相對簡單一些,它的任務就是呼叫一個MainResourceLoader載入主文件。因為狀態的轉換在FrameLoader裡完成了。子資源的載入依託於DocumentLoader來管理。
子資源的載入
正如頁面元素從屬於Document存在一樣,負責子資源的載入的類從屬於Document,後來又移到了DocumentLoader類中。就形成了下面的關係:
CachedResourceLoader
至於CachedResourceLoader,其實就是一個封裝類,封裝了建立各類CachedResource的功能。各個需要進行載入的頁面元素會繼承自CachedResourceClient,建立CachedResourceRequest, 通過DocumentLoader/Document裡的CachedResourceLoader發起請求。
下面是Script元素髮起請求的呼叫:
Memory Cache/Application Cache
為了讓使用者有更快的應用體驗,快取機制不能少。在WebKit裡CachedResource/CachedResourceLoader的命名裡之所以有了Cached,就是因為它們中快取的互動。
WebKit也有一些演算法上的說明,可以參考這裡。
Resource Load Scheduler
在HostInformation裡儲存著兩個兩個列表,一個是使用不同優先順序陣列儲存的等待載入的列表,一個是正在載入的列表。
使用scheduleServePendingRequests處理排隊的請求時,會按優先順序依序執行。下面是基本流程: