webkit的加载过程

类图

类介绍
Frame
--包含FrameLoader

FrameLoader
--指针Frame
--指针FrameLoaderClient
--引用DocumentLoader
--引用DocumentLoader(provisional)
--引用DocumentLoader(policy)
--引用FrameNetworkingContext
--包含ResourceLoadNotifier
--包含FrameLoaderStateMachine

DocumentLoader
--包含DocumentWriter
--引用MainResourceLoader
--指针Frame
--引用ResourceLoaderSet(sub resource, multipart subresource, plugin streamloader)
--包含ResourceRequest(origin request)

FrameNetworkingContext
--继承自NetworkingContext,不同的平台有不同的实现
gtk使用soup实现

WebCore::FrameLoaderClient
--接口类,需要继承实现
主要负责和客户端通信等用途
如dispatchxxx等函数

MainResourceLoader
--继承自ResourceLoader
--继承自ResourceHandleClient
--引用DocumentLoader (指向当前frame loader的active document)
--引用Frame
--引用ResourceHandle
--MainResourceLoader只用于provisional的资源加载

CachedResourceLoader
--manages the loading of scripts/images/stylesheets for a single document
--使用CachedResourceHandle
--使用CachedResource
--CachedResourceLoader和ResourceLoader没有联系
也没有使用ResourceHandle(在soup方式下使用了相同的readcallback方式)

ResourceHandle
--不同平台有不同的实现

DocumentWriter
--指针Frame
--引用DocumentParser
--引用TextResourceDecoder
--生成document

DocumentParser
--使用writer
##################################################################################################
加载网页过程

FrameLoader包含三种DocumentLoader,有documentLoader,provisional document loader和policy document loader。
当点击一个链接的时候,FrameLoader首先生成一个policy document loader,然后进行判断是否应该继续下去(使用一个专门的PolicyChecker来实现检查,有很少的情况下不继续,如空地址等)。如果继续,则先清除provisional已有的document loader,再设置成policy的document loader,然后再清除policy的document loader;如果是不能继续,则清除policy的document loader之后退出。
在provisional document loader设置之后,会创建MainResourceLoader。使用MainResourceLoader的好处是,将网络响应和document的处理分开,生命周期也进行了解耦。
MainResourceLoader接收到数据后,在第一次调用callback函数时转变了状态为commit状态,这里做了两个重要的工作。一个是在FrameLoader::transitionToCommitted()中进行provisional document loader到documentLoader的转换,转换过程类似policy到privisional。另外一个是这里还调用DocumentWriter生成了新的document对象(过程比较曲折,DocumnetLoader调用了FrameLoader成员client的committedLoad()方法,FrameLoaderClient又调用回到DocumentLoader,当第一次接受数据时生成document对象,并开始打开document对象)。不管如何,document终于粉墨登场了!
documentLoader当MainResourceLoader接收到最后的数据后,调用FrameLoader::finishedLoading(),并结束DocumentWriter的生成document,MainResourceLoader也完成了自己的使命。而当document解析中,还会产生一些新的http请求。
随着MainResourceLoader和其他的一些http请求不断的接收到数据,Html不断的解析出来,在解析的过程中FrameView会不断生成render对象,并设置成的isNonVisualEmpty属性,并触发FrameView的layout请求。在每次layout之后会有些post处理,如果没有未解析的css,就会通知FrameLoaderClient进入NonEmptyLayout的状态。这个是一个重要的状态,意味着现在可以显示界面了。

每当一个资源最后的数据结束的时候,都会引起FrameLoader检查。如果所有的资源都加载完毕,就会触发状态转变成最后的complete状态,并通知client进入finished状态。加载完毕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值