WebKit 内核源码分析 (三) Page
瀏覽器的請求一般是以頁面請求為單位,當用戶通過網址欄輸入一個url,瀏覽器就開始一個頁面請求。而一個頁面請求可能包含有一到多個頁面子幀,以及圖片、CSS和插件等派生子資源。Page類就是用來對應這樣的頁面請求。Page類是WebKit中非常重要的一個類,它就像內核對外的一個聚合器。
關鍵詞:WebKit內核源代碼,WebCore,Page,Frame,WebKit架構
1.????概述
瀏覽器的請求一般是以頁面請求為單位,當用戶通過網址欄輸入一個url,瀏覽器就開始一個頁面請求。而一個頁面請求可能包含有一到多個頁面子幀,以及圖片、CSS和插件等派生子資源。Page類就是用來對應這樣的頁面請求。前進后退,導航,編輯,右鍵菜單,設置,Inspector等這些用戶參與的動作,大部分是同Page相關的。而標記語言解析、排版、加載則更多地同Frame相關。
我們通過幾個圖來看下Qt移植中Page類同應用之間的關系。
?
?
?
QWebPage通過QWebPagePrivate維護Page類的指針,并在QWebPagePrivate的構造函數中實例化Page對象。QWebPage類通過之后的createMainFrame調用實例化QwebFrame,而在QwebFrameData的構造函數中,以Page指針為參數調用了Frame::create?創建出Frame對象。
?
??
?Page類通過組合其它類的方式,實現了很多功能,Page類本身并沒有多少代碼。
2.????類關系
2.1??PageGroup
PageGroup并不是用來對Page進行管理的,而是設計用來將一些具有共同的屬性或者設置的Page編成組的,以方便對這些屬性進行管理。目前這樣的屬性包括localStorage的屬性,IndexDB,User Script,User StyleSheet等。最常見的同PageGroup相關的操作是維護已訪問鏈接(如addVisitedLink等接口)。根據地瓜的理解,假設WebKit內核之上架設多個應用(瀏覽器是一個應用),比較可能的是,一個應用獨立一個PageGroup。這里同多tab頁沒有關系,多tab頁屬于同一個PageGroup。地瓜曾在mailing group上就這個問題咨詢過,一位RIM的同學給我舉了一個例子,比如一個基于WebKit的郵件程序,一方面他可能調用基于webkit的browser來顯示網頁,另外他本身也基于webkit來顯示一些郵件,這兩個之間的setting有很大可能不一樣,他們就使用不同的PageGroup。
PageGroup中有這個Group已經安裝并且使用的User Script和User StyleSheet的集合,一般在網頁解析完畢后,這些User Script和User StyleSheet會插入到Document中。
PageGroup中還維護了Local Storage和Index DB相關的設置,比如它們的Path,上限等,通過GroupSettings類實現。
PageGroup創建以后,每次創建一個新的Page對象,會通過addPage接口加入到這個PageGroup的m_pages中。
每次有導航行為發生的時候,會調用addVisitedLink來將url加入到已訪問鏈接中。如果瀏覽器要跟蹤已訪問的接口,則在初始化的時候必須調用PageGroup::setShouldTrackVisitedLinks,且參數為true。此處shouldTrackVisitedLinks是一個靜態的全局變量,也就是說,所有應用維護一樣的行為(一個應用將其設置為false會影響到其它同樣基于此核的應用)?
Page類中維護了PageGroup的指針,并提供了group接口,這是個lazy接口,如果m_group不存在,會調用InitGroup來創建一個。對于Page類來說,如果沒有設置GroupName,則在初始化的時候會生成一個空GroupName的PageGroup,由m_singlePageGroup維護,并把指針賦給m_group,如果以非空的名字調用了setGroupName,則會重新創建PageGroup,此時這個PageGroup由m_group來維護。
2.2??Setting
WebCore中的設置相關的類,瀏覽器應用的不少配置、選項同該類相關,Qt移植中,應用在創建Page對象后,會根據Page::settings來實例化QwebSetting。
2.3??Chrome
原生窗口接口類,參考地瓜寫的”WebKit中的Chrome和ChromeClient”。
2.4??其它
SelectionController :負責管理Page中的選取操作,絕大部分選取操作是基于Frame的,只在Frame的Selection為空的時候,對焦點游標的繪制工作才會使用到Page類的SelectionController。
SharedGraphicsContext3D:共享3D圖形上下文,為了優化2D顯示而加入。在加速的2D canvas中,引入的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移植中,RenderThemeQt是RenderTheme接口的具體實現。
EditorClient:同編輯功能相關,比如拷貝、剪切、刪除等操作。
總結
以上是生活随笔為你收集整理的WebKit 内核源码分析 (三) Page的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebKit 内核源码分析 (二)
- 下一篇: WebKit 内核源码分析 (四)