学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com
分类: 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 对象,解码