﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-小鸟学C++-随笔分类-webkit相关学习</title><link>http://www.cppblog.com/zjy17243/category/21186.html</link><description>基础学习</description><language>zh-cn</language><lastBuildDate>Fri, 04 Mar 2016 17:56:32 GMT</lastBuildDate><pubDate>Fri, 04 Mar 2016 17:56:32 GMT</pubDate><ttl>60</ttl><item><title>Webkit模块介绍（转载）</title><link>http://www.cppblog.com/zjy17243/archive/2016/03/04/212929.html</link><dc:creator>月下孤影</dc:creator><author>月下孤影</author><pubDate>Fri, 04 Mar 2016 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/zjy17243/archive/2016/03/04/212929.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、Webkit模块用到的第三方库如下：                                    cairo                                    一个2D绘图库                                                    casq...&nbsp;&nbsp;<a href='http://www.cppblog.com/zjy17243/archive/2016/03/04/212929.html'>阅读全文</a><img src ="http://www.cppblog.com/zjy17243/aggbug/212929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zjy17243/" target="_blank">月下孤影</a> 2016-03-04 19:51 <a href="http://www.cppblog.com/zjy17243/archive/2016/03/04/212929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Webkit学习 ----网页资源的构建加载流程 （转载）</title><link>http://www.cppblog.com/zjy17243/archive/2016/03/04/212921.html</link><dc:creator>月下孤影</dc:creator><author>月下孤影</author><pubDate>Fri, 04 Mar 2016 04:45:00 GMT</pubDate><guid>http://www.cppblog.com/zjy17243/archive/2016/03/04/212921.html</guid><description><![CDATA[<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp;Webkit的作用在这就不多做介绍了，本篇主要还是个人在源码分析了webkit之后的心得总结！</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp; &nbsp; webkit有上千个类，在这么错综复杂的结构里看流程无疑找死，好吧，用GDB调试看吧！</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp; &nbsp; 环境：webkit + Qt4.8.4 + gdb</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp; &nbsp; 调试之前，当然先要生成调试版本的程序了，关于调试环境的搭建后续文章会阐述。。。。。。。</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp; &nbsp; 现在就开始总结加载流程吧！</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp; &nbsp; 当我们在浏览器中输入网站地址后，会通过把url赋给ResourceRequest这个类，并将</span><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">ResourceRequest作为类参数传给Frameloader的load方法，</span><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">ResourceRequest从头文件看貌似是关于网络协议的一系列接口封装（以后再深入了解这个类，应该可以提取出来做自己为用</span><img src="http://blog.chinaunix.net/kindeditor/plugins/emoticons/images/44.gif" border="0" alt="" style="word-wrap: break-word; border: 0px;" /><span style="word-wrap: break-word; font-size: 14px;">）</span></span><span style="word-wrap: break-word; font-size: 14px;">。之后通过CreateDocumentLoader创建出documentloader对象（该对象负责对于请求资源动作的一系列封装，eg.请求数据，数据请求完成等动作的响应，其实就是对于下载接口的一层封装），并作为参数传给frameloader的load方法。</span></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;在该方法中，获取之前得到的ResourceRequest对象，通过addExtraFieldsToMainResourceRequest对于ResourceRequest对象中的一些关于http的头信息的内如注册，比如Agent字段和Accept字段等（其实就是填充HTTP协议头），接着通过调用loadwithDocumentloader进行正式的下载流程。</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;先来看下之前操作流程的栈信息：</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;&nbsp;</span><img src="http://blog.chinaunix.net/attachment/201302/6/24922718_13601416438G09.jpg" width="700" height="155.66037735849" alt="" style="word-wrap: break-word; border: 0px;" /></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">注：frameloader doucmentloader 和resourceRequest这几个类之间都是你中有我我中有你的好基友，所以都可以在各自的类中分别调用到</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;接着往下看，进入</span><span style="word-wrap: break-word; font-size: 14px;">loadwithDocumentloader之后，获取之前的resourceRequest对象的url，并将该url对象给到KURL类中（该类又是一个对于URL的功能封装），之后通过Documentloader的startloadingMainResource方法开始加载主页面数据（一般网页就是html文件），接着创建mainresourceloader类对象（这个类看名字就知道是做什么的了）</span></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">通过调用loadnow开始进行下载工作。</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;</span><span style="word-wrap: break-word; font-size: 14px;">先来看下之前操作流程的栈信息：</span></span></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;</span><img src="http://blog.chinaunix.net/attachment/201302/6/24922718_136014289439z2.jpg" width="700" height="364.58333333333" alt="" style="word-wrap: break-word; border: 0px;" /></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;因为我用的是Qt的port，所以具体的下载动作由Qt来做了，接着看数据接收的操作。</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;当数据下载完之后，</span><span style="word-wrap: break-word; font-size: 14px;">mainreso</span><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">urceloader的didreceivedata负责接收下载下来的数据，把接收的数据给到Documentloader，再由</span><span style="word-wrap: break-word; font-size: 14px;">Documentloader的方法commitload</span><span style="word-wrap: break-word; font-size: 14px;">发布加载的内容（在这一步中，浏览器先将旧的页面清除掉在加载新的页面），之后进过很多步的转发，给到了DOM文件夹中的DecodeDataDocumentParse的appendBytes。从这开始正式进入HTML的解压和词法解析流程，这之后将对HTML内容解析工作。</span></span></span></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;</span><span style="word-wrap: break-word; font-size: 14px;">先来看下之前操作流程的栈信息：</span></span></span></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;</span><img src="http://blog.chinaunix.net/attachment/201302/6/24922718_1360144594Q000.jpg" width="700" height="422.16494845361" alt="" style="word-wrap: break-word; border: 0px;" /></span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; &nbsp;总结下主要流程：</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word;"><span style="word-wrap: break-word;"></span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">1.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">DocumentLoader</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">MainResourceLoader::load</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">向</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">loader</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">发起请求</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">2.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">MainResourceLoader::loadNow</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">3.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">MainResourceLoader::willSendRequest</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">4.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceLoader::willSendRequest,</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">将</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">callback</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">通过</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceNotifier</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">传导给</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">FrameLoaderClient</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">。</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">Client</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">可以在回调中操作</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceRequest</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">，比如设置请求头部。</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">5.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">PolicyChecker::checkNavigationPolicy</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">过滤掉重复请求等</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">6.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">loader</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceHandle::create</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">向</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">Network</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">发起加载请求</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">7.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">收到第一个</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">HTTP</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">响应数据包</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">,Network</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">回调</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">MainResourceLoader::didReceiveResponse</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">，主要处理</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">HTTP</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">头部。</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">8.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;">PolicyChecker::</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"></span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;">checkContentPolicy,</span><span style="word-wrap: break-word;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">并最终通过</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">FrameLoaderClient</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">的</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">dispatchDecidePolicyForMIMEType</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">判断是否为下载请求（存在</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">"Content-Disposition"http</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">头部）</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">9.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">MainResourceLoader::continueAfterContentPolicy</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">，根据</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceResponse</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">检测是否发生错误。</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">10.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceLoader::didReceiveResponse</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">，将</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">callback</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">通过</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">ResourceNotifier</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">传导给</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">FrameLoaderClient</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">。</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">11.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">收到</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">HTTP</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">体部数据，调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">MainResourceLoader::didReceiveData</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">12.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceLoader::didReceiveData</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">，将</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">callback</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">通过</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">ResourceNotifier</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">传导给</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">FrameLoaderClient</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">13.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">MainResourceLoader::addData</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">14.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">DocumentLoader::receivedData</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">15.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">DocumentLoader::commitLoad</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">16.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">FrameLoader::commitProvisionalLoad</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">，</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">FrameLoader</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">从</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">provisional</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">状态跃迁到</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">Committed</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">状态</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">17.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">FrameLoaderClientQt::committedLoad</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">18.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">DocumentLoader::commitData</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">，启动</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">Writer</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">对象来处理数据（</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">DocumentWriter::setEncoding</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">，</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">DocumentWriter::addData</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">）</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">19.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">DocumentWriter::addData</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">20.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri;">DocumentParser::appendByte</span></span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">21.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">DecodedDataDocumentParser::appendBytes</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体;">对文本编码进行解码</span></p>
<p align="left" style="word-wrap: break-word; margin: 0cm 0cm 0pt 49pt; padding: 0px; color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 26px; background-color: #ffffff; text-indent: -21pt;"><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">22.</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-size: 14px; line-height: normal; font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">调用</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">HTMLDocumentParser::append</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">，进行</span><span style="word-wrap: break-word;">&nbsp;</span><span lang="EN-US" style="word-wrap: break-word; margin: 0px; padding: 0px; background-color: yellow; font-size: 14pt;"><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: Calibri; font-size: 14px;">HTML</span><span style="word-wrap: break-word; font-size: 14px;">&nbsp;</span></span><span style="word-wrap: break-word; margin: 0px; padding: 0px; font-family: 宋体; background-color: yellow;">解析</span></p>
<span style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial;"></span><br style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;" />
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 14px;">&nbsp; 好了，下载加载流程就到这，下篇会带来详细的HTML词法解析和压缩流程</span></p>
<p style="word-wrap: break-word; margin-right: 0px; margin-left: 0px; padding: 0px; color: #666666; font-family: 宋体, Arial;">转载地址：<a href="http://blog.chinaunix.net/uid-24922718-id-3487827.html" style="font-family: verdana, 'courier new';">Webkit学习 ----网页资源的构建加载流程</a></p>
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/zjy17243/aggbug/212921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zjy17243/" target="_blank">月下孤影</a> 2016-03-04 12:45 <a href="http://www.cppblog.com/zjy17243/archive/2016/03/04/212921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> [WebKit]WebCore之页面加载的设计与实现(三)（转载）</title><link>http://www.cppblog.com/zjy17243/archive/2016/03/03/212919.html</link><dc:creator>月下孤影</dc:creator><author>月下孤影</author><pubDate>Thu, 03 Mar 2016 13:41:00 GMT</pubDate><guid>http://www.cppblog.com/zjy17243/archive/2016/03/03/212919.html</guid><description><![CDATA[<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">关于页面加载,RFC2616(HTTP 1.1)做了很多的定义，WebKit的流程也是遵循这些定义的实现。这部分的实现主要放在之前提出的WebCore Loaders和HTTP Stack中。</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="white-space: pre;"></span><img src="http://img.blog.csdn.net/20140205000325656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none; max-width: 602px; height: auto;" /><br />
</p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">比如Chrome Net Stack(里面包含了HTTP Stack的实现)中实现了HTTP Cache, 而<a href="http://lib.csdn.net/base/15" target="_blank" style="text-decoration: none; color: #0c89cf;">Android</a>浏览器则是在HTTP Client中实现了HTTP Cache。 关于缓存，会专门在新篇中学习一下。另外在加载中的策略控制已经在第一篇中提到了，其它的还有错误处理、跳转等。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">下面补充几个场景下的流程。没有做进一步的总结，只是简单将流程列出来。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><br />
</span></p>
<h2 style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei';"><a name="t0" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">1.错误控制</span></h2>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">错误由HTTP Stack中抛出来，依次调用到CachedResource::error进行处理。这里要说明的是WebCoreResourceHandleAsDelegate本身只对应到ResourceHandle的，在错误处理调用则使用m_handle-&gt;client()的形式访问到了ResourceLoader。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><img src="http://img.blog.csdn.net/20140206235641734?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="950" height="405" style="border: none;" /><br />
</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><br />
</span></p>
<h2 style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei';"><a name="t1" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">2.跳转</span></h2>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">关于跳转，实际完全在HTTP Stack中完成的，只是会在跳转前通过willSendRequest的方式通知到DocumentLoader。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><img src="http://img.blog.csdn.net/20140206235705890?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="922" height="305" style="border: none;" /><br />
</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><br />
</span></p>
<h2 style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei';"><a name="t2" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">3. Subframe</span></h2>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">关于iframe,或是plugin之类的sub frame, 在加载时也是走DocumentLoader::startLoadingMainResource()的流程，不同的是它的发起者是SubframeLoader。它并不是继承自CachedResourceClient, 而是封装了一些上层的加载逻辑。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><img src="http://img.blog.csdn.net/20140206235735687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="922" height="407" style="border: none;" /><br />
</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">后续会根据HTTP 1.1协议中关于页面加载的定义展开一些WebKit的实现，特别是缓存的处理。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;"><br />
</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span class="s1"><span style="font-family: 'Microsoft YaHei'; font-size: 12px;">转载请注明出处:&nbsp;<a target="_blank" href="http://blog.csdn.net/horkychen" style="text-decoration: none; color: #0c89cf;"><span class="s2">http://blog.csdn.net/horkychen</span></a></span></span></p>
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/zjy17243/aggbug/212919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zjy17243/" target="_blank">月下孤影</a> 2016-03-03 21:41 <a href="http://www.cppblog.com/zjy17243/archive/2016/03/03/212919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> [WebKit]WebCore之页面加载的设计与实现(二) （转载）</title><link>http://www.cppblog.com/zjy17243/archive/2016/03/03/212918.html</link><dc:creator>月下孤影</dc:creator><author>月下孤影</author><pubDate>Thu, 03 Mar 2016 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/zjy17243/archive/2016/03/03/212918.html</guid><description><![CDATA[<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">从上次学习WebKit加载已经过去了大半年了，终于又有时间理一次加载流程。期望逐步完善细节，最后能有一个系统的总结。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">首先可以这样理解WebKit的加载逻辑，涉及三个主要的组件， 其中HTTP stack为各个平台下使用的HTTP协议模块，WebCore Loaders则依据页面加载及解析过程对加载不同HTML Element的控制，Loading Controller则具体实现了资源加载的行为控制:</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; text-align: center;"><span style="font-size: 12px;"><img src="http://img.blog.csdn.net/20140205000325656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="middle" width="373" height="202" style="border: none;" /><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">虽然从WebKit整体结构上这样理解不太严谨的，但单纯站在加载的角度来看，却有利于理解加载流程。因为HTTP Stack依赖平台实现，这里从中间的Loading Controller说起。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">Loading Controller提供了两个重要的接口类，一个是供WebCore调用以加载各个资源的类CachedResourceLoader, 另一个是对接HTTP模块的ResourceHandle。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; text-align: center;"><img src="http://img.blog.csdn.net/20140205000348062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none; max-width: 602px; height: auto;" /><br />
</p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><br />
</p>
<h2 style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei';"><a name="t0" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a>1. 加载不同的资源</h2>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">不同的资源的加载其差异在于数据的处理方式不同，比如主文档要提交到Document Parser里去进行解析，图片则要显示出来，但它们的网络加载流程是相同的，所以它们有不同的CachedResourceClient实现，复用了SubresourceLoader的加载流程。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">下图可以看到DcoumentLoader及ScriptElement如何关联到CachedResource：</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; text-align: center;"><span style="font-size: 12px;"><img src="http://img.blog.csdn.net/20140206202125328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none;" /><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">开始加载资源包含两个重要过程:一是创建CachedResource, 二是调用CachedResource::addClient注册CachedResourceClient实例。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">下图是ScriptElement的加载序列图:</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; text-align: center;"><span style="font-size: 12px;"><img src="http://img.blog.csdn.net/20140205000438359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none;" /><br />
</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">CachedResourceHandle可以视为CachedResource的一个封装，提供给WebCore Loaders使用。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">CachedResourceHandle是一个模板类</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><span class="s1">template</span>&nbsp;&lt;<span class="s1">class</span>&nbsp;R&gt;&nbsp;<span class="s1">class</span>&nbsp;CachedResourceHandle</span></p>
<p class="p4" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p5" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">CachedResourceLoader为不同类型的资源提供了不同的接口函数，比如Script对应的加载函数:</span></p>
<p class="p4" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">CachedResourceHandle&lt;CachedScript&gt; CachedResourceLoader::requestScript(CachedResourceRequest&amp; request)</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">{</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">&nbsp;&nbsp;&nbsp;&nbsp;<span class="s1">return static_cast</span>&lt;CachedScript*&gt;( requestResource(CachedResource::Script, request).get() );</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">}</span></p>
<p class="p4" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">当收到数据时，从CachedResource派生出来的子类，会通过data函数及时获得已加载的数据，再通过注册的clients完成相应的操作。</span></p>
<p class="p4" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><span class="s2"><a target="_blank" href="http://blog.csdn.net/horkychen/article/details/8888428" style="text-decoration: none; color: #0c89cf;">上一篇</a></span>已经提到加载的发起流程，下面是收到数据后，HTTP Stack回调的过程:</span></p>
<p class="p4" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; text-align: center;"><span style="font-size: 12px;"><img src="http://img.blog.csdn.net/20140205000505640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none;" /><br />
</span></p>
<p class="p4" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><br />
</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">&nbsp; *出错时，则调用到CachedResource::error()</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">下图是主文档(CachedRawResource)收到数据后的处理流程(DocumentLoader就是CachedRawResource的client):</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; text-align: center;"><span style="font-size: 12px;"><img src="http://img.blog.csdn.net/20140205000522375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none;" /><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">以下是CachedRawResource::data的代码片段:</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;"><span class="s1">if</span>&nbsp;(incrementalDataLength) {</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CachedResourceClientWalker&lt;CachedRawResourceClient&gt; w(m_clients);</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="s1">while</span>&nbsp;(CachedRawResourceClient* c = w.next())</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c-&gt;dataReceived(<span class="s1">this</span>, incrementalData, incrementalDataLength);</span></p>
<p class="p3" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-size: 12px;">&nbsp; &nbsp; }</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><br />
</p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><br />
</p>
<h2 style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei';"><a name="t1" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><strong>2. ResourceHandle的跨平台</strong></h2>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial; font-size: 12px;">关于WebKit的跨平台机制，可以参考&lt;&lt;<a target="_blank" href="http://blog.csdn.net/horkychen/article/details/8462574" style="text-decoration: none; color: #0c89cf;"><span class="s3">WebKit模块化分析</span></a>&gt;&gt;中"兼容并蓄 - WebKit的跨平台方案"。</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial; font-size: 12px;">ResourceHandle,ResourceHandleInternal及NetworkingContext都定义在platform/network目录下. ReourceHandle针对不同平台有部分函数有不同的实现，实现的单元文件在platform/network目录下具体平台port的子目录下。</span></p>
<p class="p2" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; text-align: center;"><span style="font-family: Arial; font-size: 12px;"><img src="http://img.blog.csdn.net/20140205000552562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none;" /><br />
</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial; font-size: 12px;">&nbsp; &nbsp; &nbsp;</span></p>
<p class="p1" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial; font-size: 12px;">*在使用的HTTP Stack中，除curl等平台实现外，WebKit源代码还提到了SOUP, 这也是一个为GNOME应用提供HTTP支持的库，简介如下:</span></p>
<p class="p6" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial; font-size: 12px;">Soup uses GObjects and the glib main loop, and is designed to work well with Gtk/GNOME applications. This enables GNOME applications to access HTTP servers on the network in a completely asynchronous fashion, very similar to the Gtk+ programming model (a synchronous operation mode is also supported for those who want it).</span></p>
<p class="p7" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial; font-size: 14px; line-height: 26px;">转载请注明出处:&nbsp;</span><a target="_blank" href="http://blog.csdn.net/horkychen" style="text-decoration: none; color: #ca0000; font-family: Arial; font-size: 14px; line-height: 26px;">http://blog.csdn.net/horkychen</a><br />
</p>
<p class="p7" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial;"><strong><span style="font-size: 12px;">本系列上一篇</span></strong>:</span></p>
<p class="p7" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><span style="font-family: Arial; font-size: 12px;">&nbsp;&nbsp;<a target="_blank" href="http://blog.csdn.net/horkychen/article/details/8888428" style="text-decoration: none; color: #0c89cf;">[WebKit]WebCore之页面加载的设计与实现(一)</a></span></p>
<p class="p7" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;"><strong>UML图档下载地址(GitHub)</strong>:</p>
<p class="p7" style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px;">&nbsp;&nbsp;<a target="_blank" href="https://github.com/HorkyChen/WebKit-Documentation" style="text-decoration: none; color: #0c89cf;">WebKit-Documentation</a></p>
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/zjy17243/aggbug/212918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zjy17243/" target="_blank">月下孤影</a> 2016-03-03 21:40 <a href="http://www.cppblog.com/zjy17243/archive/2016/03/03/212918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> WebKit加载流程 - 概述(转载)</title><link>http://www.cppblog.com/zjy17243/archive/2016/03/03/212917.html</link><dc:creator>月下孤影</dc:creator><author>月下孤影</author><pubDate>Thu, 03 Mar 2016 13:31:00 GMT</pubDate><guid>http://www.cppblog.com/zjy17243/archive/2016/03/03/212917.html</guid><description><![CDATA[@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
<div class="bog_copyright" style="padding-top: 20px; padding-bottom: 20px; font-family: 'microsoft yahei'; font-size: 12px; background-color: #ffffff;">
<p class="copyright_p" style="margin: 0px; padding: 0px 0px 0px 10px; height: 14px; line-height: 14px; border-left-style: solid; border-left-width: 3px; border-left-color: #e41c1e; color: #666666; font-size: 14px;">版权声明：本文为博主原创文章，未经博主允许不得转载。</p>
</div>
<div id="article_content" class="article_content" style="margin: 35px 0px; font-size: 15px; color: #555555; line-height: 35px; font-family: 'microsoft yahei'; background-color: #ffffff;">
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">之前写了几篇加载流程的说明，是从下向上看，有点只见树木不见森林的感觉。经过最近一段时间的学习，有了能加以概括抽象的方法。</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">WebKit加载流程和页面组成是直接相关的，页面就是WebKit要加载的对象。所以WebKit负责加载的类也与负责页面管理的类相对应。Apple关于WebView的说明里清楚表现了页面视图上的MVC结构:</span></p>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625685_4190.png" alt="Structure" style="border: none;" /></div>
<p style="margin: 0px; padding: 0px;"><span style="font-size: 14px;">一个页面从元素上也有其层次结构，并且和加载类对应，如下:</span></p>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625619_3823.png" alt="Loading" style="border: none;" /></div>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">从页面元素上讲WebView代表了一个页面的呈现，对应一个Page. 一个Page包含一个或多个Frame,其中一个称为Main Frame,其它的Frame(iframe或object元素引入HTML)称为Sub Frame。每一个Frame,从JavaScript里都有一个window和document对象。</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;"><br />
</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">页面中的Frame,Document和子资源，对应到加载的FrameLoader, DocumentLoader和SubresourceLoader。其中Frame可以进行导航(Navigation)操作，即加载、重新加载、前进、后退操作，而Document则表示一个具体的HTML文档，没有导航操作。</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;"><br />
</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">从这里看到的几个Loaders都是加载的逻辑表示，实际的加载行为交给ResourceLoader(s)，即MainResourceLoader和SubresourceLoader来完成，其中包括了资源加载的队列管理操作(ResourceLoadScheduler)。</span></p>
<p style="margin: 0px; padding: 0px; text-align: center;"><span style="font-family: 'Microsoft YaHei';"><img src="http://img.my.csdn.net/uploads/201405/21/1400625619_7662.png" alt="Loaders" style="border: none;" /></span></p>
<p style="margin: 0px; padding: 0px;"><br />
</p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">ResourceHandle在WebKit中是一个重要的port接口，与各个平台的网络层适配，代表了一个具体的网络加载任务。</span><br />
</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;"><br />
</span></span></p>
<h2 style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="color: #3366ff;">主要类的关系</span></span></h2>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625619_1236.png" alt="Classes" style="border: none;" /></div>
<div style="text-align: center;"><br />
</div>
<div style="text-align: center;"><br />
</div>
<h2 style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="color: #3366ff;">FrameLoader加载时序</span></span></h2>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">从上面可以知道FrameLoader代表了Frame的加载行为，DocumentLoader代表了Document的加载行为。为了区分加载的进程，FrameLoader对加载状态进行了区分，并且让DocumentLoader在不同的状态间转换。除此之外FrameLoader还另外使用一个状态机，管理Frame加载显示的状态(FrameLoaderStateMachine)。</span></span></p>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625671_1761.png" alt="States" style="border: none; font-size: 14px;" /></div>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">除此之此，FrameLoader还要维护历史项(HistoryController),以对应处理Navigation操作, 详细项目定义在FrameLoaderTypes.h中。</span></span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;"><br />
</span></span></p>
<h2 style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="color: #3366ff;">Document&nbsp;<a name="baidusnap2" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><strong style="color: black; background-color: #99ff99;">Loader</strong></span></span></h2>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">相对FrameLoader而言，DocumentLoader相对简单一些，它的任务就是调用一个MainResourceLoader加载主文档。因为状态的转换在FrameLoader里完成了。子资源的加载依托于DocumentLoader来管理。</span></span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;"><br />
</span></span></p>
<p style="margin: 0px; padding: 0px;"></p>
<h2 style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="color: #3366ff;">子资源的加载</span></span></h2>
<p style="margin: 0px; padding: 0px;"></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">正如页面元素从属于Document存在一样，负责子资源的加载的类从属于Document,后来又移到了DocumentLoader类中。就形成了下面的关系:</span></span></p>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625673_1780.png" alt="SubResources" style="border: none;" /></div>
<div style="text-align: center;"><br />
</div>
<h2 style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="color: #3366ff;">CachedResourceLoader</span></span></h2>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">至于CachedResourceLoader,其实就是一个封装类，封装了创建各类CachedResource的功能。各个需要进行加载的页面元素会继承自CachedResourceClient,创建CachedResourceRequest, 通过DocumentLoader/Document里的CachedResourceLoader发起请求。</span></span></p>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625618_1608.png" alt="States" style="border: none;" /></div>
<div style="text-align: center;"><br />
</div>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">下面是Script元素发起请求的调用:</span></span></p>
<p style="margin: 0px; padding: 0px; text-align: center;"><span style="font-family: 'Microsoft YaHei';"><img src="http://img.my.csdn.net/uploads/201405/21/1400625672_6332.png" alt="ScriptElement" style="border: none;" /></span></p>
<p style="margin: 0px; padding: 0px; text-align: center;"><span style="font-family: 'Microsoft YaHei';"><br />
</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><br />
</span></p>
<h2 style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="color: #3366ff;">Memory Cache/Application Cache</span></span></h2>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">为了让用户有更快的应用体验，缓存机制不能少。在WebKit里CachedResource/CachedResourceLoader的命名里之所以有了<a name="baidusnap0" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><strong style="color: black; background-color: #ffff66;">Cached</strong>,就是因为它们中缓存的交互。</span><br />
</p>
<p style="margin: 0px; padding: 0px; text-align: center;"><span style="font-family: 'Microsoft YaHei';"><img src="http://img.my.csdn.net/uploads/201405/21/1400625618_8905.png" alt="SubResources" style="border: none;" /></span></p>
<p style="margin: 0px; padding: 0px; text-align: center;"><span style="font-family: 'Microsoft YaHei';"><br />
</span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">WebKit也有一些算法上的说明，可以参考<a target="_blank" href="https://trac.webkit.org/wiki/MemoryCache" style="text-decoration: none; color: #0c89cf;">这里</a>。</span><br />
</p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei'; font-size: 14px;"><br />
</span></p>
<h2 style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="color: #3366ff;"><a name="baidusnap1" style="color: #0c89cf; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat;"></a><strong style="color: black; background-color: #a0ffff;">Resource</strong>&nbsp;Load Scheduler</span></span></h2>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625672_3714.png" alt="Scheduler" style="border: none;" /></div>
<div style="text-align: center;"><br />
</div>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">在HostInformation里存储着两个两个列表,一个是使用不同优先级数组存储的等待加载的列表，一个是正在加载的列表。</span></span></p>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">使用scheduleServePendingRequests处理排队的请求时，会按优先级依序执行。下面是基本流程:</span></span></p>
<span style="font-family: 'Microsoft YaHei';"></span>
<div style="text-align: center;"><img src="http://img.my.csdn.net/uploads/201405/21/1400625672_1646.png" alt="Scheduler" style="border: none;" /></div>
<div style="text-align: center;"><br />
</div>
<div style="text-align: center;"><br />
</div>
<p style="margin: 0px; padding: 0px;"><span style="font-family: 'Microsoft YaHei';"><span style="font-size: 14px;">以上就是加载流程的概要性说明,中间缺少一些流程内容，可以参考以下两个链接:<br />
&nbsp;&nbsp;<a target="_blank" href="http://blog.csdn.net/horkychen/article/details/18927393" style="text-decoration: none; color: #0c89cf;">[WebKit]WebCore之页面加载的设计与实现(二)</a><br />
&nbsp;&nbsp;<a target="_blank" href="http://blog.csdn.net/horkychen/article/details/18955041" style="text-decoration: none; color: #0c89cf;">[WebKit]WebCore之页面加载的设计与实现(三)</a></span></span></p>
<p style="margin: 0px; padding: 0px;">转载请注明出处:&nbsp;<a target="_blank" href="http://blog.csdn.net/horkychen" style="text-decoration: none; color: #0c89cf;">http://blog.csdn.net/horkychen</a></p>
</div>
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/zjy17243/aggbug/212917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zjy17243/" target="_blank">月下孤影</a> 2016-03-03 21:31 <a href="http://www.cppblog.com/zjy17243/archive/2016/03/03/212917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>