webkit内核源代码导读2: FrameLoader的初步分析

来源:互联网 发布:阿里云备案账号是什么 编辑:程序博客网 时间:2024/05/16 11:59

从网页加载开始

阅读webkit的代码,从网页加载开始。FrameLoader就是执行加载的代码。FrameLoader的load方法是加载的入口函数。load方法有若干个重载,但是最终都会调用到一个终极load方法。 另外,load过程是异步的,并在load过程中,有多种控制加载是否继续的策略。

这些在我们分析源码的时候,都忽略掉。他们对我们理解加载的主要过程没有任何影响。


了解FrameLoader主要相关类


  • DocummentLoader: 顾名思义,不讲了;
  • MainResourceLoader:加载网页的Loader。网页被成为主资源,网页所引用的css, js, image等资源,被称为子资源
  • CachedResourceLoader: 从缓存中获取资源
  • DocumentWriter : 将获取的数据流写入到这个writer中,它可以看作一个缓冲区,它负责进行处理 (交给DocumentParser进行解析,下章将详细说明)
  • 资源加载的具体工作,由专门的ResourceLaoder和Cache模块来实现,模块独立性比较高。


主资源加载过程

以一个单独的网页来说明这个过程,使用序列图

该图对FrameLoader做了高度简化,因此,在阅读源代码时,需要注意找关键点来阅读。

  • 从FrameLoader的load函数开始,经过一系列处理后,它终于调用到DocumentLoader的startLoadingMainResource函数,进而调用到MainResourceLoader的load
  • MainResourceLoader负责调用真正的资源加载模块。当收到数据后,资源加载模块会调用它的receivedData函数
  • DocumentLoader调用FrameLoaderClient的函数可以忽略了,这是为了给外部代码一个机会来处理收到的数据。当committedData被调用后,数据被写入到DocumentWriter中
  • DocumentWriter可以理解为一个缓冲区,DocumentWriter在调用DocuementParser来执行代码解析的工作。


这一部分仅是主资源加载的功能,对于子资源的加载,是通过和DocumentParser的交互来完成的。这一点在讲解解析器的时候会提到。


这里有必要提醒一下:DocumentLoader的commitData函数第一次收到数据时,它会调用DocumentWriter的begin函数。这个函数会调用DocumentWriter::createDocument来创建一个Document对象。然后从Document对象中取得一个DocumentParser对象,调用它的appendBytes方法。

DocumentWriter::createDocument方法会根据URL创建不同的Document。对于我们,感兴趣的是它会创建HTMLDocument对象。 详细可以查阅DOMImplementation::createDocument的实现。