webkit內核源碼分析二

摘要:本系列通過分析WebKit的源代碼,試圖分析WebKit的內核設計架構,模塊之間的關係,分析的時候以Qt的移植爲參考,涉及移植的東西不多,主要還是以內核爲主。FrameLoader類負責一個Frame的加載,在Frame的流程中起到非常重要的重要,同很多組件都有交互,本文將分析FrameLoader類的代碼。
1. 概述

顧名思義,FrameLoader是一個Frame的loader,它的作用就是爲客戶提供一個下載一個Frame的一系列接口。這裏的客戶指的是類的客戶,比如Frame類,間接客戶是上層應用,比如qwebframe。
從它的定義看,最容易想到的是一個load接口,用來將一個frameload下來。任何一個頁面至少都需要一個mainframe,因此一個頁面的下載一般就是從load一個mainframe開始。
在load frame的過程中,通過FrameLoaderClient接口將load過程的不同階段告知客戶。
FrameLoader通過setDocumentLoader相當於把load的工作委託給了DocumentLoader類。
FrameLoader同DocumentLoader是has-a的關係。一般在load的時候創建DocumentLoader。Frame調用DocumentLoader的startLoadingMainResource開始loadframe。
2. 類關係

WebKit內核源代碼分析(二)

1)Frame和FrameLoader是contain-a的關係,在Frame的構造函數中調用FrameLoader的構造函數,調用時傳入參數Frame指針和FrameLoaderClient指針。
2)Frame有可能有子Frame,所以維護SubFrameLoader對象m_subframeLoader來管理子Frame的load。Frame可以對應xmldocument,也可對應htmldocument,等等。跟Document相關的子resource的load不在FrameLoader的職責範圍內。
3)包含一個DocumentWriter類對象m_writer,當Frame的數據loadfinish的時候,將數據傳給DocumentWriter類,進行下一步的處理(比如解碼)
4)FrameLoader維護了三個DocumentLoader對象,分別對應於不同的階段,m_policyDocumentLoader對應於收到用戶load調用,進行policycheck階段,m_provisionalDocumentLoader對應於policycheck通過以後,Frame數據還沒有到來之前,它會負責startLoadingMainResource的調用。m_documentLoader則是Frame第一個數據到來以後使用的DocumentLoader,這個時候,前一個主Frame的DocumentLoader已經不能再用(useragent開始白屏,刷掉前一個頁面的顯示)。
5)包含一個HistoryController對象,用於操作歷史記錄相關的接口,保存或者恢復Document和View相關的狀態,維護前進後退隊列,以實現前進後退功能,前進後退本質上是同Page對象關聯的,FrameLoader通過HistoryController操作m_backFowardController對象
6)包含一個ResourceLoadNotifier對象,主要用於同ResourceLoader及FrameLoaderClient打交道,可以理解爲ResourceLoader有事件變化或者發生的時候,通知FrameLoader的一個手段
7)包含一個SubframeLoader對象,當FrameLoader下載的Document有子幀需要請求的時候(比如HTMLDocument中解析到iframe元素),用來處理子幀請求
8)將FrameLoader的狀態封裝到FrameLoaderStateMachine中,這個狀態同FrameState不同,FrameState傾向於判斷Frame涉及的Document的下載狀態,是出於發起狀態(Provisional),還是出於已經收到響應但不全(CommittedPage),還是響應收全的狀態,傾向於同http相關。而FramLoaderStateMachine傾向於同DocumentLoader相關,用來描述FrameLoader處理DocumentLoader的節點,是處於已經創建,還是顯示的狀態。
9)PolicyChecker主要用來對FrameLoader進行一些校驗。包括三種校驗:NewWindow,Navigation和Content。NewWindow對應於瀏覽器需要新開一個tab頁或窗口的時候,Navigation對應於一個頁面請求發起的時候,Content校驗對應於收到數據以後(判斷Mimetype等),PolicyChecker通過提供對應的接口,由FrameLoaderClient來對這些請求進行校驗,以確定是否允許繼續,或者需要其它的動作。

3. 主要接口
Frame::init

功能:FrameLoader的初始化

函數調用系列
àQWebFrame::QWebFrame(QwebPage*parent,QWebFrameData *frameData)
àQWebFramePrivate::init(QWebFrame*qwebframe,QWebFrameData* frameData)
àFrame::init()
àFrameLoader::init()

說明:主要做一些自身的初始化工作,比如初始化狀態機,Sandbox Flags,創建DocumentLoader被設置爲PolicyDocumentLoader和ProvisionalDocumentLoader,調用DocumentLoader和documentWriter等的接口進行初始化操作
FrameLoader::commitProvisionalLoad

功能:提交Provisional階段下載的數據

函數調用系列:
àDocumentLoader::finishLoading
àDocumentLoader::commitIfReady
àFrameLoader::commitProvisionalLoad

或者
àResourceLoader::didReceiveData
àMainResourceLoader::addData
àDocumentLoader::receiveData
àDocumentLoader::commitLoad
àDocumentLoader::commitIfReady
àDocumentLoader::commitProvisionalLoad

說明:這個接口主要的操作是將ProvisionalDocumentLoader設置成DocumentLoader,因爲已經收到數據,所以FrameState也會躍遷到FrameStateCommittedPage。還有歷史記錄,PageCache相關的操作。另外,這個接口會間接調用FrameLoaderClientQt::transitionToCommittedForNewPage,通過Frame::createView創建出FrameView來。
Frame::finishedLoading

功能:frame請求網絡加載完成的時候調用此接口

函數調用系列
àResourceLoader::didFinishLoading
àMainResourceLoader::didFinishLoading
àFrameLoader::finishedLoading
àFrameLoader::init()

說明:檢查是否有網絡錯誤,告訴DocumentLoader和DocumentWriter下載完成,以便進行後續操作(提交數據,解析)。
FrameLoader::finishedParsing

功能:解析完成調用此接口

函數調用系列
àDocumentWritter::end
à….
àDocument::finishParsing
à….
àDocument::finishedParsing
àFrameLoader::finishedParsing
FrameLoader::load(const ResourceRequest&request,bool lockHistory)

功能:加載一個frame請求,Frame請求相關的數據,封裝成ResourceRequest傳入。

函數調用系列:一般由應用觸發調用

說明:這個接口調用FrameLoaderClientQt::createDocumentLoader創建出DocumentLoader,並以此DocumentLoader爲PolicyDocument Loader,進入Policy check流程。


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