1. 程式人生 > >Webkit之載入流程概述

Webkit之載入流程概述

之前寫了幾篇載入流程的說明,是從下向上看,有點只見樹木不見森林的感覺。經過最近一段時間的學習,有了能加以概括抽象的方法。

WebKit載入流程和頁面組成是直接相關的,頁面就是WebKit要載入的物件。所以WebKit負責載入的類也與負責頁面管理的類相對應。Apple關於WebView的說明裡清楚表現了頁面檢視上的MVC結構:

Structure

一個頁面從元素上也有其層次結構,並且和載入類對應,如下:

Loading

從頁面元素上講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)。

Loaders

ResourceHandle在WebKit中是一個重要的port介面,與各個平臺的網路層適配,代表了一個具體的網路載入任務。


主要類的關係

Classes

FrameLoader載入時序

從上面可以知道FrameLoader代表了Frame的載入行為,DocumentLoader代表了Document的載入行為。為了區分載入的程序,FrameLoader對載入狀態進行了區分,並且讓DocumentLoader在不同的狀態間轉換。除此之外FrameLoader還另外使用一個狀態機,管理Frame載入顯示的狀態(FrameLoaderStateMachine)。

States

除此之此,FrameLoader還要維護歷史項(HistoryController),以對應處理Navigation操作, 詳細專案定義在FrameLoaderTypes.h中。

Document Loader

相對FrameLoader而言,DocumentLoader相對簡單一些,它的任務就是呼叫一個MainResourceLoader載入主文件。因為狀態的轉換在FrameLoader裡完成了。子資源的載入依託於DocumentLoader來管理。

子資源的載入

正如頁面元素從屬於Document存在一樣,負責子資源的載入的類從屬於Document,後來又移到了DocumentLoader類中。就形成了下面的關係:

SubResources

CachedResourceLoader

至於CachedResourceLoader,其實就是一個封裝類,封裝了建立各類CachedResource的功能。各個需要進行載入的頁面元素會繼承自CachedResourceClient,建立CachedResourceRequest, 通過DocumentLoader/Document裡的CachedResourceLoader發起請求。

States

下面是Script元素髮起請求的呼叫:

ScriptElement

Memory Cache/Application Cache

為了讓使用者有更快的應用體驗,快取機制不能少。在WebKit裡CachedResource/CachedResourceLoader的命名裡之所以有了Cached,就是因為它們中快取的互動。

SubResources

WebKit也有一些演算法上的說明,可以參考這裡

Resource Load Scheduler

Scheduler

在HostInformation裡儲存著兩個兩個列表,一個是使用不同優先順序陣列儲存的等待載入的列表,一個是正在載入的列表。

使用scheduleServePendingRequests處理排隊的請求時,會按優先順序依序執行。下面是基本流程:

Scheduler