设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

Blink WebKit-Glue层分析

2014-10-11 10:36| 发布者: joejoe0332| 查看: 4602| 评论: 0|原作者: csdn|来自: csdn

摘要: Blink基于WebKit引擎开发,从Chrome28开始使用,并在持续修改优化中。实际上,Blink就是从WebKit fork 出来的另外一个代码分支。与此同时,Chrome的源代码和Webkit也有了很大区别,Google对Webkit的源代码重新进行了 ...
作者介绍:
  灰熊(笔名),宅男一枚!喜欢中国象棋,乒乓球。十年浏览器开发相关工作经验。包括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。



封装类型
Client

接口声明

(third_party\webkit\public\web)

WebWidget.h

WebView.h

WebFrame.h

WebWidgetClient.h

WebViewClient.h

WebFrameClient.h

具体实现

(third_party\webkit\source\web)

WebViewImpl.h

WebFrameImpl.h

(content\renderer)

render_widget.h

render_view_impl.h


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的代码仍然出于活跃的变动之中,所述代码路径和名字空间可能会和其它版本有所出入,仅供参考!


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部