以前写了几篇载入流程的说明,是从下向上看,有点仅仅见树木不见森林的感受。通过近期一段时间的学习,有了能加以归纳抽象的方法。web
WebKit载入流程和页面组成是直接相关的,页面就是WebKit要载入的对象。算法
因此WebKit负责载入的类也与负责页面管理的类相相应。Apple关于WebView的说明里清楚表现了页面视图上的MVC结构:数组
一个页面从元素上也有其层次结构。并且和载入类相应,例如如下:缓存
从页面元素上讲WebView表明了一个页面的呈现。相应一个Page. 一个Page包括一个或多个Frame,当中一个称为Main Frame,其余的Frame(iframe或object元素引入HTML)称为Sub Frame。每一个Frame,从JavaScript里都有一个window和document对象。网络
页面中的Frame,Document和子资源,相应到载入的FrameLoader, DocumentLoader和SubresourceLoader。当中Frame可以进行导航(Navigation)操做。即载入、又一次载入、前进、后退操做,而Document则表示一个详细的HTML文档,没有导航操做。post
从这里看到的几个Loaders都是载入的逻辑表示,实际的载入行为交给ResourceLoader(s)。即MainResourceLoader和SubresourceLoader来完毕,当中包括了资源载入的队列管理操做(ResourceLoadScheduler)。学习
ResourceHandle在WebKit中是一个重要的port接口,与各个平台的网络层适配,表明了一个详细的网络载入任务。spa
从上面可以知道FrameLoader表明了Frame的载入行为。DocumentLoader表明了Document的载入行为。为了区分载入的进程。FrameLoader对载入状态进行了区分。并且让DocumentLoader在不一样的状态间转换。除此以外FrameLoader还另外使用一个状态机。管理Frame载入显示的状态(FrameLoaderStateMachine)。.net
除此之此,FrameLoader还要维护历史项(HistoryController),以相应处理Navigation操做, 详细项目定义在FrameLoaderTypes.h中。设计
相对FrameLoader而言,DocumentLoader相对简单一些,它的任务就是调用一个MainResourceLoader载入主文档。因为状态的转换在FrameLoader里完毕了。子资源的载入依托于DocumentLoader来管理。
正如页面元素从属于Document存在同样,负责子资源的载入的类从属于Document,后来又移到了DocumentLoader类中。就造成了如下的关系:
至于CachedResourceLoader,事实上就是一个封装类。封装了建立各种CachedResource的功能。
各个需要进行载入的页面元素会继承自CachedResourceClient,建立CachedResourceRequest, 经过DocumentLoader/Document里的CachedResourceLoader发起请求。
如下是Script元素发起请求的调用:
为了让用户有更快的应用体验。缓存机制不能少。
在WebKit里CachedResource/CachedResourceLoader的命名里之因此有了Cached,就是因为它们中缓存的交互。
WebKit也有一些算法上的说明,可以參考这里。
在HostInformation里存储着两个两个列表,一个是使用不一样优先级数组存储的等待载入的列表,一个是正在载入的列表。
使用scheduleServePendingRequests处理排队的请求时,会按优先级依序运行。
如下是基本流程:
以上就是载入流程的概要性说明,中间缺乏一些流程内容。可以參考如下两个连接:
[WebKit]WebCore之页面载入的设计与实现(二)
[WebKit]WebCore之页面载入的设计与实现(三)
转载请注明出处: http://blog.csdn.net/horkychen