摘要:本系列通過分析WebKit的源代碼,試圖分析WebKit的內(nèi)核設(shè)計(jì)架構(gòu),模塊之間的關(guān)系,分析的時(shí)候以Qt的移植為參考,涉及移植的東西不多,主要還是以內(nèi)核為主。在分析內(nèi)核的時(shí)候,Frame是首當(dāng)其沖的一個(gè)類,本文將分析Frame類的代碼。 1. 描述Frame類是WebCore內(nèi)核同應(yīng)用之間聯(lián)系的一個(gè)重要的類。它有點(diǎn)像設(shè)計(jì)模式中的Fa?ade,將內(nèi)核的各個(gè)不同的零配件組裝在了一起,但又不是Fa?ade,因?yàn)橛脩艉芏鄷r(shí)候還是要直接去操作里面的組件。除了設(shè)計(jì)上的考慮,Frame還有語法上的意義,它對(duì)應(yīng)于Page里面的幀。 2. 類結(jié)構(gòu)
1) FrameTree對(duì)象用來協(xié)助管理父幀和子幀的關(guān)系,常見的比如main frame之中有iframe元素,就會(huì)調(diào)用FrameLoaderClientQt::createFrame來產(chǎn)生子幀,產(chǎn)生的子幀會(huì)通過appendChild添加到主幀的樹狀結(jié)構(gòu)中。Frame通過FrameTree對(duì)象,可以方便地訪問它的父幀,子幀,兄弟幀。 2) 維護(hù)FrameLoader對(duì)象用來完成frame的加載,FrameLoader是一個(gè)非常重要的類,后續(xù)進(jìn)行進(jìn)一步的分析。 3) 維護(hù)NavigationScheduler對(duì)象用來管理頁面跳轉(zhuǎn)調(diào)度(比如重定向,meta refresh等)。 4) DOMWindow用來管理同DOM相關(guān)的事件、屬性和消息。 5) FrameViwe類用于Frame的排版。 6) Frame文檔解析后,對(duì)每一個(gè)tag或者attr,會(huì)有對(duì)應(yīng)的dom節(jié)點(diǎn)關(guān)聯(lián),Document類用來管理這些dom節(jié)點(diǎn)。不同的文檔類型繼承出不同的子類,比如HTML文檔對(duì)應(yīng)子類HTMLDocument,XML文檔對(duì)應(yīng)于XMLDocument。 7) SciptController對(duì)象,腳本控制器,用來管理腳本的執(zhí)行和操作。 8) Editor對(duì)象用來處理頁面的編輯相關(guān)的操作,比如拷貝,粘貼,輸入等,Editor對(duì)象,它同Page類的EditorClient對(duì)象緊密合作。和EditorClient的關(guān)系就如同Page同Frame的關(guān)系。 9) SelectionController用來管理Frame中的選取操作。 10) AnimationControlle,動(dòng)畫控制,控制動(dòng)畫的播放,暫停,繼續(xù)(同HTML video標(biāo)簽是否有關(guān)系?) 11) EventHandler,事件處理對(duì)象,這里的對(duì)象主要是同上層應(yīng)用也就是用戶參與的事件,比如鼠標(biāo)事件,按鍵事件(快捷鍵等),滾動(dòng)事件,resize事件等。這是一個(gè)瀏覽器外殼經(jīng)常需要打交道的類。 3. 主要接口3.1 Createstatic PassRefPtr<Frame> create(Page*,HTMLFrameOwnerElement*,FrameLoaderClient*) 調(diào)用系列: àQwebPage::setView àQwebPage::setViewportSize àQwebPage::mainFrame àQwebPagePrivate::createMainFrame àQwebFrameData::QwebFrameData àFrame::create
àHTMLDocumentParser::append à…… àHTMLTreeBuilder::processToken à…… àHTMLElementBase::openURL àSubFrameLoader::requestFrame à…… àFrameLoaderClientQt::creatFrame àQwebFrameData::QwebFrameData àFrame::create 3.2 createViewvoid 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。 àFrameLoader::transitionToCommitted àFrameLoaderClientQt::transitionToCommittedForNewPage àFrame::createView 3.3 setDocumentvoid setDocument(PassRefPtr<Document>) 描述:設(shè)置同Frame關(guān)聯(lián)的Document對(duì)象(一般是DocumentWriter創(chuàng)建的)。 函數(shù)調(diào)用系列: àQWebFrame::QwebFrame àQwebFramePrivate::init àFrame::init àFrameLoader::init àDocumentWriter::begin àFrame::setDocument
àFrameLoaderClientQt::committedLoad àDocumentLoader::commitData àDocumentWriter::setEncoding àDocumentWriter::willSetEncoding àFrameLoader::receivedFirstData àDocumentWriter::begin àFrameLoader::clear àFrame::setDocument 3.4 initvoid Frame::init 描述:Frame對(duì)象初始化,會(huì)調(diào)用FrameLoader::init初始化FrameLoader對(duì)象。 調(diào)用系列: àQwebFramePrivate::init àFrame::init 3.5 setPageAndTextZoomFactorsvoid setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor) 描述:設(shè)置頁面放大因子和文字放大因子。在網(wǎng)頁縮放或者改變網(wǎng)頁字體大小的時(shí)候調(diào)用。 |
|