谈到WebKit,我觉得还是挺有缘分的。本人在大学其实是做Java开发,然而大学毕业后的第一份工作却是做了基于WebKit的浏览器。刚接触WebKit的时候,感觉代码实在太庞大,不知如何下手,不过在我组长的帮助下,还是慢慢开始嚼动了这块硬骨头。
刚开始的时候,你会觉得WebKit就是一块难啃的硬骨头,但是当你真正理解了一些知识之后,你会发现,它是一个有框架的老骨头,它除了搭建自身的框架,还将其他开源代码都组合起来。所以,看WebKit代码,一定不能钻进代码里了,那样你就苦逼的挠头发吧(当然不排除大牛)。经过这两年的研究,发现要想快速掌握WebKit,一定要先弄懂框架。废话不多说,上图!!
请原谅我网上随便扒图,哈哈,不过这幅图确实很到位!照着这个架构图去认识WebKit,你会很快就上手!WebKit代码主要分WebKit对外API、WebCore、JSCore和WTF,这些模块在目录结构上也非常明朗,大家看WebKit源代码目录结构就能一目了然。
WebKit对外API主要就是封装了一些基本接口,供应用层调用。我们在浏览器上经常会使用一些基本的功能,比如加载网页、刷新、返回上一页、收藏、处理按键鼠标事件等等。这些功能都是调用WebKit对外API实现的。当然,具体功能实现肯定不在WebKit对外API层,它只是负责封装。
WebCore模块是WebKit的关键,它主要负责渲染整个页面,也就是我们看到的页面整体的面貌都是由它完成的。它里面主要分为以下子模块:
Page:提供对外的总入口以及页面相关的Chrome、Setting、History等模块;
Document:解析html/xml/svg,生成DOM树的子系统;
CSS:负责CSS的解析和匹配;
Render:实现Layout和Render过程的子系统
Graphics:封装底层图形库,对上提供一套平台无关的绘制接口;
Network:封装底层网络库,对上提供一套与平台无关的网络加载接口;
Loader:负责网络IO、Form Submission、Memory Cache等;
Script:提供JS执行入口以及从C++对象到JS对象转换的Binding和Bridge;
Extension Modules:实现非DOM的HTML5扩展JS功能模块,如Worker、WebSocket、WebStorage、FileAPI等,可能需要相应的Custom Binding代码;
Plugin:用于加载NPAPI插件,需要Bridge模块完成和JS引擎的互动;
Editing:负责输入框文字编辑;
Inspector:负责调试页面,也就是浏览器常看见的“审查元素”之后弹出来的调试界面,具体实现需自己开发;
JSCore模块主要负责JS脚本的执行,WebKit默认采用JavascriptCore引擎,Android采用了V8。相比V8和JavascriptCore,网上有很多资料介绍其不同点,本人对这块研究也不是很深,之前编译两个引擎,执行同一份js代码做过对比,执行效率差别并不是很大,感兴趣的朋友可以研究一下,分享一下个人经验。
WTF模块全称Web Template Library,作为WebKit的主要基础库,它优雅的实现了智能指针、字符串操作、容器操作,提供了跨平台的原子操作、时间封装、线程封装、以及高效的内存管理手段。WebKit的WebCore模块大量使用了WTF库的代码,学懂了这一模块,看WebCore代码会事半功倍。
简单的介绍完了各个模块一些基础知识,对于刚接触WebKit的朋友是不是还是一头雾水。之所以先介绍这些模块是想告诉大家,以后看代码或者调试,遇到相关问题可以直接在这个模块里加打印或者打断点。先把各个模块弄清楚了,然后慢慢把所有模块组织在一起。这样学习起来就轻松加愉快了。