QT中使用Webkit簡單寫出源代碼案例分析
QT中使用Webkit簡單寫出源代碼案例分析是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)今日研究了一下Webkit,這個東西是什么東西這里就不做描述了,看不懂就不必往下看了。
這里是以Qt的代碼分支為主進行的分析,復(fù)雜的分析個人也有,但是畢竟?fàn)砍兜揭恍C密問題,所以不便公開。(如圖)
JaveScripeCore:執(zhí)行JavaScrip的核心程序,里面包含了腳本解析器、分析器和執(zhí)行程序。
WebCore:瀏覽器核心組件,可以看作為一個Http解析和顯示的核心庫,包括了對各個腳本的分布處理以及對UI的組織,包含了對基本GUI動作、事件相應(yīng)、網(wǎng)絡(luò)、數(shù)據(jù)IO、圖形圖像的編解碼等的處理,是核心組件。
Other libraries:其他平臺庫的支持,例如:libsqlite、libpng、libjepg等等。
Platform:平臺支持。
在這里以QT為分析案例
WebCore部分
WebCore\platform\qt:
ClipboardQT:實現(xiàn)了管理剪切板的包裝
ContextMenuQt和ContextMenuItemQt:對于菜單信息的一個封裝,里面沒有GUI的圖形支持。
CookieJarQt:調(diào)用webkit封裝的cookitAPI實現(xiàn)對cookie的信息的管理
CursorQt:實現(xiàn)對于光標(biāo)的封裝,提供了多種狀態(tài)的光標(biāo)式樣。
DragDataQt:用來臨時存儲UI部分拖拽的對象數(shù)據(jù),在QT中需要QMImierData支持,在ARM上可以不做考慮實現(xiàn)。
DragImageQt:功能與上面相似,可以不進行支持。
FileChooserQt:用開打開一個本地文件用的功能,里面包含了對GUI的對話框的調(diào)用。
FileSystemQt:用于提供對文件的一些IO支持的函數(shù)。
KeyboardCodes.h:里面根據(jù)平臺的不同定義了相關(guān)的鍵值
Localizations:提供不同平臺下返回的一些特定需要的字符串,比如Download Image,都是以函數(shù)的形式得到
MenuEventProxy:無用文件,可能是以前版本的QT的支持,新版本沒有用處。
MIMETypeRegistryQT:通過輸入的MIME字符串返回自定義的MIME類型,僅僅是用到了對字符串的處理。
PasteboardQt:對于剪切板的封裝,封裝一些設(shè)置剪切板內(nèi)容的工作
PlatformKeyboardEventQt:主要是2個關(guān)于平臺相關(guān)的按鍵轉(zhuǎn)換函數(shù),需要移植
PlatformMouseEventQt:對于鼠標(biāo)事件的封裝
PlatformScreenQt:封裝了關(guān)于得到窗口尺寸的函數(shù),需要重寫
PlatformScrollBarQt:對平臺用的滾動條進行封裝,不同的GUI引擎用到的滾動條接口不一,移植比較麻煩,需要結(jié)合上層代碼重寫
PlugInInfoStoreQt:插件管理器,可以考慮參考GTK的方案放棄支持
PopupMenuQt:對彈出式菜單的封裝
QWebPopup:貌似實現(xiàn)了彈出式的菜單,里面的做法是用qcombobox開虛擬了一個菜單
RenderThemeQt:實現(xiàn)了UI部分繪圖的工作,里面區(qū)分了各控件的種類然后進行繪制,需要移植,比較麻煩
ScreenQt:無用,沒有編譯
ScrollViewQt:一個必須要用的控件,實現(xiàn)了一些接口的封裝,實現(xiàn)比較麻煩
SearchPopupMenuQt:無用,所有函數(shù)返回空即可
SharedTimerQt:一個計時器,QT用的是Qtimer進行封裝
SoundQt:調(diào)用一個系統(tǒng)鈴聲的函數(shù)
SystemTimeQt:返回系統(tǒng)時間
TemporaryLinkStubs:QT和GTK都沒有實現(xiàn),可以忽略
ThreadingQt:主要是做了一些線程方面需要支持的封裝,QT的和Gtk的實現(xiàn)的東西不大一樣,大多沒有用處,ms僅僅callOnMainThread函數(shù)需要實現(xiàn)
WheelEventQt:需要實現(xiàn),目的不明
WidgetQt:對于窗口的一個封裝,各個平臺封裝不一,可按照其中一個作為參考
WebCore\platform\text:
里面代碼主要是對于基本字符的處理,個平臺實現(xiàn)方式不一,webkit本身提供一套字符機制,可以沿用,也可以根據(jù)平臺重載關(guān)鍵部分做一些修改,如QT的方式和mac的方式
WebCore\platform\network:
ResourceResponse.h:寫了一個需要實現(xiàn)的派生類,但是在qt下沒有實際意義,在mac和cf下有具體實現(xiàn)。
其余文件都是針對于Http服務(wù)而寫的一些輔助類,由于沒有整體架構(gòu)概念,目前難以理解
WebCore\platform\graphics:
AffineTransformQt.cpp:對于平臺基本圖形幾何變換用的類函數(shù)封裝
ColorQt:封裝Color屬性的類
FloatPointQt:關(guān)于Float點屬性類的一個包裝
FloatRectQt:關(guān)于浮點數(shù)屬性的矩形類包裝
FontCacheQt:關(guān)于字體包裝后的一個擴展實現(xiàn),個平臺封裝的很簡單,基本沒實現(xiàn)
FontCustomPlatformData:對于內(nèi)存字體的管理,除了mac意外其余幾乎沒有做實現(xiàn),可參照qt的做法
FontQt:對于字體基本操作的封裝
GraphicsContextQt:基本繪畫的另外上層封裝
IconQt:對Icon處理的類
ImageBufferQt:關(guān)于Image處理的幾個函數(shù),可能用于中間數(shù)據(jù)轉(zhuǎn)換用
ImageDecoderQt:一個圖片處理的接口類,實現(xiàn)比較復(fù)雜
ImageQt:一個圖片的接口類,許多實現(xiàn)依靠外部實現(xiàn),比較復(fù)雜
ImageSourceQt:在上述2個文件之上的又一個封裝,也是實現(xiàn)了關(guān)于圖片操作的細節(jié)
IntPointQt、IntRectQt、IntSizeQt:這3個類如同名字,僅僅是對于數(shù)據(jù)結(jié)構(gòu)類的一種封裝
PathQt:對于QPainterPath的一個封裝,其他平臺ms沒有
SimpleFontData:對于字符之上的另一個封裝, QT沒有實現(xiàn)功能,其他平臺有實現(xiàn)
Webkit部分
許多Webcore部分的許多擴展是通過外部的Webkit中的代碼加以實現(xiàn),還有需要Webkit的對象是通過對Webcore已經(jīng)原有的類進行集成,其中,比較重要是網(wǎng)絡(luò)和數(shù)據(jù)IO部分,是通過Webkit的對象讀取網(wǎng)絡(luò)或者本地的數(shù)據(jù)資源,另外,其實現(xiàn)的方式是通過線程內(nèi)的任務(wù)模式,有任務(wù)隊列進行收發(fā)工作,如有另外的Page則通過另外的一個任務(wù)隊列進行。
數(shù)據(jù)IO流程:
首先是上層調(diào)用的loader(***),里面就是URL或者是本地文件,對參數(shù)進行打包后一步一步,最終調(diào)到QWebNetworkInterface::addJob函數(shù),在任務(wù)隊列中增加新的任務(wù),如果是本地文件,則用FileIO的形式進行讀取,如果是Http的,則啟動QHttp類的對象進行IO,直到取得數(shù)據(jù)為止
數(shù)據(jù)接收完成后會依次調(diào)到
- MainResourceLoader::didFinishLoading
- FrameLoader::finishedLoading
- DocumentLoader::finishedLoading
其中就有對于數(shù)據(jù)分析和刷新GUI的工作。
所以可以看出,除了GUI需要移植意外,還有很多網(wǎng)絡(luò)工作需要完成,QT版本是通過Http類進行Http方面的收發(fā)工作,Mac的流程與QT如同,需要考慮移植Http開源庫進行收發(fā)。
補充:看過CURL的庫,支持Http協(xié)議的手法和解析,但是CURL庫需要的庫我在這里列一下,對于CURL,筆者沒有進行多余分析。
小結(jié):QT中使用Webkit簡單寫出源代碼案例分析的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!



















