WebKit內核源碼分析(一)---dlmu2001
摘要:本系列通過分析WebKit的源代碼,試圖分析WebKit的內核設計架構,模塊之間的關係,分析的時候以Qt的移植爲參考,涉及移植的東西不多,主要還是以內核爲主。在分析內核的時候,Frame是首當其衝的一個類,本文將分析Frame類的代碼。
1. 描述
Frame類是WebCore內核同應用之間聯繫的一個重要的類。它有點像設計模式中的Façade,將內核的各個不同的零配件組裝在了一起,但又不是Façade,因爲用戶很多時候還是要直接去操作裏面的組件。除了設計上的考慮,Frame還有語法上的意義,它對應於Page裏面的幀。
2. 類結構
1) FrameTree對象用來協助管理父幀和子幀的關係,常見的比如main frame之中有iframe元素,就會調用FrameLoaderClientQt::createFrame來產生子幀,產生的子幀會通過appendChild添加到主幀的樹狀結構中。Frame通過FrameTree對象,可以方便地訪問它的父幀,子幀,兄弟幀。
2) 維護FrameLoader對象用來完成frame的加載,FrameLoader是一個非常重要的類,後續進行進一步的分析。
3) 維護NavigationScheduler對象用來管理頁面跳轉調度(比如重定向,meta refresh等)。
4) DOMWindow用來管理同DOM相關的事件、屬性和消息。
5) FrameViwe類用於Frame的排版。
6) Frame文檔解析後,對每一個tag或者attr,會有對應的dom節點關聯,Document類用來管理這些dom節點。不同的文檔類型繼承出不同的子類,比如HTML文檔對應子類HTMLDocument,XML文檔對應於XMLDocument。
7) SciptController對象,腳本控制器,用來管理腳本的執行和操作。
8) Editor對象用來處理頁面的編輯相關的操作,比如拷貝,粘貼,輸入等,Editor對象,它同Page類的EditorClient對象緊密合作。和EditorClient的關係就如同Page同Frame的關係。
9) SelectionController用來管理Frame中的選取操作。
10) AnimationControlle,動畫控制,控制動畫的播放,暫停,繼續(同HTML video標籤是否有關係?)
11) EventHandler,事件處理對象,這裏的對象主要是同上層應用也就是用戶參與的事件,比如鼠標事件,按鍵事件(快捷鍵等),滾動事件,resize事件等。這是一個瀏覽器外殼經常需要打交道的類。
3. 主要接口
3.1 Create
static PassRefPtr<Frame> create(Page*,HTMLFrameOwnerElement*,FrameLoaderClient*)
描述: 調用Frame構造函數,創建出Frame對象。有兩個地方會創建Frame對象,一是要加載一個新的頁面請求,這個時候會創建main frame,一是在加載子幀的時候,通過FrameLoaderClientQt的createFrame接口,創建子幀對應的Frame對象,在第一種情況中,HTMLFrameOwnerElement參數爲NULL,第二種情況傳子幀的父元素。在一個tab頁內,main frame會重用。
調用系列:
à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)
描述:創建出FrameView對象,以用於之後的排版。應用調用這個函數的時候需要傳入同排版有關的一些信息,如初始視窗大小,背景色,滾動條模式等。創建出FrameView以後,即調用Frame::setView設置成當前的FrameView。
函數調用系列:
àFrameLoader::commitProvisionalLoad
àFrameLoader::transitionToCommitted
àFrameLoaderClientQt::transitionToCommittedForNewPage
àFrame::createView
3.3 setDocument
void setDocument(PassRefPtr<Document>)
描述:設置同Frame關聯的Document對象(一般是DocumentWriter創建的)。
函數調用系列:
à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對象初始化,會調用FrameLoader::init初始化FrameLoader對象。
調用系列:
àQWebFrame::QWebFrame
àQwebFramePrivate::init
àFrame::init
3.5 setPageAndTextZoomFactors
void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor)
描述:設置頁面放大因子和文字放大因子。在網頁縮放或者改變網頁字體大小的時候調用。