QT 上WEBKIT 的文章

 

今日研究了一下Webkit,这个东西是什么东西这里就不做描述了,看不懂就不必往下看了。
这里是以Qt的代码分支为主进行的分析,复杂的分析个人也有,但是毕竟牵扯到一些机密问题,所以不便公开。

     


JaveScripeCore:执行JavaScrip核心程序,里面包含了脚本解析器、分析器和执行程序。

WebCore:浏览器核心组件,可以看作为一个Http解析和显示的核心库,包括了对各个脚本的分布处理以及对UI的组织,包含了对基本GUI动作、事件相应、网络、数据IO、图形图像的编解码等的处理,是核心组件。

Other libraries:其他平台库的支持,例如:libsqlitelibpnglibjepg等等。

Platform:平台支持。

 

 

 

在这里以QT为分析案例

l  WebCore部分

WebCore/platform/qt

ClipboardQT:实现了管理剪切板的包装

ContextMenuQtContextMenuItemQt:对于菜单信息的一个封装,里面没有GUI的图形支持。

CookieJarQt:调用webkit封装的cookitAPI实现对cookie的信息的管理

CursorQt:实现对于光标的封装,提供了多种状态的光标式样。

DragDataQt:用来临时存储UI部分拖拽的对象数据,在QT中需要QMImierData支持,在ARM上可以不做考虑实现。

DragImageQt:功能与上面相似,可以不进行支持。

FileChooserQt:用开打开一个本地文件用的功能,里面包含了对GUI的对话框的调用。

FileSystemQt:用于提供对文件的一些IO支持的函数。

KeyboardCodes.h:里面根据平台的不同定义了相关的键值

Localizations:提供不同平台下返回的一些特定需要的字符串,比如Download Image,都是以函数的形式得到

MenuEventProxy:无用文件,可能是以前版本的QT的支持,新版本没有用处。

MIMETypeRegistryQT:通过输入的MIME字符串返回自定义的MIME类型,仅仅是用到了对字符串的处理。

PasteboardQt:对于剪切板的封装,封装一些设置剪切板内容的工作

PlatformKeyboardEventQt:主要是2个关于平台相关的按键转换函数,需要移植

PlatformMouseEventQt:对于鼠标事件的封装

PlatformScreenQt:封装了关于得到窗口尺寸的函数,需要重写

PlatformScrollBarQt:对平台用的滚动条进行封装,不同的GUI引擎用到的滚动条接口不一,移植比较麻烦,需要结合上层代码重写

PlugInInfoStoreQt:插件管理器,可以考虑参考GTK的方案放弃支持

PopupMenuQt:对弹出式菜单的封装

QWebPopup:貌似实现了弹出式的菜单,里面的做法是用qcombobox开虚拟了一个菜单

RenderThemeQt:实现了UI部分绘图的工作,里面区分了各控件的种类然后进行绘制,需要移植,比较麻烦

ScreenQt:无用,没有编译

ScrollViewQt:一个必须要用的控件,实现了一些接口的封装,实现比较麻烦

SearchPopupMenuQt:无用,所有函数返回空即可

SharedTimerQt:一个计时器,QT用的是Qtimer进行封装

SoundQt:调用一个系统铃声的函数

SystemTimeQt:返回系统时间

TemporaryLinkStubsQTGTK都没有实现,可以忽略

ThreadingQt:主要是做了一些线程方面需要支持的封装,QT的和Gtk的实现的东西不大一样,大多没有用处,ms仅仅callOnMainThread函数需要实现

WheelEventQt:需要实现,目的不明

WidgetQt:对于窗口的一个封装,各个平台封装不一,可按照其中一个作为参考

WebCore/platform/text

里面代码主要是对于基本字符的处理,个平台实现方式不一,webkit本身提供一套字符机制,可以沿用,也可以根据平台重载关键部分做一些修改,如QT的方式和mac的方式

WebCore/platform/network

ResourceResponse.h:写了一个需要实现的派生类,但是在qt下没有实际意义,在maccf下有具体实现。

其余文件都是针对于Http服务而写的一些辅助类,由于没有整体架构概念,目前难以理解

WebCore/platform/graphics

AffineTransformQt.cpp:对于平台基本图形几何变换用的类函数封装

ColorQt:封装Color属性的类

FloatPointQt:关于Float点属性类的一个包装

FloatRectQt:关于浮点数属性的矩形类包装

FontCacheQt:关于字体包装后的一个扩展实现,个平台封装的很简单,基本没实现

FontCustomPlatformData:对于内存字体的管理,除了mac意外其余几乎没有做实现,可参照qt的做法

FontQt:对于字体基本操作的封装

GraphicsContextQt:基本绘画的另外上层封装

IconQt:对Icon处理的类

ImageBufferQt:关于Image处理的几个函数,可能用于中间数据转换用

ImageDecoderQt:一个图片处理的接口类,实现比较复杂

ImageQt:一个图片的接口类,许多实现依靠外部实现,比较复杂

ImageSourceQt:在上述2个文件之上的又一个封装,也是实现了关于图片操作的细节

IntPointQtIntRectQtIntSizeQt:这3个类如同名字,仅仅是对于数据结构类的一种封装

PathQt:对于QPainterPath的一个封装,其他平台ms没有

SimpleFontData:对于字符之上的另一个封装, QT没有实现功能,其他平台有实现

 

l  Webkit部分

许多Webcore部分的许多扩展是通过外部的Webkit中的代码加以实现,还有需要Webkit的对象是通过对Webcore已经原有的类进行集成,其中,比较重要是网络和数据IO部分,是通过Webkit的对象读取网络或者本地的数据资源,另外,其实现的方式是通过线程内的任务模式,有任务队列进行收发工作,如有另外的Page则通过另外的一个任务队列进行。

数据IO流程:

首先是上层调用的loader(***),里面就是URL或者是本地文件,对参数进行打包后一步一步,最终调到QWebNetworkInterface::addJob函数,在任务队列中增加新的任务,如果是本地文件,则用FileIO的形式进行读取,如果是Http的,则启动QHttp类的对象进行IO,直到取得数据为止

数据接收完成后会依次调到

MainResourceLoader::didFinishLoading

FrameLoader::finishedLoading

DocumentLoader::finishedLoading

其中就有对于数据分析和刷新GUI的工作。

所以可以看出,除了GUI需要移植意外,还有很多网络工作需要完成,QT版本是通过Http类进行Http方面的收发工作,Mac的流程与QT如同,需要考虑移植Http开源库进行收发。

补充:看过CURL的库,支持Http协议的手法和解析,但是CURL库需要的库我在这里列一下,对于CURL,笔者没有进行多余分析。 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值