Gecko处理HTML HTTP请求流程

Gecko处理HTML HTTP请求流程

(1) LoadURI或webshell调用nsWebShell::DoLoadURL开始读取url。然后webshell通知DocumentLoader(使用“view”命令)读取url。【nsWebShell.mObserver是一个nsIStreamObserver,webshell是传给DocLoader的nsIContentViewerContainer】
(2) Document Loader调用NS_OpenURI传递请求文件,Necko(一个网络lib)检查url策略(这里就是http:)后寻找对应的nsIProtocolHandler(这里是nsHTTPHandler),然后向它申请一个nsIChannel(即nsHTTPChannel)。channel表示到server的一个连接,可以理解为是一条html数据流。
(3) webserver发来数据,nsIChannel调用DocumenLoader的OnStartRequest,因为此时channel已经知道了数据中的content type,DocumentLoader可以根据content type找对应的nsIDocumentLoaderFactory(nsLayoutDLF)处理"text/html"。然后Factory创建ContentViewer并发出创建nsIContentViewer的通知。多数情况下还要创建一个nsIDocument(nsHTMLDocument)绑定到ContentViewer。之后ContentViewer会嵌入到ContentViewerContainer当中。
(4) Document使用nsIParser解析输入数据流,HTML文档就是nsParser,本身已经实现了nsIStreamListener。nsIStreamListener返回到DocumentLoader并与nsIChannel的请求连接。
(5) Document(nsHTMLDocument)还创建了nsIContentSink(nsHTMLContentSink),连接parser和document,parser使用StreamListener解析数据流,转化成ContentSink中的nsIParserNodes。parser以8kb为单位从数据流读取数据,逐块解析并将解析出的nsIParserNodes传给ContentSink,如果parser发生阻塞,期间还会继续解析缓存数据。
(6) contentsink通过调用NS_NewHTMLXxxxElement()创建nsIContent节点描述document。各元素节点已包含了nsIHTMLContent接口和DOM接口。nsIContent::AppendChild()可以创建content tree,接收的参数aNotify通知document是否content model变化。content sink调用AppendChild时该参数始终为PR_FALSE。nsHTMLContentSink::WillInterrupt()和nsHTMLContentSink::DidBuildModel()执行时,content sink会调用NotifyBody()通知document关于content model的变化。parser处理每个8kb数据块都要执行WillInterrup。
(7) 因为presentation shell (nsPresShell) 已经在nsIDocument注册为一个DocumentObserver,所以Document/Content tree变化的时候也会收到通知,这样就可以通过nsCSSFrameConstructor创建和更新nsIFrame,参考用户agent样式单(ua.css)为每个content节点创建frames,当然除了那些displaytype是"none"的节点。一个content节点对应一个或多个nsIFrame,如果有几个frames都是由一个content node创建,第一个就称为"primary"节点,后面的那些frames可以用nsIFrame的GetNextInFlow()方法进行查找。nsHTMLContentSink::OpenBody()通过调用nsHTMLContentSink::StartLayout()完成首个流程 。
(8) 每个nsIFrame都包含了屏幕呈现的方法,PresShell调用nsIFrame::Paint()布局frames,通过传递presentation context和rendering context的引用进行绘制。rendering context是一个native类(nsGtkRenderingContext on unix),包含了绘制的方法。

出处
https://developer.mozilla.org/en-US/docs/The_life_of_an_HTML_HTTP_request


本文来自 zsw0314 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zsw0314/article/details/46422619?utm_source=copy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常好,我可以通过PPT来介绍HTTP请求。请看下面的介绍。 PPT标题:HTTP请求 第一张PPT:HTTP请求概述 HTTP(Hypertext Transfer Protocol)是一种用于传输超媒体文档(例如 HTML 文件)的应用层协议,通常基于TCP/IP协议来传输数据。HTTP请求是客户端(例如浏览器)向服务器发送数据请求的过程。 第二张PPT:HTTP请求格式 HTTP请求由三部分组成:请求行、请求头和请求体。请求行包含请求方法、请求URL和HTTP协议版本;请求头包含一些请求的附加信息,例如请求头部字段、Cookie等;请求体包含实际要传输的数据。 第三张PPT:HTTP请求方法 HTTP定义了许多请求方法,常用的有GET、POST、PUT、DELETE等。GET方法用于请求获取资源,POST方法用于提交数据,PUT方法用于更新资源,DELETE方法用于删除资源。 第四张PPT:HTTP请求示例 下面是一个HTTP GET请求的示例: ``` GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Connection: keep-alive Upgrade-Insecure-Requests: 1 ``` 第五张PPT:HTTP请求流程 HTTP请求流程如下: 1. 浏览器解析URL,获取服务器地址和端口号。 2. 浏览器向服务器发送TCP连接请求。 3. 服务器返回TCP连接应答。 4. 浏览器向服务器发送HTTP请求。 5. 服务器解析HTTP请求,返回HTTP响应。 6. 浏览器解析HTTP响应,渲染页面。 以上就是HTTP请求的介绍,谢谢观看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值