WebKit如何加载网页
2014-03-07 12:37
253 查看
在能够渲染一个网页之前,WebKit需要把该网页和它的子资源从网络上下载下来。从网络上加载资源涉及到很多层次。本文将重点解释WebKit的主要的渲染组件,WebCore,是如何参与加载过程的。
WebKit包含两条加载线,主文档加载(加载文档到frames中)和子资源(images and scripts)加载。下图总结了两条加载线所涉及的主要对象。
FrameLoader收到导航指示后,它会把DocumentLoader推进到“provisional"状态,FrameLoader发出一个网络请求,并等着确定网络请求是否导致了内容下载或新文档。
接着,DocumentLoader创建一个MainResourceLoader,它的工作是通过ResourceHandle接口与平台网络库进行交互。分为DocumentLoader和MainResourceLoader有两个目的:(1) MainResourceLoader对DocumentLoader(被绑定到Document)隔离了处理ResourceHandle回调的细节
(2) 使得MainResourceLoader的生命周期与DocumentLoader的生命周期相互独立。
一旦加载系统已经从网络收到了足够多的信息,可以确定该资源是一个文档,FrameLoader就把DocumentLoader推进到 "committed"状态,对Frame进行转化,显示收到的新文档。
让我们以一个典型的例子,加载一副图片为例。DocLoader首先询问Cache,内存中是否已有该图片的副本(以一个CachedImage对象的形式存在)。如果该图片已经在缓存中,DocLoader就能立即使用缓存中的副本做为响应。出于效率考虑,the Cache常常在视频内存中保存解码后的图片,这样WebKit就不必重复解压同一副图片。
如果图片不在缓存中,the Cache就创建一个新的CachedImage对象来代表这幅图片。CacheImage对象通知"Loader"对象发送一个网络请求,Loader通过创建一个SubresourceLoader来完成这件事情。SubresourceLoader在子资源加载线中扮演的角色类似于MainResourceLader在主文档加载线中扮演的角色,它们都最为直接的同平台相关的ResourceHandle接口进行交互。
如果你仔细看了上面的图,你会注意到只有子资源才用到了Cache。显然,主文档加载没有利用到WebKit的memory cache。如果我们能统一这两条加载线,我们就可以改善主文档加载的性能。
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。如果我们能统一这两条加载线,我们就可以改善主文档加载的性能。
相关文章推荐
- WebKit/Blink 如何加载网页资源?
- Webkit是如何加载网页的
- Webkit是如何加载网页的
- 当用webBrowser1加载网页的时候,网页中出现js错误,会弹出一个提示,如何屏蔽不提示
- 【Android基础学习】webview加载网页,tel协议不会调出拨号盘?该如何处理
- 新技能Get:如何利用HTTP技术提升网页的加载速度
- WebKit加载网页的流程(dlmu2001)
- 如何通过预加载器提升网页加载速度
- WebKit加载网页的流程(dlmu2001)
- 跟我学建站3——如何有效减少网页体积,加载速度提升100倍
- 如何在mac上的safar调试Xcode中模拟器加载的网页
- 如何通过预加载器提升网页加载速度
- 网站打开速度优化:如何提高网页加载速度,提升网页打开速度
- 如何提升网页的加载速度?
- 如何有效减少网页加载时间?
- 如何优化网站页面提高网页的加载速度
- WebKit加载网页的流程
- 如何使用 EGOCache 来缓存和加载网页的速度更快
- 求助: Android 加载 webview, 点击webview 中网页时间, 如何触发 Android 事件
- 使用 PyQt 转换网页到 PDF(使用QtWebKit加载完毕后,打印整个窗口就行了,真简单!)