`
vvvvbbbb
  • 浏览: 20757 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

WebKit内核源代码分析(二)

阅读更多
摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常重要的重要,同很多组件都有交互,本文将分析FrameLoader类的代码。
1. 概述

    顾名思义,FrameLoader是一个Frame的loader,它的作用就是为客户提供一个下载一个Frame的一系列接口。这里的客户指的是类的客户,比如Frame类,间接客户是上层应用,比如qwebframe。
    从它的定义看,最容易想到的是一个load接口,用来将一个frame load下来。任何一个页面至少都需要一个mainframe,因此一个页面的下载一般就是从load一个mainframe开始。
    在load frame的过程中,通过FrameLoaderClient接口将load过程的不同阶段告知客户。
    FrameLoader通过setDocumentLoader相当于把load的工作委托给了DocumentLoader类。
    FrameLoader同DocumentLoader是has-a的关系。一般在load的时候创建DocumentLoader。Frame调用DocumentLoader的startLoadingMainResource开始load frame。
2. 类关系





1)Frame和FrameLoader是contain-a的关系,在Frame的构造函数中调用FrameLoader的构造函数,调用时传入参数Frame指针和FrameLoaderClient指针。
2)Frame有可能有子Frame,所以维护SubFrameLoader对象m_subframeLoader来管理子Frame的load。Frame可以对应xml document,也可对应html document,等等。跟Document相关的子resource的load不在FrameLoader的职责范围内。
3)包含一个DocumentWriter类对象m_writer,当Frame的数据load finish的时候,将数据传给DocumentWriter类,进行下一步的处理(比如解码)
4)FrameLoader维护了三个DocumentLoader对象,分别对应于不同的阶段,m_policyDocumentLoader对应于收到用户load调用,进行policy check阶段,m_provisionalDocumentLoader对应于policy check通过以后,Frame数据还没有到来之前,它会负责startLoadingMainResource的调用。m_documentLoader则是Frame第一个数据到来以后使用的DocumentLoader,这个时候,前一个主Frame的DocumentLoader已经不能再用(user agent开始白屏,刷掉前一个页面的显示)。
5)包含一个HistoryController对象,用于操作历史记录相关的接口,保存或者恢复Document和View相关的状态,维护前进后退队列,以实现前进后退功能,前进后退本质上是同Page对象关联的,FrameLoader通过HistoryController操作m_backFowardController对象
6)包含一个ResourceLoadNotifier对象,主要用于同ResourceLoader及FrameLoaderClient打交道,可以理解为ResourceLoader有事件变化或者发生的时候,通知FrameLoader的一个手段
7)包含一个SubframeLoader对象,当FrameLoader下载的Document有子帧需要请求的时候(比如HTMLDocument中解析到iframe 元素),用来处理子帧请求
8)将FrameLoader的状态封装到FrameLoaderStateMachine中,这个状态同FrameState不同,FrameState倾向于判断Frame涉及的Document的下载状态,是出于发起状态(Provisional),还是出于已经收到响应但不全(CommittedPage),还是响应收全的状态,倾向于同http相关。而FramLoaderStateMachine倾向于同DocumentLoader相关,用来描述FrameLoader处理DocumentLoader的节点,是处于已经创建,还是显示的状态。
9)PolicyChecker主要用来对FrameLoader进行一些校验。包括三种校验:NewWindow,Navigation和Content。NewWindow对应于浏览器需要新开一个tab页或窗口的时候,Navigation对应于一个页面请求发起的时候,Content校验对应于收到数据以后(判断Mime type等),PolicyChecker通过提供对应的接口,由FrameLoaderClient来对这些请求进行校验,以确定是否允许继续,或者需要其它的动作。

3.   主要接口
Frame::init

功能:FrameLoader的初始化

函数调用系列
àQWebFrame::QWebFrame(QwebPage* parent,QWebFrameData *frameData)
àQWebFramePrivate::init(QWebFrame* qwebframe,QWebFrameData* frameData)
àFrame::init()
àFrameLoader::init()

说明:主要做一些自身的初始化工作,比如初始化状态机,Sandbox Flags,创建DocumentLoader被设置为Policy DocumentLoader和Provisional DocumentLoader,调用DocumentLoader和documentWriter等的接口进行初始化操作
FrameLoader::commitProvisionalLoad

功能:提交Provisional阶段下载的数据

函数调用系列:
àDocumentLoader::finishLoading
àDocumentLoader::commitIfReady
àFrameLoader::commitProvisionalLoad

或者
àResourceLoader::didReceiveData
àMainResourceLoader::addData
àDocumentLoader::receiveData
àDocumentLoader::commitLoad
àDocumentLoader::commitIfReady
àDocumentLoader::commitProvisionalLoad

说明:这个接口主要的操作是将Provisional DocumentLoader设置成DocumentLoader,因为已经收到数据,所以FrameState也会跃迁到FrameStateCommittedPage。还有历史记录,PageCache相关的操作。另外,这个接口会间接调用FrameLoaderClientQt::transitionToCommittedForNewPage,通过Frame::createView创建出FrameView来。
Frame::finishedLoading

功能:frame请求网络加载完成的时候调用此接口

函数调用系列
àResourceLoader::didFinishLoading
àMainResourceLoader::didFinishLoading
àFrameLoader::finishedLoading
àFrameLoader::init()

说明:检查是否有网络错误,告诉DocumentLoader和DocumentWriter下载完成,以便进行后续操作(提交数据,解析)。
FrameLoader::finishedParsing

功能:解析完成调用此接口

函数调用系列
àDocumentWritter::end
à….
àDocument::finishParsing
à….
àDocument::finishedParsing
àFrameLoader::finishedParsing
FrameLoader::load(const ResourceRequest& request,bool lockHistory)

功能:加载一个frame请求,Frame请求相关的数据,封装成ResourceRequest传入。

函数调用系列:一般由应用触发调用

说明:这个接口调用FrameLoaderClientQt::createDocumentLoader创建出DocumentLoader,并以此DocumentLoader为Policy Document Loader,进入Policy check流程。
  • 大小: 47.2 KB
分享到:
评论

相关推荐

    webkit内核源代码分析

    webkit开发学习笔记(全面)_第一版 webkit内核源代码分析(1)

    WebKit内核源代码分析

    **WebKit内核源代码分析** WebKit 是一个开源的网页渲染引擎,被广泛应用于苹果的Safari浏览器、谷歌的Chrome浏览器以及其他许多桌面和移动平台。它负责解析HTML、CSS、JavaScript等网页内容,并将它们转化为用户...

    WebKit内核源代码分析3

    《WebKit内核源代码分析3》是一篇深入探讨WebKit内核设计与架构的专题文章,主要聚焦于WebKit的源码解析,尤其是针对Qt平台的移植。尽管移植内容不是重点,但这一系列文章的核心仍然是WebKit内核本身。WebKit是全球...

    webkit 内核源代码分析2

    ### WebKit内核源代码分析2 #### 一、引言与概述 在《WebKit内核源代码分析2》这篇文章中,作者继续深入探讨WebKit浏览器引擎的核心架构与工作原理。通过对WebKit源代码的剖析,文章重点讲解了WebKit的内核设计...

    WebKit内核源代码分析(三)

    ### WebKit内核源代码分析(三):Android中的WebKit介绍 #### 一、WebKit概述与URL处理 本文档深入探讨了WebKit在Android环境下的实现原理,并特别关注了WebKit如何处理URL请求及其相关的CSS样式应用等内容。...

    WebKit内核源代码分析(1)

    本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以QT的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析...

    Webkit内核源代码分析

    通过深入研究Webkit内核源代码,我们可以了解浏览器如何解析和渲染网页,如何执行JavaScript,以及如何处理网络请求和本地存储,这对于前端开发人员优化性能、解决兼容性问题和开发自定义浏览器具有极大的帮助。...

    Webkit内核源代码分析(四)

    ### Webkit内核源代码分析(四):Android中的WebKit详解 #### 一、引言 在本篇文章中,我们将深入探讨Android系统中使用的WebKit浏览器引擎,并对其内部工作原理进行详细解析。WebKit作为一款开放源代码项目,在...

    WebKit内核源代码分析(五)

    ### WebKit内核源代码分析:深入理解Android中的WebKit #### 概述 在现代移动设备上,浏览器作为用户访问互联网的主要入口,其性能和稳定性至关重要。WebKit是苹果公司在Safari浏览器中使用的开源渲染引擎,它不仅...

    Webkit内核源代码分析(2)

    本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析时以QT的移植为参考,涉及移植的东西不多,主要还是以内核为主。FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常...

    webkit内核源代码分析5

    ### WebKit内核源代码分析第五篇:HTML解析与DOM构建 #### 一、HTML解析器与DOM构建 在WebKit的内核设计架构中,HTML文档的解析与DOM树的构建是极其重要的环节。这部分内容涉及到WebKit如何处理HTML文档,并将其...

    webkit内核源代码分析(2)

    ### WebKit内核源代码分析(二):深入解析WebCore::FrameLoader #### 引言 在上一篇文章中,我们已经对WebKit的核心组件之一——WebCore中的`FrameLoader`进行了初步了解。本文将继续深入探讨`FrameLoader`的内部...

    WebKit内核源代码分析(3)

    浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一个到多个页面子帧,...Page类是WebKit中非常重要的一个类,它就象内核对外的一个聚合器。

    WebKit内核源代

    **WebKit内核源代码分析** WebKit 是一个开源的网页渲染引擎,被广泛应用于各种操作系统和浏览器,如苹果的Safari和谷歌的Chrome。在Android平台上,WebKit被用作原生浏览器和其他应用的网页显示组件。深入理解...

    一个完整的WebKit嵌入式浏览器内核源代码

    2. **构建系统**:WebKit使用复杂的构建系统,如WebKit Build System或GN(Google Ninja)来编译和链接源代码。开发者需要配置这些工具,确保它们能正确识别并处理Win32和WinCE的目标平台。 3. **图形和UI**:...

    WebKit 开源浏览器内核 源代码 完整版

    这个压缩包包含的是 WebKit 的完整源代码,对于理解浏览器内核的工作原理、进行定制开发或者深入学习网络技术具有极高的价值。 WebKit 内核主要由以下几个关键组件构成: 1. **LayoutEngine(布局引擎)**:负责...

    webkit源代码 浏览器最好,最强大的内核

    总之,"webkit源代码 浏览器最好,最强大的内核"这一主题涵盖了 web 技术的核心领域,无论是对初学者还是经验丰富的开发者,深入研究 WebKit 都能带来极大的收获。通过压缩包中的文件,你可以亲身体验和理解这个强大...

    Webkit内核,含导入WebKit.Interop.dll

    - Webkit是一个开放源代码的项目,基于KHTML和JavaScriptCore,最初由KHTML(Konqueror浏览器的渲染引擎)发展而来。 - Webkit内核以其高性能、稳定性以及对Web标准的良好支持而受到青睐,它支持HTML5、CSS3、SVG...

    webkit源代码阅读笔记

    ### WebKit源代码阅读笔记概览 WebKit是一个开源的浏览器引擎,被广泛应用于现代的浏览器中,包括Safari、Google Chrome等。理解WebKit的源代码不仅有助于深入掌握浏览器的工作原理,还能为开发者优化Web应用性能...

Global site tag (gtag.js) - Google Analytics