Introduce to WebKit2

来源:互联网 发布:音乐信息编辑软件 编辑:程序博客网 时间:2024/05/29 03:48

WebKit2是为WebKit引擎而设计的支持单独进程模型的API层。将Web的内容(Javascript,HTML,布局等)处理与应用程序UI分离,分别运行在两个不同的进程之中。这种分离的进程模型和Google的Chrome浏览器有几分类似,不同的是WebKit2将从引擎内部原生的支持这种多进程机制。通过将内容和展现相分离的方式,可以更加有效的提高浏览器的运行效率。

WebKit2提供了一套基于C语言的非阻塞API接口,为了实现WebKit2引擎中对这些API接口的非阻塞调用,WebKit2在设计的时候采用了以下几个方面的技术:

  • 以通知的方式回调客户端函数(比如,didFinishLoadForFrame),通过这种机制可以告知client发生了什么事情(目前WebKit版本中也大量的使用了该技术,用来通知client事件的发生)
  • 以策略方式回调客户端函数(比如,decidePolicyForNavigationAction),当引擎执行某一项操作时,通过该机制由实现具体功能的client来决定是否该操作被执行。
  • 策略设置(例如WKContextSEtCacheModel, WKContextSetPopupPolicy),该机制允许client重新定义策略,而不需要再通过回调的方式访问UIProcess。
  • 代码注入(例如,WebBundle),当所有其他的方法都无法完成时,可以通过代码注入的方式将代码载入到WebProcess中。不过按照WebKit官方文档所说,这个功能目前只是在计划中,还没有真正的在代码级实现。

WebKit的多进程架构

下图是之前webkit的进程架构图

从上图可以看到,之前的WebKit的ui进程和webkit内核进程都是运行在相同的进程空间。其中API Boundary表示和系统相关的api层,应用层使用webkit api使用webkit引擎,并且引擎使用该api访问系统资源。

接着,再看看新版的webkit2引擎的架构

从上图可以看到,webkit2将webkit引擎分成了2个部分,一个部分是和ui相关的操作,运行在一个进程中。而另外的webkit部分运行在独立的进程中。通过多进程机制的支持,增加了ui响应和引擎布的效率,同时也增强了系统的健壮性和安全性。

之前也提到,webkit2的多进程模型有点类似chrome的多进程模型,但是有一些不同之处,下图是chrome的进程模型:

从上图可以看到api bondary是在render进程的下方,也就是说ui绘制进程是在webkit框架之上扩展支持的。该部分的扩展是非webkit原生支持的,属于chromium代码的一部分,这导致无法在其他平台或者框架中支持多进程功能。

为了支持多进程的机制,在webkit中增加了两个新的子系统:

  • CoreIPC:为消息传递和事件处理提供支持。
  • DrawingArea:为交叉绘制区域提供了抽象。通过共享内存位图信息的方式,为多个进程绘制提供了支持。

目前,我只在Mac OS 10.6.3平台上编译并且体验了Webkit2,可以使用下面的方法加入多进程支持:

WebKitTools/Scripts/build-webkit –webkit2

原创粉丝点击