基础概念就不多说了,直接进入正题,HTML解析这部分我主要关注了6点:1. 词法解析 2. 语法解析 3. 容错机制 4. DOM树构建 5. Render树构建 6. 查看DOM树和Render树
先上一个调用堆栈,该堆栈的调用过程基本囊括了前5点:
#0 WebCore::RenderObject::createObject
#1 WebCore::NodeRendererFactory::createRenderer
#2 WebCore::NodeRendererFactory::createRendererIfNeeded
#3 WebCore::Node::createRendererIfNeeded
#4 WebCore::Element::attach
#5 WebCore::executeTask
#6 WebCore::HTMLConstructionSite::executeQueuedTasks
#7 WebCore::HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML
#8 WebCore::HTMLTreeBuilder::processStartTag
#9 WebCore::HTMLTreeBuilder::constructTreeFromAtomicToken
#10 WebCore::HTMLTreeBuilder::constructTreeFromToken
#11 WebCore::HTMLDocumentParser::pumpTokenizer
#12 append
#13 WebCore::HTMLDocumentParser::append
#14 WebCore::DecodedDataDocumentParser::flush
#15 WebCore::DocumentWriter::end
#16 WebCore::DocumentLoader::finishedLoading
由此可见,加载完资源之后,由HTMLDocumentParser来总体调度HTML的解析。
1. 词法解析
首先进行的是词法解析,由HTMLDocumentParser::pumpTokenizer掉用WebCore::HTMLTokenizer::nextToken来完成。
这一篇文章对HTML的词法解析进行了非常详细的讲解,大家自行参考,我就不在赘述。
2. 语法分析,容错机制,DOM树构建,Render树构建
在词法分析的基础上,对词法分析的结果(HTMLToken)进行进一步的分析,然后创建相应的DOM节点,同时创建相应的Render节点。也就是说语法分析,容错机制,DOM树构建,Render树构建是一串连续的行为。
这篇文章和这篇文章对这个过程进行了比较全面的阐述,大家可以对照代码自行参考
值得一提的是,容错机制的一个典型例子是开发元素堆栈,它可以对一些错误的嵌套或者开闭进行纠错,该堆栈的另一个功能是确定元素的父子关系
3. 查看DOM树和Render树
我在这篇文章中已经有过介绍,这里不再赘述。
因为对于webkit这些关键代码,网上各位前辈的分析都比较详尽了,我再自己去写一遍也没啥意义。所以这里主要是按照我的学习框架来整合一些比较好的文章,希望大家看过之后对HTML的解析过程有比较完整和稍微深入的认识