Webkit Painting and Event Flow 绘屏和事件 探讨

来源:互联网 发布:索引超出矩阵维度 编辑:程序博客网 时间:2024/06/15 02:28

 

    WebKit来自khtml, 以前khtml中, 整个页面是一个大qscrollview, 网页上的控制元素就是Qt里的控件, 可能是为了移植方面原因, 现在webkit中没有用传统的控件概念来实现网页上的button等元素, 而是把控件的两个主要功能分离出来, (painting 和 事件响应 ) 各走一套接口和platform对接.  Webkit自己来完成整个 事件-响应-绘图 的逻辑. 对于移植来说, 这自然是一个很好的构架, 不用深入内部, 只要把两头接口做好就OK了: 丢进去事件, 等待WebKit来调用paint函数.


事件

 

    为了理清楚事件的流程, 我用gdb来帮忙. 在浩如烟海的的代码中找到一两个流程的必经之地, 设置断点, 再用backtrace倒过来看WebKit是怎么跑到这个函数的.

 

以浏览网页最常见的一个操作为例, 点击链接打开新页面. 事件的传播流程如下:

 

 

这个过程得到点击处的RenderObject, 如果该对象isLinke() 那么再触发打开连接的事件. 至于打开链接的流程这里先不涉及了.

 

 

 

Painting

 

相关的文件最主要的两个:

RenderTheme.h/cpp
RenderThemeQt.h/cpp

 

RenderTheme 是关键的一个类.
RenderThemeQt继承了它, 重载了很多虚函数, 这些虚函数用来进行具体的绘制工作比如:


以paintButton()为例, 传进去的的参数包含了:
PaintInfo: 屏幕的buffer(QPainterDevice), 相当于画布,
IntRect: 绘制的区域
在指定的区域内, 就可以用QPainter来画button了. 至于是windows风格的还是mac水晶风格的, 还是简单的画个长方体, 那就任由发挥了.

 

 

 



上面是一些控件的流程, 常见的Text对象走的是另外一条路, 大概的backtrace如下:

 

 

备注:

WebKit版本是r39370.

Platform: Qt

 

 

 

原创粉丝点击