Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1077163
  • 博文数量: 77
  • 博客积分: 821
  • 博客等级: 军士长
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 16:17
个人简介

学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com

文章分类

全部博文(77)

文章存档

2016年(4)

2015年(15)

2014年(16)

2013年(12)

2012年(21)

2011年(9)

分类: C/C++

2013-02-07 10:34:15

      接上篇的加载主资源流程后,流程走到了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 对象,解码

       

阅读(7417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~