WebKit 内核源码分析 (二) FrameLoader
FrameLoader類負責一個Frame的加載,在Frame的流程中起到非常重要的重要,同很多組件都有交互,本文將分析FrameLoader類的代碼。
1.?概述
????顧名思義,FrameLoader是一個Frame的loader,它的作用就是為客戶提供一個下載一個Frame的一系列接口。這里的客戶指的是類的客戶,比如Frame類,間接客戶是上層應用,比如qwebframe。
????從它的定義看,最容易想到的是一個load接口,用來將一個frame load下來。任何一個頁面至少都需要一個mainframe,因此一個頁面的下載一般就是從load一個mainframe開始。
????在load frame的過程中,通過FrameLoaderClient接口將load過程的不同階段告知客戶。
????FrameLoader通過setDocumentLoader相當于把load的工作委托給了DocumentLoader類。
????FrameLoader同DocumentLoader是has-a的關系。一般在load的時候創建DocumentLoader。Frame調用DocumentLoader的startLoadingMainResource開始load frame。
2.?類關系
1)Frame和FrameLoader是contain-a的關系,在Frame的構造函數中調用FrameLoader的構造函數,調用時傳入參數Frame指針和FrameLoaderClient指針。
2)Frame有可能有子Frame,所以維護SubFrameLoader對象m_subframeLoader來管理子Frame的load。Frame可以對應xml document,也可對應html document,等等。跟Document相關的子resource的load不在FrameLoader的職責范圍內。
3)包含一個DocumentWriter類對象m_writer,當Frame的數據load finish的時候,將數據傳給DocumentWriter類,進行下一步的處理(比如解碼)
4)FrameLoader維護了三個DocumentLoader對象,分別對應于不同的階段,m_policyDocumentLoader對應于收到用戶load調用,進行policy check階段,m_provisionalDocumentLoader對應于policy check通過以后,Frame數據還沒有到來之前,它會負責startLoadingMainResource的調用。m_documentLoader則是Frame第一個數據到來以后使用的DocumentLoader,這個時候,前一個主Frame的DocumentLoader已經不能再用(user agent開始白屏,刷掉前一個頁面的顯示)。
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校驗對應于收到數據以后(判斷Mime type等),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被設置為Policy DocumentLoader和Provisional DocumentLoader,調用DocumentLoader和documentWriter等的接口進行初始化操作
FrameLoader::commitProvisionalLoad
功能:提交Provisional階段下載的數據
函數調用系列:
DocumentLoader::finishLoading
DocumentLoader::commitIfReady
FrameLoader::commitProvisionalLoad
或者
ResourceLoader::didReceiveData
MainResourceLoader::addData
DocumentLoader::receiveData
DocumentLoader::commitLoad
DocumentLoader::commitIfReady
DocumentLoader::commitProvisionalLoad
說明:這個接口主要的操作是將Provisional DocumentLoader設置成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為Policy Document Loader,進入Policy check流程。
總結
以上是生活随笔為你收集整理的WebKit 内核源码分析 (二) FrameLoader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebKit 内核源码分析 (一)
- 下一篇: WebKit 内核源码分析 (三)