Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192597
  • 博文数量: 111
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1240
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 07:46
文章分类

全部博文(111)

文章存档

2015年(2)

2014年(1)

2011年(1)

2010年(7)

2009年(100)

我的朋友

分类: LINUX

2009-08-08 08:15:37


转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静

Mozilla研究—从输入URL到显示内容的基本过程

按我的想象,从输入URL到显示内容的过程非常简单:连接到服务器—下载文件—解析内容—排版布局。而在Mozilla中,实际情况虽然大体差不多,由于中间绕了不少圈子,整个过程显得比较复杂了。这里简单介绍一下:

1. 修正URL。用户输入的URL可能不合规范,在URLnsDocShell::LoadURI中,mozilla会调用URIFixup对其进行修正。它 不但可以进行诸如加上scheme之类的简单修正,还可以到指定的URL上去进行关键字查询,以获取真正的URL。

2. 创建URI对象。调用nsIIOService接口的GetProtocolHandler函数,通过scheme查询到URI对应的nsIProtocolHandler,然后调用NS_NewURI创建URI对象。

3. 检查Cache文件。除了像REFRESH之类的操作不允许取cache的情况外,其它情况都先调用nsIDocShellHistory的函数,看看能否从历史记录中获取cache的文件。

4. 创建Channel。在nsDocShell::DoURILoad调用NS_NewChannel创建Channel。

5. 设置Cookie等信息,然后调用AsyncOpen打开Channel。

6. 转发数据到nsParser。当有数据可用时,会触发nsInputStreamReadyEvent事件,经过nsInputStreamPump等对象的转发,数据最终被送到nsParser。

7. 解析数据。nsParser解析数据生成各个元素(Element),解析器的代码在parser/htmlparser/src目录下,它支持增量解析,所以可以在文件传输过程中,边传输边解析,而不必等到传输完成之后才解析。

8. CNavDTD做语法检查,并做适当的修正。CNavDTD实现了nsIDTD接口。整个解析器的架构是Builder模式的变种,它在 Director(即nsParser)和Builder(HTMLContentSink)之间,加了这样一个nsIDTD,以便对错误的语法进行修 正。

9. HTMLContentSink构建nsDocument。

10. nsDocument经PresShell调用nsCSSFrameConstructor去创建各种layout元素。

Layout部分的处理非常复杂,目前还没有弄清楚,以后再介绍吧。

阅读(429) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~