日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebKit 内核源码分析 (三) Page

發布時間:2024/4/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebKit 内核源码分析 (三) Page 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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的屬性,IndexDBUser ScriptUser StyleSheet等。最常見的同PageGroup相關的操作是維護已訪問鏈接(如addVisitedLink等接口)。根據地瓜的理解,假設WebKit內核之上架設多個應用(瀏覽器是一個應用),比較可能的是,一個應用獨立一個PageGroup。這里同多tab頁沒有關系,多tab頁屬于同一個PageGroup。地瓜曾在mailing group上就這個問題咨詢過,一位RIM的同學給我舉了一個例子,比如一個基于WebKit的郵件程序,一方面他可能調用基于webkitbrowser來顯示網頁,另外他本身也基于webkit來顯示一些郵件,這兩個之間的setting有很大可能不一樣,他們就使用不同的PageGroup

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

PageGroup中還維護了Local StorageIndex DB相關的設置,比如它們的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.2??Setting

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

2.3??Chrome

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

2.4??其它

SelectionController :負責管理Page中的選取操作,絕大部分選取操作是基于Frame的,只在FrameSelection為空的時候,對焦點游標的繪制工作才會使用到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移植中,RenderThemeQtRenderTheme接口的具體實現。

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

總結

以上是生活随笔為你收集整理的WebKit 内核源码分析 (三) Page的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。