webkit內核源碼分析三

摘要:瀏覽器的請求一般是以頁面請求爲單位,當用戶通過網址欄輸入一個url,瀏覽器就開始一個頁面請求。而一個頁面請求可能包含有一到多個頁面子幀,以及圖片、CSS和插件等派生子資源。Page類就是用來對應這樣的頁面請求。Page類是WebKit中非常重要的一個類,它就像內核對外的一個聚合器。

關鍵詞:WebKit內核源代碼,WebCore,Page,FrameWebKit架構

1.概述

瀏覽器的請求一般是以頁面請求爲單位,當用戶通過網址欄輸入一個url,瀏覽器就開始一個頁面請求。而一個頁面請求可能包含有一到多個頁面子幀,以及圖片、CSS和插件等派生子資源。Page類就是用來對應這樣的頁面請求。前進後退,導航,編輯,右鍵菜單,設置,Inspector等這些用戶參與的動作,大部分是同Page相關的。而標記語言解析、排版、加載則更多地同Frame相關。

我們通過幾個圖來看下Qt移植中Page類同應用之間的關係。

WebKit內核源代碼分析(三)
QWebPage通過QWebPagePrivate維護Page類的指針,並在QWebPagePrivate的構造函數中實例化Page對象。QWebPage類通過之後的createMainFrame調用實例化QwebFrame,而在QwebFrameData的構造函數中,以Page指針爲參數調用了Frame::create 創建出Frame對象。

WebKit內核源代碼分析(三)
Page類通過組合其它類的方式,實現了很多功能,Page類本身並沒有多少代碼。

2.類關係

WebKit內核源代碼分析(三)

2.1PageGroup

PageGroup並不是用來對Page進行管理的,而是設計用來將一些具有共同的屬性或者設置的Page編成組的,以方便對這些屬性進行管理。目前這樣的屬性包括localStorage的屬性,IndexDBUserScriptUserStyleSheet等。最常見的同PageGroup相關的操作是維護已訪問鏈接(如addVisitedLink等接口)。根據地瓜的理解,假設WebKit內核之上架設多個應用(瀏覽器是一個應用),比較可能的是,一個應用獨立一個PageGroup。這裏同多tab頁沒有關係,多tab頁屬於同一個PageGroup。地瓜曾在mailinggroup上就這個問題諮詢過,一位RIM的同學給我舉了一個例子,比如一個基於WebKit的郵件程序,一方面他可能調用基於webkitbrowser來顯示網頁,另外他本身也基於webkit來顯示一些郵件,這兩個之間的setting有很大可能不一樣,他們就使用不同的PageGroup

PageGroup中有這個Group已經安裝並且使用的UserScriptUserStyleSheet的集合,一般在網頁解析完畢後,這些UserScriptUserStyleSheet會插入到Document中。

PageGroup中還維護了LocalStorageIndexDB相關的設置,比如它們的Path,上限等,通過GroupSettings類實現。

PageGroup創建以後,每次創建一個新的Page對象,會通過addPage接口加入到這個PageGroupm_pages中。

每次有導航行爲發生的時候,會調用addVisitedLink來將url加入到已訪問鏈接中。如果瀏覽器要跟蹤已訪問的接口,則在初始化的時候必須調用PageGroup::setShouldTrackVisitedLinks,且參數爲true。此處shouldTrackVisitedLinks是一個靜態的全局變量,也就是說,所有應用維護一樣的行爲(一個應用將其設置爲false會影響到其它同樣基於此核的應用)?

Page類中維護了PageGroup的指針,並提供了group接口,這是個lazy接口,如果m_group不存在,會調用InitGroup來創建一個。對於Page類來說,如果沒有設置GroupName,則在初始化的時候會生成一個空GroupNamePageGroup,由m_singlePageGroup維護,並把指針賦給m_group,如果以非空的名字調用了setGroupName,則會重新創建PageGroup,此時這個PageGroupm_group來維護。

2.2Setting

WebCore中的設置相關的類,瀏覽器應用的不少配置、選項同該類相關,Qt移植中,應用在創建Page對象後,會根據Page::settings來實例化QwebSetting

2.3Chrome

原生窗口接口類,參考地瓜寫的”WebKit中的ChromeChromeClient”

2.4其它

SelectionController:負責管理Page中的選取操作,絕大部分選取操作是基於Frame的,只在FrameSelection爲空的時候,對焦點遊標的繪製工作纔會使用到Page類的SelectionController

SharedGraphicsContext3D:共享3D圖形上下文,爲了優化2D顯示而加入。在加速的2Dcanvas中,引入的DrawingBuffer的概念,SharedGraphicsContext3D提供了createDrawingBuffer來創建DrawingBuffer

DragController:拖拽控制器。Chrome的超級拖拽功能同這個有關?地瓜會在以後對此進行求證。

FocusController:焦點控制器。考慮到焦點會在各個frame之間切換,所以由Page類維護焦點控制器最合適不過。

ContextMenuController:右鍵下拉菜單控制器。

InspectorController:Inspector控制器,瀏覽器中的很多開發工具都同這個類相關。

GeolocationController:定位定位服務控制器。

DeviceMotionController:設備移動控制器

DeviceOrientationController:設備方向控制器

SpeechInputClient:語音輸入Client

ProgressTracker:進度跟蹤。

BackForwardController:前進後退操作控制。

Frame:一個Page由至少一個主幀和若干個其它子幀構成。

HistoryItem:歷史記錄。

PluginData:插件相關,未來可能同PluginDatabase類合併。主要是初始化Plugin的信息。

PluginHalter:用來控制Plugin的停止和重新開始。

RenderTheme:這個類提供了控件的渲染和繪製接口。Qt移植中,RenderThemeQtRenderTheme接口的具體實現。

EditorClient:同編輯功能相關,比如拷貝、剪切、刪除等操作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章