Mozilla研究—从输入URL到显示内容的基本过程
Mozilla研究—从输入URL到显示内容的基本过程
转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd
作者联系方式:Li XianJing <xianjimli at hotmail dot com>
更新时间:2007-3-16
mozilla是一个以浏览器为中心的软件平台,它在我们平台中占有重要地位。我们用它来实现WEB浏览器、WAP浏览器、邮件系统、电子书和帮助阅读器等应用程序。为此,我最近花了不少时间去阅读mozilla的代码和文档,我将写一系列的BLOG作为笔记,供有需要的朋友参考。本文介绍一下从输入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部分的处理非常复杂,目前还没有弄清楚,以后再介绍吧。
~~end~~