WebKit 内核源码分析 (一) Frame
在分析內(nèi)核的時(shí)候,Frame是首當(dāng)其沖的一個(gè)類(lèi),本文將分析Frame類(lèi)的代碼。
1.????描述
Frame類(lèi)是WebCore內(nèi)核同應(yīng)用之間聯(lián)系的一個(gè)重要的類(lèi)。它有點(diǎn)像設(shè)計(jì)模式中的Fa?ade,將內(nèi)核的各個(gè)不同的零配件組裝在了一起,但又不是Fa?ade,因?yàn)橛脩?hù)很多時(shí)候還是要直接去操作里面的組件。除了設(shè)計(jì)上的考慮,Frame還有語(yǔ)法上的意義,它對(duì)應(yīng)于Page里面的幀。
2.????類(lèi)結(jié)構(gòu)
?
?
1)??????????????FrameTree對(duì)象用來(lái)協(xié)助管理父幀和子幀的關(guān)系,常見(jiàn)的比如main frame之中有iframe元素,就會(huì)調(diào)用FrameLoaderClientQt::createFrame來(lái)產(chǎn)生子幀,產(chǎn)生的子幀會(huì)通過(guò)appendChild添加到主幀的樹(shù)狀結(jié)構(gòu)中。Frame通過(guò)FrameTree對(duì)象,可以方便地訪(fǎng)問(wèn)它的父幀,子幀,兄弟幀。
2)??????????????維護(hù)FrameLoader對(duì)象用來(lái)完成frame的加載,FrameLoader是一個(gè)非常重要的類(lèi),后續(xù)進(jìn)行進(jìn)一步的分析。
3)??????????????維護(hù)NavigationScheduler對(duì)象用來(lái)管理頁(yè)面跳轉(zhuǎn)調(diào)度(比如重定向,meta refresh等)。
4)??????????????DOMWindow用來(lái)管理同DOM相關(guān)的事件、屬性和消息。
5)??????????????FrameViwe類(lèi)用于Frame的排版。
6)??????????????Frame文檔解析后,對(duì)每一個(gè)tag或者attr,會(huì)有對(duì)應(yīng)的dom節(jié)點(diǎn)關(guān)聯(lián),Document類(lèi)用來(lái)管理這些dom節(jié)點(diǎn)。不同的文檔類(lèi)型繼承出不同的子類(lèi),比如HTML文檔對(duì)應(yīng)子類(lèi)HTMLDocument,XML文檔對(duì)應(yīng)于XMLDocument。
7)??????????????SciptController對(duì)象,腳本控制器,用來(lái)管理腳本的執(zhí)行和操作。
8)??????????????Editor對(duì)象用來(lái)處理頁(yè)面的編輯相關(guān)的操作,比如拷貝,粘貼,輸入等,Editor對(duì)象,它同Page類(lèi)的EditorClient對(duì)象緊密合作。和EditorClient的關(guān)系就如同Page同F(xiàn)rame的關(guān)系。
9)??????????????SelectionController用來(lái)管理Frame中的選取操作。
10)?????????AnimationControlle,動(dòng)畫(huà)控制,控制動(dòng)畫(huà)的播放,暫停,繼續(xù)(同HTML video標(biāo)簽是否有關(guān)系?)
11)?????????EventHandler,事件處理對(duì)象,這里的對(duì)象主要是同上層應(yīng)用也就是用戶(hù)參與的事件,比如鼠標(biāo)事件,按鍵事件(快捷鍵等),滾動(dòng)事件,resize事件等。這是一個(gè)瀏覽器外殼經(jīng)常需要打交道的類(lèi)。
3.????主要接口
3.1???Create
static PassRefPtr<Frame> create(Page*,HTMLFrameOwnerElement*,FrameLoaderClient*)
描述:?調(diào)用Frame構(gòu)造函數(shù),創(chuàng)建出Frame對(duì)象。有兩個(gè)地方會(huì)創(chuàng)建Frame對(duì)象,一是要加載一個(gè)新的頁(yè)面請(qǐng)求,這個(gè)時(shí)候會(huì)創(chuàng)建main frame,一是在加載子幀的時(shí)候,通過(guò)FrameLoaderClientQt的createFrame接口,創(chuàng)建子幀對(duì)應(yīng)的Frame對(duì)象,在第一種情況中,HTMLFrameOwnerElement參數(shù)為NULL,第二種情況傳子幀的父元素。在一個(gè)tab頁(yè)內(nèi),main frame會(huì)重用。
調(diào)用系列:
àQwebPage::setView
àQwebPage::setViewportSize
àQwebPage::mainFrame
àQwebPagePrivate::createMainFrame
àQwebFrameData::QwebFrameData
àFrame::create
àFrameLoader::finishedLoading
à……
àHTMLDocumentParser::append
à……
àHTMLTreeBuilder::processToken
à……
àHTMLElementBase::openURL
àSubFrameLoader::requestFrame
à……
àFrameLoaderClientQt::creatFrame
àQwebFrameData::QwebFrameData
àFrame::create
3.2??createView
void createView(const IntSize&, const Color&, bool, const IntSize&, bool,
????????????ScrollbarMode = ScrollbarAuto, bool horizontalLock = false,
????????????ScrollbarMode = ScrollbarAuto, bool verticalLock = false)
描述:創(chuàng)建出FrameView對(duì)象,以用于之后的排版。應(yīng)用調(diào)用這個(gè)函數(shù)的時(shí)候需要傳入同排版有關(guān)的一些信息,如初始視窗大小,背景色,滾動(dòng)條模式等。創(chuàng)建出FrameView以后,即調(diào)用Frame::setView設(shè)置成當(dāng)前的FrameView。
函數(shù)調(diào)用系列:
àFrameLoader::commitProvisionalLoad
àFrameLoader::transitionToCommitted
àFrameLoaderClientQt::transitionToCommittedForNewPage
àFrame::createView
3.3??setDocument
void setDocument(PassRefPtr<Document>)
描述:設(shè)置同F(xiàn)rame關(guān)聯(lián)的Document對(duì)象(一般是DocumentWriter創(chuàng)建的)。
函數(shù)調(diào)用系列:
àQWebFrame::QwebFrame
àQwebFramePrivate::init
àFrame::init
àFrameLoader::init
àDocumentWriter::begin
àFrame::setDocument
àDocumentLoader::receivedData
àDocumentLoader::commitLoad
àFrameLoaderClientQt::committedLoad
àDocumentLoader::commitData
àDocumentWriter::setEncoding
àDocumentWriter::willSetEncoding
àFrameLoader::receivedFirstData
àDocumentWriter::begin
àFrameLoader::clear
àFrame::setDocument
3.4??init
void Frame::init
描述:Frame對(duì)象初始化,會(huì)調(diào)用FrameLoader::init初始化FrameLoader對(duì)象。
調(diào)用系列:
àQWebFrame::QWebFrame
àQwebFramePrivate::init
àFrame::init
3.5??setPageAndTextZoomFactors
void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor)
描述:設(shè)置頁(yè)面放大因子和文字放大因子。在網(wǎng)頁(yè)縮放或者改變網(wǎng)頁(yè)字體大小的時(shí)候調(diào)用。
總結(jié)
以上是生活随笔為你收集整理的WebKit 内核源码分析 (一) Frame的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: repo 的用法和理解
- 下一篇: WebKit 内核源码分析 (二)