欢迎来到这里,你将开始一次冒险之旅,而我将作为你的导游,和你一起进行一次探险的活动,很快,你将会发现世界上还有很多有趣的东西, 比如今天活动 - 一次浏览器的结构探索之旅。
今天为什么要去探索浏览器的实现结构呢?首先很少到看有中文相关的比较深入的介绍浏览器的实现的文章。其次是我们每天在用的浏览器,却不知道它背后为我们做了多少事情,它到底复杂到什么程度呢?好啦,开始出发。^_^
一、浏览器体系结构
系统的模块:
1.用户向Shell发出页面请求后,页面的URL或本地文件名被发送到Shell;
2.Shell调用IO组件,把URL传达到IO组件;
3.IO组件使用HTTP协议或再调用本地IO获取HTML/XHTML源数据,返回Shell;
4.Shell把IO返回的HTML/XHTML source提交HTML/XHTML分析器;
5.HTML/XHTML分析器分析HTML/XHTML代码,构建一棵DOM树,树根为HTMLDocument;
6.遍历DOM树,发现是可视化元素的时(Form等为非可视化元素,div,table,button等为可视化元素),请求布局管理器为这一个可视化元素分配一席之地,以让它安身。可视化元素只能建议布局管理器,它想要什么样的位置,大小,最终分配的实际位置,大小等由布局管理器决定,并不是由元素本身决定,它只能对布局管理器提出建议。比如在一个被设定宽度为100的Table中,某的单元格想要分配宽度为200的单元格,布局管理器就不会一定给它分配这么大,因为该单元格超出了表格的宽度。
7.当布局管理器对可视化元素指派好位置,大小后,它就就知道了它的安身之处,也记住了它的大小,它必须要严格遵守布局管理器给它分配的位置,大小,不能擅自更改。既然知道了自己的位置,大小,剩下的就是控件根据自己的属性进行表现自己了,背景,外形等。
备注:总之布局管理器对显示的控件的位置,大小有绝对的控制权,不管是HTML元素指定的大小,位置属性,还是Script中对控件位置、大小的更改,都要经过布局管理器进行计算,最终以布局管理器分配的实际大小,位置为准。
二、处理流程:
为了给每个视觉展现层的库取一个比较帅点的,并且又比较容易理解的名字,还真不容易,让我想了很久,突然想起<<深入浅出HTML>>说到的视觉表达,引用一词render.觉得不错,适合给GUI集合作为库名称。
以下是DOM解析用到的相关类的类图:
以下是视觉表达层的类图
结语
这里仅仅是对浏览器的结构进行了简要的分析,简述了浏览在我心里的初步的实现方法,因为我还没有真正去详细的解读其它浏览器的实现,所以还是比较片面的。为什么不去解读包括Firefox这样著名的浏览器,而在这里设想呢?原因有两个,一,当我看到Firefox 3.0版本的源代码包,压缩时是35MB,解压后是280多MB的时候,我就没有很大耐心和时间看下去了;二是我希望给自己留有设想的空间,不愿意我的思维就过早的被定格在别人的思维下,我认为事物的实现是有很多种方式,而在今天这里探索比结果更重要,因为我们要做的是一次探索之旅。
一个浏览器的全部实现还有很多的东西,比如布局管理器、HTML式样,Script互动等的实现,就有不少东西要做了,这些就留给更深层次的探索吧,今天已经看到了浏览器架构的影子,要看到它完全的真面目,我觉得已经很近了。