第三章 webkit 架构和模块
1.Webkit 构架和模块
1.1 获取WebKit
WebKit是一个开源项目,获取地址为:www.webkit.org,可以通过git或svn方式获得。
1.2 Webkit 架构
因为不同浏览器的需求,在Webkit中,一些代码是可以共享的,但是另一部分是不同的,这些不同的部分称为Webkit的移植(Ports)
虚线部分代表该模块在不同浏览器使用的 WebKit 内核中的实现是不一样的(不是普遍共享),实线框标记的模块表示基本上是共享的。
从上图可以看出,这个WebKit内核,划分为三个层次。
(1)操作系统层:WebKit可以在不同操作系统上工作,如Windows、Mac OS、Linux、Android等。
(2)第三方库,是WebKit'运行的基础,包括:图形库、网络库、视频库等,并且随着浏览器的功能越来越强,性能要求越来越高,新的技术不断的被引入浏览器和Web平台,这也大大的增加了浏览器的复杂性。
(3)最上面的webkit部分就是webkit的项目了,这部分粗略划分成两层,每一层都包含很多模块,这里不能一一细细介绍,后面会在其他博客专题细化介绍。
WebCore部分包含了被各个浏览器所使用的 Webkit 共享部分,这些都是加载和渲染网页的基础部分,他们必不可少,具体包括HTML解释器、CSS解释器、SVG、DOM、渲染树(renderObject, renderLayer),以及Inspector(调试器)。
JavaScriptCore 引擎是 Webkit 中默认的 Javascript 引擎。在Webkit中,对 Javascript 的调用是独立于引擎的。在 Google 的 Chrominum 中,它被替换成 V8 引擎。
Webkit Ports 指的是 Webkit 中非共享部分,对于不同浏览器使用的 Webkit 来说,移植中的这些模块由于平台差异、依赖的第三方库和需求不同等方面原因,往往按照自己的方式来设计和实现,这就产生了移植部分,这是导致众多 Webkit 版本的行为并非一致的重要原因。这其中包括硬件加速构架、网络栈、视频解码、图片解码等。
嵌入式编程接口是提供给浏览器调用的。因为接口与具体的移植有关,所以有一个与浏览器相关的绑定层(可能不同的平台调用的同一个功能的 webkit 的接口不一样)。绑定层上面就是 Webkit 项目对外暴露的接口层。
图中没有展现出来的是一些测试用例,包括布局测试用例(Layout Tests)、性能测试用例(Performance Tests),包含了大量的测试用例和期望结果,并且在不同系统移植测试中,共享了大量的测试用例,为了保证代码的质量,这些用例被用来验证渲染结果的正确性。每个浏览器所用的webkit必须保证能够编译出来一个可执行程序,称为DumpRenderTree,它被用来运行测试用例并将渲染结果同期望结果对比。
1.3 Webkit 源码目录
Webkit共有500万行代码。规模庞大,只能通过清晰的目录结构,来了解功能模块。
从上面图上可以看出:
(1)一级目录中:重要的目录有四个:LayoutTests、PerformanceTests、Source和Tools。最重要的目录是Source。
(2)二级目录:重要的目录包括 JavaScriptCore、Platform、WebCore、Webkit、Webkit2和WTF。
JavaScriptCore 是 Webkit 渲染引擎的默认 Javascript 引擎。
Platform 本来是 Chrominum 接口代码目录之一,现已被移除。
WebCore 就是前面图中 WebCore 对应的相关代码。
Webkit 和 Webkit2 是绑定和嵌入式接口层。
WTF是一个基础类库,有点像C++的STL库,其中包括字符串操作、各种容器、智能指针、线程、算法等。
(3)三级目录,重要的三级目录,主要是指属于二级目录WebCore和Webkit2,在WebCore中,如CSS解释器、DOM、HTML解释器、资源加载,Web Inspector等。在WebKit2主要包含两种类型的目录,第一类是各个进程的代码,如Web进程、UI进程、网络进程、插件进程和它们的共享代码等。第二类就是各个移植的一个简单的主函数(main)入口,拥有构建一个基于WebKit2的接口最简单的可执行程序。