2008-03-28
现代浏览器的结构
现代浏览器大都基于XML中的DOM规范来建立,而且DOM规范提供了对ECMAScript的绑定,可以方便的用来实现javascript。下面这副图是WinRiver公司采用Java开发的ICEStorm的RenderEngine的框架图,你可以在http://www.icesoft.no/architecture.html#storm看到这个图表。这个模型基本上也是所有现代浏览器通用的一个模型了。我们在Konqueror中同样可以看到类似的构造。
JS Engine
|
ECMAScript Binding
|
Stream->Tokenizer/Parser->DOM Builder->DOM->Layout Engine->Rendering out
| |
HTML Validator CSS
|
CSS Parser
DOM是浏览器的核心,DOM(Document Object Model)规范定义了一个XML文档的文档结构模型,它是一套语言无关的接口,由IDL定义。通过DOM API你可以遍历、修改文档。DOM分为DOM Core和DOM HTML,DOM Core是DOM的核心部分,它定义了一系列最基本的接口,利用这些接口程序可以访问和维护已经解析过的XML和HTML文档。DOM HTML定义了HTML的高级接口,并和DOM Core中的有继承关系。总之,通过DOM我们可以把一个HTML文档组织起来,并通过DOM API对文档进行操作。DOM在逻辑上是一种树状的结构,可以通过任何一种数据机构予以实现。
比如<html> <Head> <title> hello </title> </head> <body> hello </body> </html>
对应的DOM树就是:
Document
|
HTML
/ \
Head body
| |
title textNode("hello")
|
textNode("hello")
(Document是这个树的根结点)
而这棵DOM树需要进行分词和解析网络上读取的HTML字符数据流。
而且DOM提供了和ECAMScript的绑定,就是提供了ECMAScript要求的Host。ECMAScript是一个工业标准,Netscape的javascript和MS的JScript都符合这个标准,实际上这个标准就是从它们那里来的。我们在HTML文本中定义的javascript,需要解释执行,这些工作由JSEngine来完成。比如我们执行window.alert("hello!"),window这个不是ECMAScript内建的,你需要实现这样一个Host,把它的属性和方法告诉给JSEngine,它在解释执行时就会自动调用你实现中的相应的方法。ECMAScript相关的概念有很多,你可以去看看它的规范。JSEngine可以看看Mozilla.org/js中的部分。
DOM树最后需要显示在你的屏幕上,这时候你需要通过一个Layout算法进行排版输出。CSS规定了一些输出的特性,包括颜色字体等等。CSS需要独立的Parser来进行解析。CSS是DOM规范中的一部分。
对于浏览器的开发者来说,你要实现DOM API、DOM ECMAScript Binding、JSEngine、LayoutEngine,当然有的部分你可以使用已有的成果。Konqueror自己实现了所有的部分。
Konqueror使用的是QT库,QT库是一个大而全的类库,包括数据收集类、QSocket、QWidget,还有著名的Signal/Slot。Konqueror和这些部分的相关性是非常大的,而且还依赖于KDE中的KPart、KIO等部分体系结构。
因此要移植Konqueror还真不是一件容易的事情。而且为了保持Konqueror升级之后,我们的浏览器能够及时的跟进,我们不应该大幅度的更改内部的代码,而应该尽量的采用"glue layer"的方法。在这一点上,ViewML项目(http://www.viewml.org)给了我们很好的示范。
另外在移植之前,我们需要大量的分析Konqueror内部的代码,把这些知识经验积累下来。需要大家的无私的合作。
JS Engine
|
ECMAScript Binding
|
Stream->Tokenizer/Parser->DOM Builder->DOM->Layout Engine->Rendering out
| |
HTML Validator CSS
|
CSS Parser
DOM是浏览器的核心,DOM(Document Object Model)规范定义了一个XML文档的文档结构模型,它是一套语言无关的接口,由IDL定义。通过DOM API你可以遍历、修改文档。DOM分为DOM Core和DOM HTML,DOM Core是DOM的核心部分,它定义了一系列最基本的接口,利用这些接口程序可以访问和维护已经解析过的XML和HTML文档。DOM HTML定义了HTML的高级接口,并和DOM Core中的有继承关系。总之,通过DOM我们可以把一个HTML文档组织起来,并通过DOM API对文档进行操作。DOM在逻辑上是一种树状的结构,可以通过任何一种数据机构予以实现。
比如<html> <Head> <title> hello </title> </head> <body> hello </body> </html>
对应的DOM树就是:
Document
|
HTML
/ \
Head body
| |
title textNode("hello")
|
textNode("hello")
(Document是这个树的根结点)
而这棵DOM树需要进行分词和解析网络上读取的HTML字符数据流。
而且DOM提供了和ECAMScript的绑定,就是提供了ECMAScript要求的Host。ECMAScript是一个工业标准,Netscape的javascript和MS的JScript都符合这个标准,实际上这个标准就是从它们那里来的。我们在HTML文本中定义的javascript,需要解释执行,这些工作由JSEngine来完成。比如我们执行window.alert("hello!"),window这个不是ECMAScript内建的,你需要实现这样一个Host,把它的属性和方法告诉给JSEngine,它在解释执行时就会自动调用你实现中的相应的方法。ECMAScript相关的概念有很多,你可以去看看它的规范。JSEngine可以看看Mozilla.org/js中的部分。
DOM树最后需要显示在你的屏幕上,这时候你需要通过一个Layout算法进行排版输出。CSS规定了一些输出的特性,包括颜色字体等等。CSS需要独立的Parser来进行解析。CSS是DOM规范中的一部分。
对于浏览器的开发者来说,你要实现DOM API、DOM ECMAScript Binding、JSEngine、LayoutEngine,当然有的部分你可以使用已有的成果。Konqueror自己实现了所有的部分。
Konqueror使用的是QT库,QT库是一个大而全的类库,包括数据收集类、QSocket、QWidget,还有著名的Signal/Slot。Konqueror和这些部分的相关性是非常大的,而且还依赖于KDE中的KPart、KIO等部分体系结构。
因此要移植Konqueror还真不是一件容易的事情。而且为了保持Konqueror升级之后,我们的浏览器能够及时的跟进,我们不应该大幅度的更改内部的代码,而应该尽量的采用"glue layer"的方法。在这一点上,ViewML项目(http://www.viewml.org)给了我们很好的示范。
另外在移植之前,我们需要大量的分析Konqueror内部的代码,把这些知识经验积累下来。需要大家的无私的合作。
发表评论
最新评论
-
IT人 不要一辈子靠技术生 ...
唉………………无语了………………
-- by dcrpp -
理解Java常量池
:arrow: :wink: :cry: : ...
-- by println -
理解Java常量池
[img][/img] :o :lol: :cry:&n ...
-- by println -
Gifencoder
代码不全.....
-- by avar -
开博至今,广告收入才 16. ...
看来robin对自己的当前状态很满意呀。。。。。。。。。。。不进则退
-- by Azi







评论排行榜