日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

WebKit 内核源码分析 (二) FrameLoader

發(fā)布時(shí)間:2024/4/15 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebKit 内核源码分析 (二) FrameLoader 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

FrameLoader類負(fù)責(zé)一個(gè)Frame的加載,在Frame的流程中起到非常重要的重要,同很多組件都有交互,本文將分析FrameLoader類的代碼。

1.?概述

????顧名思義,FrameLoader是一個(gè)Frame的loader,它的作用就是為客戶提供一個(gè)下載一個(gè)Frame的一系列接口。這里的客戶指的是類的客戶,比如Frame類,間接客戶是上層應(yīng)用,比如qwebframe。
????從它的定義看,最容易想到的是一個(gè)load接口,用來(lái)將一個(gè)frame load下來(lái)。任何一個(gè)頁(yè)面至少都需要一個(gè)mainframe,因此一個(gè)頁(yè)面的下載一般就是從load一個(gè)mainframe開始。
????在load frame的過(guò)程中,通過(guò)FrameLoaderClient接口將load過(guò)程的不同階段告知客戶。
????FrameLoader通過(guò)setDocumentLoader相當(dāng)于把load的工作委托給了DocumentLoader類。
????FrameLoader同DocumentLoader是has-a的關(guān)系。一般在load的時(shí)候創(chuàng)建DocumentLoader。Frame調(diào)用DocumentLoader的startLoadingMainResource開始load frame。

2.?類關(guān)系



1)Frame和FrameLoader是contain-a的關(guān)系,在Frame的構(gòu)造函數(shù)中調(diào)用FrameLoader的構(gòu)造函數(shù),調(diào)用時(shí)傳入?yún)?shù)Frame指針和FrameLoaderClient指針。
2)Frame有可能有子Frame,所以維護(hù)SubFrameLoader對(duì)象m_subframeLoader來(lái)管理子Frame的load。Frame可以對(duì)應(yīng)xml document,也可對(duì)應(yīng)html document,等等。跟Document相關(guān)的子resource的load不在FrameLoader的職責(zé)范圍內(nèi)。
3)包含一個(gè)DocumentWriter類對(duì)象m_writer,當(dāng)Frame的數(shù)據(jù)load finish的時(shí)候,將數(shù)據(jù)傳給DocumentWriter類,進(jìn)行下一步的處理(比如解碼)
4)FrameLoader維護(hù)了三個(gè)DocumentLoader對(duì)象,分別對(duì)應(yīng)于不同的階段,m_policyDocumentLoader對(duì)應(yīng)于收到用戶load調(diào)用,進(jìn)行policy check階段,m_provisionalDocumentLoader對(duì)應(yīng)于policy check通過(guò)以后,Frame數(shù)據(jù)還沒有到來(lái)之前,它會(huì)負(fù)責(zé)startLoadingMainResource的調(diào)用。m_documentLoader則是Frame第一個(gè)數(shù)據(jù)到來(lái)以后使用的DocumentLoader,這個(gè)時(shí)候,前一個(gè)主Frame的DocumentLoader已經(jīng)不能再用(user agent開始白屏,刷掉前一個(gè)頁(yè)面的顯示)。
5)包含一個(gè)HistoryController對(duì)象,用于操作歷史記錄相關(guān)的接口,保存或者恢復(fù)Document和View相關(guān)的狀態(tài),維護(hù)前進(jìn)后退隊(duì)列,以實(shí)現(xiàn)前進(jìn)后退功能,前進(jìn)后退本質(zhì)上是同Page對(duì)象關(guān)聯(lián)的,FrameLoader通過(guò)HistoryController操作m_backFowardController對(duì)象
6)包含一個(gè)ResourceLoadNotifier對(duì)象,主要用于同ResourceLoader及FrameLoaderClient打交道,可以理解為ResourceLoader有事件變化或者發(fā)生的時(shí)候,通知FrameLoader的一個(gè)手段
7)包含一個(gè)SubframeLoader對(duì)象,當(dāng)FrameLoader下載的Document有子幀需要請(qǐng)求的時(shí)候(比如HTMLDocument中解析到iframe?元素),用來(lái)處理子幀請(qǐng)求
8)將FrameLoader的狀態(tài)封裝到FrameLoaderStateMachine中,這個(gè)狀態(tài)同F(xiàn)rameState不同,FrameState傾向于判斷Frame涉及的Document的下載狀態(tài),是出于發(fā)起狀態(tài)(Provisional),還是出于已經(jīng)收到響應(yīng)但不全(CommittedPage),還是響應(yīng)收全的狀態(tài),傾向于同http相關(guān)。而FramLoaderStateMachine傾向于同DocumentLoader相關(guān),用來(lái)描述FrameLoader處理DocumentLoader的節(jié)點(diǎn),是處于已經(jīng)創(chuàng)建,還是顯示的狀態(tài)。
9)PolicyChecker主要用來(lái)對(duì)FrameLoader進(jìn)行一些校驗(yàn)。包括三種校驗(yàn):NewWindow,Navigation和Content。NewWindow對(duì)應(yīng)于瀏覽器需要新開一個(gè)tab頁(yè)或窗口的時(shí)候,Navigation對(duì)應(yīng)于一個(gè)頁(yè)面請(qǐng)求發(fā)起的時(shí)候,Content校驗(yàn)對(duì)應(yīng)于收到數(shù)據(jù)以后(判斷Mime type等),PolicyChecker通過(guò)提供對(duì)應(yīng)的接口,由FrameLoaderClient來(lái)對(duì)這些請(qǐng)求進(jìn)行校驗(yàn),以確定是否允許繼續(xù),或者需要其它的動(dòng)作。

