WebKit 代码阅读笔记 (一) 理解WebKit Port

所谓一个WebKit Port,并没有确切的形式,可以看作是OS,平台(应用程序框架),JS引擎,以及各种第三方库的一个组合。

  • 比如WinCairo Port,就是OS=Windows,GraphicsLib=Cairo的一个Porting
  • Qt Port是一个跨平台的Port,Qt本身是跨平台的,所以WebKit对OS的依赖性就依靠Qt本身来解决

WebKit Port通常处于以下几种目的

  • 使用WebKit作为浏览器(或者类似的User Agent)的页面解析,排版和渲染的核心,如Safari,Chrome
  • 对WebKit进行封装,对外提供构建一个浏览器(或者类似的UA)的API接口,如Qt
  • 以上两者皆有,如Android,iOS,BlackBerry

对于一个WebKit Port,必须提供的部分包括:

  1. Threading:线程支持
  2. Timer:计时器支持
  3. File System:文件系统
  4. Network:网络(网络甚至都不一定是需要的,如果Port不支持网络请求,而是只支持从文件系统读取的话…)
  5. Graphics Engine/Drawing Surface:绘图引擎/绘图表层
  6. Theme:页面内的各种输入组件的绘制(滚动条,按钮,输入框等),交由外部绘制的原因是它们通常需要符合相应的平台的感观(Look&Feel)

这里很重要的一点在于,WebCore本身并不一定需要一个窗口环境才能运作:

  • 它需要一个绘图表层来绘制页面,但是并不关心这个绘图表层是来自于一个Widget还是一个离屏位图,是否需要和如何将最后的页面显示输出到一个Widget上面是Port自己的事情。
  • WebCore中的页面可以接收各种各样的输入事件,它处理这些事件和其它因为JS产生的事件,根据处理的结果更新自己的显示,如果产生一些进阶的事件需要外部进行处理,这时就会调用Port提供的相应的回调接口交由Port来处理。但是这些输入事件可以来源于用户真正的输入,然后通过外部的窗口环境转发给页面,但也可能是模拟的事件,WebCore本身并不关心这一点

简单的说,WebCore本身对外定义了一个干净,清晰的接收输入事件,输出页面显示的接口,并且定义了各种事件的回调接口,Port可以对输入/输出接口进行适配,并且根据自己的需要实现相应的回调接口,来达成WebCore跟窗口环境的整合,所以对于一个WebKit Port,以下是可选的部分:

  1. 将平台产生的输入事件转发给页面处理
  2. 将页面的显示输出一个Widget的Surface上面
  3. 处理输入/输出过程中产生的一些事件的回调,和其它各种各样的回调,比如网络请求和响应的处理,弹出对话框,创建新窗口等等
  4. 插件的创建和绘制
  5. 提供自己的API封装

WebCore的这种架构引入了很多抽象层,带来额外的系统复杂性,但是获得了对各种不同平台,不同的窗口环境,不同的系统架构支持的灵活性,这也是它成功的主要原因。


更多:

QtWebKit Visual Studio 2008 编译和调试环境建立指南

https://rogeryi.wordpress.com/2011/06/08/qtwebkit-visual-studio-2008-compile-debug-env-setup-guide/

Chrome的编译:https://rogeryi.wordpress.com/2011/03/29/chrome-webkit-build-on-windows/

WebKit资源收集 https://rogeryi.wordpress.com/2011/03/28/webkit-resources/

Advertisements