webkit派生资源加载流程

【参考地址】http://www.cnblogs.com/lfsblack/p/5342631.html

在派生资源的加载中, SubresourceLoader 更多起到的是一个转发的作用,通过它的 client ( SubresourceLoaderClient 类)来完成操作。


各个加载阶段的处理在 SubresourceLoaderClient 的派生类CachedResourceRequest,Loader,IconLoader 中完成。 Client 会创建 SubresourceLoader。
请求发起阶段, ResourceLoadScheduler 负责对 SubresourceLoader 进行调度。


Document 类会创建 CachedResourceLoader 类的对象 m_cachedResourceLoader,这个类 ( 对象 ) 提供了对 Document 的派生资源的访问接口 requestImage ,requestCSSStyleSheet , requestUserCSSStyleSheet , requestScript , requestFont ,requestXSLStyleSheet , requestLinkPrefetch 。为了实现这些接口,CachedResourceLoader 需要创建 CachedResourceRequest 对象来发起请求。

一般情况下,一个 Document 拥有一个 CachedResourceLoader 类实例。
MemoryCache 类则对提供缓存条目的管理,可以方便地进行 add , remove ,缓存淘汰等。具体的缓存条目则是通过 CachedResource 类存储, MemoryCache 类维护了一个 HashMap 存储所有缓存条目。
HashMap <String,CachedResource> m_resources;
CachedResourceRequest 依赖于 CachedResource, 在 CacheResourceRequest 的构造函数中,会传入 CachedResource 对象作为参数。 CachedResource 既存储响应体部,也存储同 cache 相关的头部。在发起请求前,会检查是否有 cache 的 validator ,在收到响应的时候,则需要更新对应的头部。 CachedResource 类实现了 RFC2616 中的缓存一节。实际上 CachedResource 类真正完成了同网络的通信。 CachedResource 类根据申请的资源类型派生出不同的子类


对于资源的加载客户端CacheResourceClient及其子类的关系如图


CachedResource 类的使用者必须是 CachedResourceClient, 在这个类中维护了CachedResourceClient 类的集合 m_clients 。每一个 Client 通过 addClient 和removeClient 将自己加入到该类的 Client 集合中。 CachedResourceClientWalker 则提供了 CachedResouceClient 的一个遍历接口。当数据来齐的时候, CachedResource 类会通过 CachedResouceClient::notifyFinished 接口通知使用者。

下图是 Image 元素对应的几个类关系


下面以 image 为例分析其加载过程

1.   解析 html 页面的时候,解析到 img 标签,调用 HTMLImageElement::create创建 HTMLImageElement 对象,该对象包含 HTMLImageLoader 对象m_imageLoader
2.   解析到 img 的 href 属性,调用ImageLoader::updateFromElementIgnoringPreviousError
3.   调用 ImageLoader::updateFromElement
4.   调用 CachedResourceLoader::requestImage
5.   调用 CachedResourceLoader::requestResource( 根据缓存的情况确定是否可以从缓存获取,或者需要 revalidate ,或者需要直接从网络获取 )
6.   调用 CachedResourceLoader::loadResource
7.   根据 Resource 的类型调用 createResource 创建对应的 CachedResource
8.   调用 MemoryCache::add 在 cache 中查找是否有对应的 cache 条目,如果没有创建之
9.   调用 CachedImage::load
10.  调用 CachedResource::load
11.  调用 CachedResourceLoader::load
12.  调用 CachedResourceRequest::load
13.  创建 CachedResourceRequest 对象,它将作为 SubresourceLoader 的 client
14.  调用 ResourceLoaderScheduler::scheduleSubresourceLoad
15.  调用 SubresourceLoader::create
16.  ResourceLoadScheduler::requestTimerFired
17.  调用 ResourceLoader::start
18.  调用 ResourceHandle::create 发起请求
19.  收到 HTTP 响应头部,调用 ResourceLoader::didReceiveResponse
20.  调用 SubresourceLoader::didiReceiveResponse
21.  调用 CachedResourceRequest::didReceiveResponse 处理响应头部,特别是同缓存相关的头部,比如 304 的 status code
22.  调用 ResourceLoader::didReceiveResponse
23.  收到体部数据,调用 ResourceLoader::didReceiveData
24.  调用 SubresourceLoader::didReceiveData
25.  调用 ResourceLoader::didReceiveData
26.  调用 ResourceLoader::addData 将数据存储到 SharedBuffer 里面
27.  调用 CachedResourceRequest::didReceiveData
28.  数据来齐 , 调用 ResourceLoader::didFinishLoading
29.  调用 SubresourceLoader::didFinishLoading
30.  调用 CachedResourceRequest::didFinishLoading
31.  调用 CachedResource::finish
32.  调用 CachedResourceLoader::loadDone
33.  调用 CachedImage::data ,创建对应的 Image 对象,解码




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值