WebKit如何加载网页

在能够渲染一个网页之前,WebKit需要把该网页和它的子资源从网络上下载下来。从网络上加载资源涉及到很多层次。本文将重点解释WebKit的主要的渲染组件,WebCore,是如何参与加载过程的。
WebKit包含两条加载线,主文档加载(加载文档到frames中)和子资源(images and scripts)加载。下图总结了两条加载线所涉及的主要对象。


Loading Frames

FrameLoader负责加载文档到frames中。当你点击一个链接时,FrameLoader启动,首先创建一个新的DocumentLoader对象,并处于“policy”状态,等待WebKit客户端确定如何处理这次加载。通常,客户端将指示FrameLoader把加载当做一次正常的网页浏览(Navigation)(另一个策略可能是阻止加载)。
FrameLoader收到导航指示后,它会把DocumentLoader推进到“provisional"状态,FrameLoader发出一个网络请求,并等着确定网络请求是否导致了内容下载或新文档。
接着,DocumentLoader创建一个MainResourceLoader,它的工作是通过ResourceHandle接口与平台网络库进行交互。分为DocumentLoader和MainResourceLoader有两个目的:(1) MainResourceLoader对DocumentLoader(被绑定到Document)隔离了处理ResourceHandle回调的细节 (2) 使得MainResourceLoader的生命周期与DocumentLoader的生命周期相互独立。
一旦加载系统已经从网络收到了足够多的信息,可以确定该资源是一个文档,FrameLoader就把DocumentLoader推进到 "committed"状态,对Frame进行转化,显示收到的新文档。

子资源加载

当然,显示一个网页不仅仅需要组成主文档的HTML。我们还需要加载主文档引用的图片、脚本、和其它子资源。DocLoader负责加载这些子资源。(注意,尽管DocumentLoader和DocLoader名字很类似,但它们扮演的角色是很不同的。)
让我们以一个典型的例子,加载一副图片为例。DocLoader首先询问Cache,内存中是否已有该图片的副本(以一个CachedImage对象的形式存在)。如果该图片已经在缓存中,DocLoader就能立即使用缓存中的副本做为响应。出于效率考虑,the Cache常常在视频内存中保存解码后的图片,这样WebKit就不必重复解压同一副图片。
如果图片不在缓存中,the Cache就创建一个新的CachedImage对象来代表这幅图片。CacheImage对象通知"Loader"对象发送一个网络请求,Loader通过创建一个SubresourceLoader来完成这件事情。SubresourceLoader在子资源加载线中扮演的角色类似于MainResourceLader在主文档加载线中扮演的角色,它们都最为直接的同平台相关的ResourceHandle接口进行交互。

改进的地方

我们可以从很多方面来改进WebKit的加载流水线。FrameLoader没必要那么复杂的,而且它包括了很多任务,而不仅仅是简单的加载一个frame。例如,FrameLoader有许多略微不同的“load”方法,可能引起混淆,而且它还负责创建新的窗口(new windows),这看起来和加载a frame没什么关系。此外,加载流水线的各种策略耦合过紧,还有很多地方低层对象直接同高层对象交互,这违反了分层原则。例如,MainResourceLoader把从网络层收到的字节直接发送给FrameLoader,而不是DocumentLader。
如果你仔细看了上面的图,你会注意到只有子资源才用到了Cache。显然,主文档加载没有利用到WebKit的memory cache。如果我们能统一这两条加载线,我们就可以改善主文档加载的性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章