ImageVerifierCode 换一换
格式:DOCX , 页数:48 ,大小:626.35KB ,
资源ID:26523963      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26523963.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(浏览器的工作原理.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

浏览器的工作原理.docx

1、浏览器的工作原理简介浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入到你看到google主页过程中都发生了什么浏览器五种主流浏览器-IE,Firefox,Safari,Chrome及Opera本文将基于一些开源浏览器的例子-Firefox,Chrome及Safari,Safari是部分开源的浏览器的主要功能浏览器的主要功能是将用户选择的web资源呈现出来,它需要从服务器请求资源,并将其显示在浏览器窗口中,资源的格式通常是HTML,也包括PDF,image及其他格式。用户用URI(Uniform Resource Identifier统一资源标识符)来

2、指定所请求资源的位置。HTML和CSS规范中规定了浏览器解释html文档的方式,由W3C组织对这些规范进行维护,W3C是负责指定web标准的组织。HTML规范的最新版本是HTML4(http:/www.w3.org/TR/html401/),HTML5还在制定中(译注:两年前),最新的CSS规范版本是2(http:/www.w3.org/TR/CSS2),CSS3也还正在制定中(译注:同样两年前)。这些年来,浏览器厂商纷纷开发自己的扩展,对规范的遵循并不完善,这为web开发者带来了严重的兼容性问题。但是,浏览器的用户界面则差不多,常见的用户界面元素包括:用来输入URI的地址栏前进、后退按钮书签

3、选项用于刷新及暂停当前加载文档的刷新、暂停按钮用于到达主页的主页按钮奇怪的是,并没有哪个正式公布的规范对用户界面做出规定,这些是多年来各浏览器厂商之间相互模仿和不断改进得结果。HTML5并没有规定浏览器必须具有的UI元素,但列出了一些常用元素,包括地址栏、状态栏及工具栏。还有一些浏览器有自己专有得功能,比如Firefox得下载管理。更多相关内容将在后面讨论用户界面时介绍。浏览器的主要构成High Level Structure浏览器的主要组件包括:1.用户界面包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分2.浏览器引擎用来查询及操作渲染引

4、擎的接口3.渲染引擎用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来4.网络用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作5.UI后端用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口6.JS解释器用来解释执行JS代码7.数据存储属于持久层,浏览器需要在硬盘中保存类似cookie的各种数据,HTML5定义了web database技术,这是一种轻量级完整的客户端存储技术图1:浏览器主要组件需要注意的是,不同于大部分浏览器,Chrome为每个Tab分配了各自的渲

5、染引擎实例,每个Tab就是一个独立的进程。对于构成浏览器的这些组件,后面会逐一详细讨论。组件间的通信Communication between the componentsFirefox和Chrome都开发了一个特殊的通信结构,后面将有专门的一章进行讨论。渲染引擎The rendering engine渲染引擎的职责就是渲染,即在浏览器窗口中显示所请求的内容。默认情况下,渲染引擎可以显示html、xml文档及图片,它也可以借助插件(一种浏览器扩展)显示其他类型数据,例如使用PDF阅读器插件,可以显示PDF格式,将由专门一章讲解插件及扩展,这里只讨论渲染引擎最主要的用途显示应用了CSS之后的ht

6、ml及图片。渲染引擎Rendering engines本文所讨论得浏览器Firefox、Chrome和Safari是基于两种渲染引擎构建的,Firefox使用GeokoMozilla自主研发的渲染引擎,Safari和Chrome都使用webkit。Webkit是一款开源渲染引擎,它本来是为linux平台研发的,后来由Apple移植到Mac及Windows上,相关内容请参考http:/webkit.org。主流程The main flow渲染引擎首先通过网络获得所请求文档的内容,通常以8K分块的方式完成。下面是渲染引擎在取得内容之后的基本流程:解析html以构建dom树-构建render树-布局

7、render树-绘制render树图2:渲染引擎基本流程渲染引擎开始解析html,并将标签转化为内容树中的dom节点。接着,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另一棵树render树。Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。Render树构建好了之后,将会执行布局过程,它将确定每个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所

8、有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。图3:webkit主流程图4:Mozilla的Geoko渲染引擎主流程从图3和4中可以看出,尽管webkit和Gecko使用的术语稍有不同,他们的主要流程基本相同。Gecko称可见的格式化元素组成的树为frame树,每个元素都是一个frame,webkit则使用render树这个名词来命名由渲染对象组成的树。Webkit中元素的定位称为布局,而Gecko中称为回流。Webkit称利用dom节点及样式信息去构建render树的过程为attachment,Gecko在h

9、tml和dom树之间附加了一层,这层称为内容接收器,相当制造dom元素的工厂。下面将讨论流程中的各个阶段。解析Parsinggeneral既然解析是渲染引擎中一个非常重要的过程,我们将稍微深入的研究它。首先简要介绍一下解析。解析一个文档即将其转换为具有一定意义的结构编码可以理解和使用的东西。解析的结果通常是表达文档结构的节点树,称为解析树或语法树。例如,解析“231”这个表达式,可能返回这样一棵树。图5:数学表达式树节点文法Grammars解析基于文档依据的语法规则文档的语言或格式。每种可被解析的格式必须具有由词汇及语法规则组成的特定的文法,称为上下文无关文法。人类语言不具有这一特性,因此不能

10、被一般的解析技术所解析。解析器词法分析器ParserLexer combination解析可以分为两个子过程语法分析及词法分析词法分析就是将输入分解为符号,符号是语言的词汇表基本有效单元的集合。对于人类语言来说,它相当于我们字典中出现的所有单词。语法分析指对语言应用语法规则。解析器一般将工作分配给两个组件词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。图6:从源文档到解析树解析过程是迭代的,解析器从词法分析器处取道一个新的符号,并试着用这个符号匹配一条语法规则,如果匹配了一条规则,这

11、个符号对应的节点将被添加到解析树上,然后解析器请求另一个符号。如果没有匹配到规则,解析器将在内部保存该符号,并从词法分析器取下一个符号,直到所有内部保存的符号能够匹配一项语法规则。如果最终没有找到匹配的规则,解析器将抛出一个异常,这意味着文档无效或是包含语法错误。转换Translation很多时候,解析树并不是最终结果。解析一般在转换中使用将输入文档转换为另一种格式。编译就是个例子,编译器在将一段源码编译为机器码的时候,先将源码解析为解析树,然后将该树转换为一个机器码文档。图7:编译流程解析实例Parsing example图5中,我们从一个数学表达式构建了一个解析树,这里定义一个简单的数学语

12、言来看下解析过程。词汇表:我们的语言包括整数、加号及减号。语法:1.该语言的语法基本单元包括表达式、term及操作符2.该语言可以包括多个表达式3.一个表达式定义为两个term通过一个操作符连接4.操作符可以是加号或减号5.term可以是一个整数或一个表达式现在来分析一下“231”这个输入第一个匹配规则的子字符串是“2”,根据规则5,它是一个term,第二个匹配的是“23”,它符合第2条规则一个操作符连接两个term,下一次匹配发生在输入的结束处。“231”是一个表达式,因为我们已经知道“23”是一个term,所以我们有了一个term紧跟着一个操作符及另一个term。“2”将不会匹配任何规则,

13、因此是一个无效输入。词汇表及语法的定义词汇表通常利用正则表达式来定义。例如上面的语言可以定义为:INTEGER:01909PLUS:MINUS:正如看到的,这里用正则表达式定义整数。语法通常用BNF格式定义,我们的语言可以定义为:expression :term operation termoperation := PLUS | MINUSterm := INTEGER | expression如果一个语言的文法是上下文无关的,则它可以用正则解析器来解析。对上下文无关文法的一个直观的定义是,该文法可以用BNF来完整的表达。可查看http:/en.wikipedia.org/wiki/Conte

14、xt-free_grammar。解析器类型Types of parsers有两种基本的解析器自顶向下解析及自底向上解析。比较直观的解释是,自顶向下解析,查看语法的最高层结构并试着匹配其中一个;自底向上解析则从输入开始,逐步将其转换为语法规则,从底层规则开始直到匹配高层规则。来看一下这两种解析器如何解析上面的例子:自顶向下解析器从最高层规则开始它先识别出“23“,将其视为一个表达式,然后识别出”231“为一个表达式(识别表达式的过程中匹配了其他规则,但出发点是最高层规则)。自底向上解析会扫描输入直到匹配了一条规则,然后用该规则取代匹配的输入,直到解析完所有输入。部分匹配的表达式被放置在解析堆栈中

15、。StackInput2 + 3 1term+ 3 - 1term operation3 1expression- 1expression operation1expression自底向上解析器称为shift reduce解析器,因为输入向右移动(想象一个指针首先指向输入开始处,并向右移动),并逐渐简化为语法规则。自动化解析Generating parsers automatically解析器生成器这个工具可以自动生成解析器,只需要指定语言的文法词汇表及语法规则,它就可以生成一个解析器。创建一个解析器需要对解析有深入的理解,而且手动的创建一个由较好性能的解析器并不容易,所以解析生成器很有用。W

16、ebkit使用两个知名的解析生成器用于创建语法分析器的Flex及创建解析器的Bison(你可能接触过Lex和Yacc)。Flex的输入是一个包含了符号定义的正则表达式,Bison的输入是用BNF格式表示的语法规则。HTML解析器HTML ParserHTML解析器的工作是将html标识解析为解析树。HTML文法定义The HTML grammar definitionW3C组织制定规范定义了HTML的词汇表和语法。非上下文无关文法Not a context free grammar正如在解析简介中提到的,上下文无关文法的语法可以用类似BNF的格式来定义。不幸的是,所有的传统解析方式都不适用于h

17、tml(当然我提出它们并不只是因为好玩,它们将用来解析css和js),html不能简单的用解析所需的上下文无关文法来定义。Html有一个正式的格式定义DTD(Document Type Definition文档类型定义)但它并不是上下文无关文法,html更接近于xml,现在有很多可用的xml解析器,html有个xml的变体xhtml,它们间的不同在于,html更宽容,它允许忽略一些特定标签,有时可以省略开始或结束标签。总的来说,它是一种soft语法,不像xml呆板、固执。显然,这个看起来很小的差异却带来了很大的不同。一方面,这是html流行的原因它的宽容使web开发人员的工作更加轻松,但另一方

18、面,这也使很难去写一个格式化的文法。所以,html的解析并不简单,它既不能用传统的解析器解析,也不能用xml解析器解析。HTML DTDHtml适用DTD格式进行定义,这一格式是用于定义SGML家族的语言,包括了对所有允许元素及它们的属性和层次关系的定义。正如前面提到的,html DTD并没有生成一种上下文无关文法。DTD有一些变种,标准模式只遵守规范,而其他模式则包含了对浏览器过去所使用标签的支持,这么做是为了兼容以前内容。最新的标准DTD在http:/www.w3.org/TR/html4/strict.dtdDOM输出的树,也就是解析树,是由DOM元素及属性节点组成的。DOM是文档对象模

19、型的缩写,它是html文档的对象表示,作为html元素的外部接口供js等调用。树的根是“document”对象。DOM和标签基本是一一对应的关系,例如,如下的标签:Hello DOM将会被转换为下面的DOM树:图8:示例标签对应的DOM树和html一样,DOM的规范也是由W3C组织制定的。访问http:/www.w3.org/DOM/DOMTR,这是使用文档的一般规范。一个模型描述一种特定的html元素,可以在http:/www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/idl-definitions.htm查看html定义。这里所谓的树包含了D

20、OM节点是说树是由实现了DOM接口的元素构建而成的,浏览器使用已被浏览器内部使用的其他属性的具体实现。解析算法The parsing algorithm正如前面章节中讨论的,hmtl不能被一般的自顶向下或自底向上的解析器所解析。原因是:1.这门语言本身的宽容特性2.浏览器对一些常见的非法html有容错机制3.解析过程是往复的,通常源码不会在解析过程中发生改变,但在html中,脚本标签包含的“document.write”可能添加标签,这说明在解析过程中实际上修改了输入不能使用正则解析技术,浏览器为html定制了专属的解析器。Html5规范中描述了这个解析算法,算法包括两个阶段符号化及构建树。符

21、号化是词法分析的过程,将输入解析为符号,html的符号包括开始标签、结束标签、属性名及属性值。符号识别器识别出符号后,将其传递给树构建器,并读取下一个字符,以识别下一个符号,这样直到处理完所有输入。图9:HTML解析流程符号识别算法The tokenization algorithm算法输出html符号,该算法用状态机表示。每次读取输入流中的一个或多个字符,并根据这些字符转移到下一个状态,当前的符号状态及构建树状态共同影响结果,这意味着,读取同样的字符,可能因为当前状态的不同,得到不同的结果以进入下一个正确的状态。这个算法很复杂,这里用一个简单的例子来解释这个原理。基本示例符号化下面的html

22、:Hello world初始状态为“Data State”,当遇到“”字符,状态变为“Tag open state”,读取一个az的字符将产生一个开始标签符号,状态相应变为“Tag name state”,一直保持这个状态直到读取到“”,每个字符都附加到这个符号名上,例子中创建的是一个html符号。当读取到“”,当前的符号就完成了,此时,状态回到“Data state”,“”重复这一处理过程。到这里,html和body标签都识别出来了。现在,回到“Data state”,读取“Hello world”中的字符“H”将创建并识别出一个字符符号,这里会为“Hello world”中的每个字符生成一

23、个字符符号。这样直到遇到“”中的“”。现在,又回到了“Tag open state”,读取下一个字符“/”将创建一个闭合标签符号,并且状态转移到“Tag name state”,还是保持这一状态,直到遇到“”。然后,产生一个新的标签符号并回到“Data state”。后面的“”将和“”一样处理。图10:符号化示例输入树的构建算法Tree construction algorithm在树的构建阶段,将修改以Document为根的DOM树,将元素附加到树上。每个由符号识别器识别生成的节点将会被树构造器进行处理,规范中定义了每个符号相对应的Dom元素,对应的Dom元素将会被创建。这些元素除了会被添加

24、到Dom树上,还将被添加到开放元素堆栈中。这个堆栈用来纠正嵌套的未匹配和未闭合标签,这个算法也是用状态机来描述,所有的状态采用插入模式。来看一下示例中树的创建过程:Hello world构建树这一阶段的输入是符号识别阶段生成的符号序列。首先是“initial mode”,接收到html符号后将转换为“before html”模式,在这个模式中对这个符号进行再处理。此时,创建了一个HTMLHtmlElement元素,并将其附加到根Document对象上。状态此时变为“before head”,接收到body符号时,即使这里没有head符号,也将自动创建一个HTMLHeadElement元素并附加

25、到树上。现在,转到“in head”模式,然后是“after head”。到这里,body符号会被再次处理,将创建一个HTMLBodyElement并插入到树中,同时,转移到“in body”模式。然后,接收到字符串“Hello world”的字符符号,第一个字符将导致创建并插入一个text节点,其他字符将附加到该节点。接收到body结束符号时,转移到“after body”模式,接着接收到html结束符号,这个符号意味着转移到了“after after body”模式,当接收到文件结束符时,整个解析过程结束。图11:示例html树的构建过程解析结束时的处理Action when the pa

26、rsing is finished在这个阶段,浏览器将文档标记为可交互的,并开始解析处于延时模式中的脚本这些脚本在文档解析后执行。文档状态将被设置为完成,同时触发一个load事件。Html5规范中有符号化及构建树的完整算法(http:/www.w3.org/TR/html5/syntax.html#html-parser)。浏览器容错Browsers error tolerance你从来不会在一个html页面上看到“无效语法”这样的错误,浏览器修复了无效内容并继续工作。以下面这段html为例:Really lousy HTML这段html违反了很多规则(mytag不是合法的标签,p及div错误

27、的嵌套等等),但是浏览器仍然可以没有任何怨言的继续显示,它在解析的过程中修复了html作者的错误。浏览器都具有错误处理的能力,但是,另人惊讶的是,这并不是html最新规范的内容,就像书签及前进后退按钮一样,它只是浏览器长期发展的结果。一些比较知名的非法html结构,在许多站点中出现过,浏览器都试着以一种和其他浏览器一致的方式去修复。Html5规范定义了这方面的需求,webkit在html解析类开始部分的注释中做了很好的总结。解析器将符号化的输入解析为文档并创建文档,但不幸的是,我们必须处理很多没有很好格式化的html文档,至少要小心下面几种错误情况。1.在未闭合的标签中添加明确禁止的元素。这种

28、情况下,应该先将前一标签闭合2.不能直接添加元素。有些人在写文档的时候会忘了中间一些标签(或者中间标签是可选的),比如HTML HEAD BODY TR TD LI等3.想在一个行内元素中添加块状元素。关闭所有的行内元素,直到下一个更高的块状元素4.如果这些都不行,就闭合当前标签直到可以添加该元素。下面来看一些webkit容错的例子:替代一些网站使用替代,为了兼容IE和Firefox,webkit将其看作。代码:if (t-isCloseTag(brTag) & m_document-inCompatMode() reportError(MalformedBRError);t-beginTag

29、 = true;Note这里的错误处理在内部进行,用户看不到。迷路的表格这指一个表格嵌套在另一个表格中,但不在它的某个单元格内。比如下面这个例子:inner tableouter tablewebkit将会将嵌套的表格变为两个兄弟表格:outer tableinner table代码:if (m_inStrayTableContent & localName = tableTag)popBlock(tableTag);webkit使用堆栈存放当前的元素内容,它将从外部表格的堆栈中弹出内部的表格,则它们变为了兄弟表格。嵌套的表单元素用户将一个表单嵌套到另一个表单中,则第二个表单将被忽略。代码:if (!m_currentFormElement) m_currentFormElement = new HTMLFormElement(formTag,m_document);太深的标签继承www.liceo.edu.mx是一个由嵌套层次的站点的例子,最多只允许20个相同类型的标签嵌套,多出来的将被忽略。代码:bool HTMLParser:allowNestedRedundantTag(const AtomicString& tagName)unsigned i = 0;for (HTMLStackElem* curr = m_blockStack;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1