3.???主要接口

Frame::init

功能:FrameLoader的初始化

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

說(shuō)明:主要做一些自身的初始化工作,比如初始化狀態(tài)機(jī),Sandbox Flags,創(chuàng)建DocumentLoader被設(shè)置為Policy DocumentLoader和Provisional DocumentLoader,調(diào)用DocumentLoader和documentWriter等的接口進(jìn)行初始化操作

FrameLoader::commitProvisionalLoad

功能:提交Provisional階段下載的數(shù)據(jù)

函數(shù)調(diào)用系列:
DocumentLoader::finishLoading
DocumentLoader::commitIfReady
FrameLoader::commitProvisionalLoad

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

說(shuō)明:這個(gè)接口主要的操作是將Provisional DocumentLoader設(shè)置成DocumentLoader,因?yàn)橐呀?jīng)收到數(shù)據(jù),所以FrameState也會(huì)躍遷到FrameStateCommittedPage。還有歷史記錄,PageCache相關(guān)的操作。另外,這個(gè)接口會(huì)間接調(diào)用FrameLoaderClientQt::transitionToCommittedForNewPage,通過(guò)Frame::createView創(chuàng)建出FrameView來(lái)。

Frame::finishedLoading

功能:frame請(qǐng)求網(wǎng)絡(luò)加載完成的時(shí)候調(diào)用此接口

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

說(shuō)明:檢查是否有網(wǎng)絡(luò)錯(cuò)誤,告訴DocumentLoader和DocumentWriter下載完成,以便進(jìn)行后續(xù)操作(提交數(shù)據(jù),解析)。

FrameLoader::finishedParsing

功能:解析完成調(diào)用此接口

函數(shù)調(diào)用系列
DocumentWritter::end
….
Document::finishParsing
….
Document::finishedParsing
FrameLoader::finishedParsing

FrameLoader::load(const ResourceRequest& request,bool lockHistory)

功能:加載一個(gè)frame請(qǐng)求,Frame請(qǐng)求相關(guān)的數(shù)據(jù),封裝成ResourceRequest傳入。

函數(shù)調(diào)用系列:一般由應(yīng)用觸發(fā)調(diào)用

說(shuō)明:這個(gè)接口調(diào)用FrameLoaderClientQt::createDocumentLoader創(chuàng)建出DocumentLoader,并以此DocumentLoader為Policy Document Loader,進(jìn)入Policy check流程。

總結(jié)

以上是生活随笔為你收集整理的WebKit 内核源码分析 (二) FrameLoader的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。