android4.0.1 webkit dom tree 创建过程分析

一. DOM(Document Object Model)
文档对象模型是独立于平台和语言的一套编程接口,允许程序和脚本动态的访问和更新文档的内容,结构和样式。
文档可以被进一步的处理,处理的结果可以与当前页面交互。
W3C 发布 DOM 规范,所有的浏览器都执行了这个标准。
DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、这些对象的行为和属性以及这些对象之间的关系。
webkit解析网络上取到的主资源(text/html)生成DOM tree的过程是依据规范(http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html)实现的。
在生成DOM Tree的过程也会同时建立Render Tree,以下是与DOM Tree创建相关的主要类的类图。

DOMTree创建的类图:


类图下载地址



HTMLDocumentParser封装了创建DOM tree要用到的主要类。
HTMLInputStream 存放网络上取到的原始数据。
HTMLTokenizer将原始数据分成HTMLToken.
HTMLSourceTracker用于跟踪原始数据的当前位置。
HTMLTreeBuilder利用HTMLToken创建DOM树。具体的创建过程通过调用类HTMLConstructionSite的接口完成。

二.DOM Tree的创建过程如下:

1.得到主资源(text/html)。DocumentLoader将主资源传给DocumentWriter,DocumentWriter最终将数据传给了DecodedDataDocumentParser。

2.将主资源解码为Unicode字符。从网络上取到的主资源数据是原始的字符数据经过特定的字符编码形成的字节流,

在交给Tokenizer进一步处理之前,需要先将编码后的字节流解码成原始的字符(Unicode code point)。

 这项工作是由DecodedDataDocumentParser在appendBytes()函数中通过调用TextResourceDecoder类的具体字符解码器完成的。
 解码后的字符数据保存在类HTMLInputStream的实例中。

在创建DOM Tree的过程中可能会执行脚本document.write(),这会改变文档的结构,所以HTMLInputStream需要提供这样的接口工HTMLDocuemntParser调用来临时增加Document内容。InsertionPointRecord用来记录通过Document.write()增加的内容在HTMLInputStream中的插入信息。


3.  将解码后的主资源分割为HTMLToken。HTMLTokenizer负责将HTMLInputStream中的数据分割成HTMLToken。
HTMLToken 可以看作是html文档的基本组成单位。有以下几种类型:
enum Type {
        Uninitialized,
        DOCTYPE,
        StartTag,
        EndTag,
        Comment,
        Character,
        EndOfFile,

       };

DOCTYPE 对应 html 文档中的 <!DOCTYPE HTML>

StartTag对应 html 文档中的 <head> <body> 等。

EndTag对应 html 文档中的 </head> </body>等。
Comment ,  Character对应html 标签之间的字符内容。


4.创建DOMTree及RenderTree。HTMLTreeBuilder利用HTMLToken来创建DOM tree的过程。


   HTMLTreeBuilder提供了私有的方法来处理不同类型的HTMLToken.
    void processDoctypeToken(AtomicHTMLToken&);
    void processStartTag(AtomicHTMLToken&);
    void processEndTag(AtomicHTMLToken&);
    void processComment(AtomicHTMLToken&);
    void processCharacter(AtomicHTMLToken&);

    void processEndOfFile(AtomicHTMLToken&);

InsertionMode 是一个状态变量,用来控制DOM Tree创建过程的主要操作。InsertionMode指明了当前处理的HTMLToken的相对位置信息,

因而会影响HTMLToken的处理过程。

比如在调用processStartTag()处理StartTag类型的HTMLToken时,如果当前的InsertionMode是InTableMode,则表明当前的Start标签处在Table元素中,对这个标签的进一步处理会通过调用processStartTagForInTable()进行。
InsertionMode的值为“before html”时,会创建 html 的 root element node. 这个node 被压入栈HTMLConstructionSite::m_openElements.
HTMLTreeBuilder对HTMLToken的处理最终会调用HTMLConstructionSite的insertxxxxElement,并改变InsertionMode的值。

HTMLConstructionSite会根据HTMLToken创建HTMLElement从而创建node及containernode,新创建的node会与当前的node创建关联,也就是新创建的node被插入到已创建的DOMTree。这个过程是通过HTMLConstructionSite的attach函数调用当前Node的parserAddChild()完成的,containerNode调用模板函数appendChildToContainer建立新建Node与当前Node的关联。

当HTML Document的所有HTMLToken代表的Node都建立起关联时,DOM Tree就建成了。


DOM Tree创建的顺序图:

顺序图下载地址



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要下载Android Studio 4.0.1,首先需要确保您的计算机系统符合下载要求,例如操作系统版本、处理器类型和运行内存等。然后,您可以访问Android Studio的官方网站,在下载页面上选择合适的下载包,如Windows版、macOS版或Linux版。在下载之前,您还需同意开源许可协议,以便使用Android Studio并获得最新的更新。下载完成后,您就可以运行安装程序进行安装。在安装过程中,您需要确认一些设置,如安装位置、应安装的工具和选项等,同时还需保证网络连接正常以便下载所需的库文件和模板。安装完成后,请在启动Android Studio之前确认您的计算机性能满足最低要求,否则可能会影响应用程序开发效率和体验。如果需要更多安装指导和使用教程,请参考官方文档和社区论坛等资源。 ### 回答2: 要下载Android Studio 4.0.1,首先您需要访问Android官方网站,选择下载页面。在这个页面上,您将看到最新版本的Android Studio已经被列出了。然后,您可以点击“Download”按钮,以开始下载Android Studio 4.0.1。 当然,在下载之前,您需要确认您的个人电脑或笔记本电脑已经满足了Android Studio的最小要求,如1.6 GHz的64位处理器,4GB RAM,和至少2GB的硬盘空间等等。 一旦下载完成,您需要打开安装程序并完成安装。在安装过程中,安装程序将提示您选择安装组件和安装位置等。一旦所有的步骤都完成,Android Studio 4.0.1就会被完全安装,并准备为您创建和开发Android应用程序。 您还可以更新现有的Android Studio软件,以便升级到最新的4.0.1版本。只需执行软件中的“检查更新”操作,软件会自动检测并下载升级,并按照上述过程进行安装。 总的来说,下载和安装Android Studio 4.0.1是非常简单的。因为Android Studio是由Google官方发布的,因此您可以放心使用它来构建和开发您的Android应用程序。 ### 回答3: Android Studio是由Google开发的开发工具,旨在为开发人员提供最佳的Android应用程序开发体验。在Android Studio中,可以使用Java、Kotlin等编程语言来开发应用程序,并且提供丰富的工具和组件库来简化开发过程。 要下载Android Studio 4.0.1,可以直接访问官方网站进行下载。安装过程非常简单,只需要按照提示操作即可。安装完成后,开发人员可以开始使用Android Studio创建项目、添加依赖关系、编写代码并生成应用程序。此外,Android Studio还提供了实时预览等功能,方便开发人员在开发过程中进行测试和调试。 总之,Android Studio是一款非常强大、易于使用的Android开发工具。通过下载和使用Android Studio 4.0.1,开发人员可以轻松地创建高质量、高效率的Android应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值