WebKit如何加载一个Web页面及JavaScriptCore简介

翻译自官方文档http://webkit.org/blog/1188/how-webkit-loads-a-web-page/

WebKit在渲染页面之前,需要先加载页面并从网络下载该页面上的所有子资源。从web上加载资源涉及到很多层次,本文重点解释WebKit的主要渲染组件WebCore在加载过程中发挥的作用。

 

WebKit包含两个加载管道,一个用于加载文档(documents)到框架(frames)中,另一个用于加载子资源(如图像、脚本)。下图总结了这两个管道涉及的主要对象。

 

加载框架

FrameLoader负责加载文档到框架中。每当你点击一个链接时,FrameLoader都会创建一个新的DocumentLoader对象并将其状态置为policyDocumentLoader对象等待WebKit客户端做出是否处理此加载的决定。一般客户端会指示FrameLoader将该加载视为导航(navigation)。

 

一旦客户端指示FrameLoader将该加载视为导航,FrameLoader进一步将DocumentLoader置为provisional状态,该状态触发一个网络请求并等待确定该网络请求是否会带来一个下载或者一个新的文档。

 

接下来,DocumentLoader会创建一个MainResourceLoader,其任务是通过ResourceHandle接口和平台网络库交互。将MainResourceLoaderDocumentLoader分开的目的是:(1MainResourceLoaderDocumentLoader与处理ResourceHandle回调的细节隔离开。(2)将MainResourceLoader的生命周期和DocumentLoader(被捆绑到Document上)的生命周期解耦。

扫描二维码关注公众号,回复: 752737 查看本文章

 

一旦加载系统受到来自网络的足够的信息断定资源实际上是一个文档,FrameLoader则将DocumentLoaer置为committed状态,进而将框架过渡到显示新文档。

 

加载子资源

显示一个web页面的要求不止有组成文档的HTML。我们还需要加载图像、脚本和其他该文档引用的子资源。DocLoader负责加载这些子资源。(注意虽然DocumentLoaderDocLoader有相似的名字,但它们的角色很不同。)

 

以加载图形为例,为了加载一个图像,DocLoader首先查询Cache中是否有该图像在内存中的副本(CachedImaged对象)。如果图像已经在Cache中,DocLoader则立即使用该图像响应。为了更高的效率,Cache经常存储解码后的图像在视频内存中,以便WebKit不需要再次解压缩相同的图像。

 

如果图像不在Cache中,Cache会创建一个新的CachedImage对象来表示该图像。CachedImage对象要求Loader对象触发一个网络请求,Loader则创建一个SubresourceLoaderSubresourceLoader在子资源加载管道中扮演类似于MainResourceLoader在主资源下载通道中的角色,即SubresourceLoader直接跟平台的ResourceHandle接口打交道。

 

待改进的地方

WebKit的加载管道有很多需要改进的地方。FrameLoader明显比需要的复杂得多,并且包含了除加载框架之外更多的任务。例如,FrameLoader有几个略微不同的方法都命名为load,这容易让程序员迷惑。加载管道的不同的阶段过于紧耦合,低层次的对象可能直接和高层次的对象交互。例如,MainResourceLoader将从网络收到的字节流直接传递给FrameLoader,而非DocumentLoader。还有,Cache仅用于子资源,主资源下载没能使用WebKit的内存缓存。如果能解决这个问题,webpage的下载速度能大大提高。

 

JavaScriptCore简介

JavaScriptCoreWebKit的内置JavaScript引擎,它包括以下内建模块:词法分析器、语法分析器和解释器。词法分析器将脚本源码分割成一系列的token,语法分析器利用这些token国建对应的语法树,解释器执行语法分析器产生的二进制代码。

 

JavaScriptCore的词法分析器的大部分代码在parser/Lexer.hparser/Lexer.cpp中;JavaScriptCore语法分析器使用了递归下降分析算法(recursive descent parser),代码在  parser/JSParser.hparser/JSParser.cpp中;JavaScriptCore有两种解释器:基于字节码的和基于JIT的。前者在虚拟机中运行字节码,后者使用JIT编译方法产生本地机器码以便能够更快地执行。大部分的解释器代码在子目录interpreter/下,JIT编译器的代码在子目录jit/下。

 

 

WebKit共有30-35W行代码

猜你喜欢

转载自andrewstz.iteye.com/blog/1725907
今日推荐