Webkit学习 --- 解析HTML获取网页子资源流程


      接上篇的加载主资源流程后,流程走到了DecodeDataDocument的appendBytes接口,在这个接口里,调用了传来的DocumentWrite的createDecodeIFneed接口,创建TextResourceDecode,参数为下载了的HTML文件的mimetype和setencode等进行设置,然后通过TextResourceDecode的decode接口进行HTML的解码工作(具体解码流程以后再详细介绍,现在先略过),最后把解码数据返回到HTMLDocumentParse的append接口中去,进行HTML的解析工作。

     先来看下操作流程的栈信息:

     

     之后就是进行HTML的词法解析和资资源下载的流程了吧,解析主要是在流程走到HTMLDocumentParse的pumpTokenizer进行的,详细的就不多说了,本人也没完全研究透彻以后再不上,下面主要还是说说在解析HTML过程中遇到子资源的处理过程。

     子资源的下载流程很当然的我们会去看源码目录下的loader文件夹,会发现里面有个叫cache的文件夹,在往里看,就发现有很多cache的文件,这些其实就是在解析HTML的时候对相应的子资源的下载处理过程.这里以网站img子资源做介绍

     主要的栈调用过程:

      

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、付费专栏及课程。

余额充值