作者介绍: 灰熊(笔名),宅男一枚!喜欢中国象棋,乒乓球。十年浏览器开发相关工作经验。包括WAP手机浏览器,三星电子数字电视Webkit核浏览器和猎豹安全浏览器。 Blink介绍 Blink基于WebKit引擎开发,从Chrome28开始使用,并在持续修改优化中。实际上,Blink就是从WebKit fork 出来的另外一个代码分支。与此同时,Chrome的源代码和Webkit也有了很大区别,Google对Webkit的源代码重新进行了梳理,并且大幅度删减了不相关移植的文件。使代码的可读性更好,编译效率更高。 Webkit Glue介绍 Blink在WebKit上封装了一层,称为WebKit Glue。WebKit Glue层中,大部分类型的结构和接口都和WebKit类似,Chrome中依托WebKit的组件,都只是调用WebKit Glue层的接口,而不是直接调用WebKit中的类型。 这样WebKit版本升级接口有变化时,只需要修改WebKit Glue层,ChromeRenderer层代码保持不变;另外一个作用就是隔了绝WebKit 的数据类型, ChromeRenderer不使用WebKit 的数据类型最终也能调用到WebCore的接口。在下图中对应的执行路径为11和12。 图一 WebKit Glue层提供许多方便的类型转换(如,我们使用std::string取代WebCore::String,GURL取代KURL)。WebKit Glue对象都与Webkit对象相似,只是以"Web"作为前缀。例如,WebCore::Frame变成 WebFrame。WebCore的数据类型决不直接在Chrome使用。API都被加到WebKit Glue层,以方便Chrome Render模块中调用。 Webkit Glue代码分析 如下图所示:WebKit Glue起到了连接Chrome Renderer和WebKit的桥梁的作用。它和WebKit结合的很紧密,实际上是嵌入WebKit的一个子层,类似于实现了设计模式中的外观(Facade)模式。封装了WebKit的数据类型,比如WebCore::Frame, WebCore::Node等。 Chrome Renderer直接调用WebKit Glue对象,从而操作WebKit对象。另一方面,WebKit Glue通过Client接口保持Chrome Renderer对象的引用,实现了反向依赖注入。 如下表所示,WebKit Glue代码可以分为“接口声明”和“具体实现”两部分。接口声明部分的代码位于目录“third_party\webkit\public\web”。实现部分代码位于目录“third_party\webkit\source\web”。“接口声明”部分代码又可以分为两部分:封装类型和Client。
Webkit Glue初始化接口 这个接口定义在文件“third_party\webkit\public\web\WebKit.h”。 主要包括两个函数:初始化Webkit函数,停用WebKit函数。 执行流程实例 WebView实例:当页面得到焦点时调用WebCore::Frame::View::paintContents方法的调用栈。Webkit Glue 层的WebView::setIsActive方法起到了中转传递的作用。 其中,RenderViewImpl与WebViewImpl之间的连接关系UML类图如下所示: 响应处理WebKit事件。对应图一中的21和22. 如下面的UML类图所示,所有事件被ChromeClient转发给WebView,然后通过WebViewClient传递给RenderViewImpl。 实例:网页的show事件最终会被被转发给RenderWidget::show 结语 本文简要介绍了WebKit Glue层。代码实例参照Chrome34.0.1847.137分析。Blink的代码仍然出于活跃的变动之中,所述代码路径和名字空间可能会和其它版本有所出入,仅供参考! |