chromium 之 DOM tree 解析和创建(代码调试)

平台:         WIN10
调试工具:  vs2019
chromium: 78.0.3904.108
解析网站:   www.so.com
(有条件的小伙伴建议根据文章里的断点,自己调试,分析堆栈和查看数据的结构,可能会有不同的理解)

WebKit构建DOM所使用的主要基础设施类

下图是 chromium webkit 构建 dom 树时,主要用到的类,我们会在下图中部分类的实现中,进行跟踪,分析 dom 的构建过程

 

1.DocumentLoader

(src\third_party\blink\renderer\core\loader\document_loader.cc)
在 DocumentLoader 类的构造函数 DocumentLoader::DocumentLoader 打断点,查看堆栈:

根据堆栈,可以看出从 LocalFrame 初始化到 DocumentLoader 构造的堆栈过程。

2.HTMLTreeBuilder

(src\third_party\blink\renderer\core\html\parser\html_tree_builder.cc)
在 HTMLTreeBuilder 类的 HTMLTreeBuilder::ConstructTree 实现中 打断点,查看构造tree 的堆栈:

DocumentLoader::FinishedLoading 完成加载 html 资源后,调用 HTMLDocumentParser::Finish
HTMLDocumentParser 可以理解为管理类,通过 HTMLDocumentParser 调用其他工作的类 开始解析 html。

3.HTMLDocumentParser

(src\third_party\blink\renderer\core\html\parser\html_document_parser.cc)
在 HTMLDocumentParser::PumpPendingSpeculations 的开头打断点,然后跟到下图处:

其中, speculations_ 保存的是 html 信息,由 BackgroundHTMLParser::PumpTokenizer() 调用 EnqueueTokenizedChunk 拆成多组并保存。如下图堆栈:

拆分的逻辑遇到以下特征时,则进行拆分,代码如下:

将数据存放到 speculations_  后,循环解析,在 HTMLDocumentParser::PumpPendingSpeculations 中 while 循环解析,堆栈如下:

跟踪到 HTMLDocumentParser::ProcessTokenizedChunkFromBackgroundParser 中,从 speculations_  中的每组数据中,进行分别解析。

我们可以先看下 www.so.com 的资源:

解析 speculations_  的第一组数据,包括如下:

观察 tokens 中的数据,便是 www.so.com 中每个元素解析后的数据:

 

4. HTMLConstructionSite

(\src\third_party\blink\renderer\core\html\parser\html_construction_site.cc)

跟踪从 HTMLDocumentParser::ProcessTokenizedChunkFromBackgroundParser 中每个token 的之后的逻辑,
会执行到 HTMLConstructionSite::ExecuteQueuedTasks() ,堆栈如下:

将 token 中的元素进行解析构建,知道把 www.so.com 的第一个 <html class="w3c"> 解析完成后,dom tree 结构如下:

在图中可以看到,open_elements_ 中的 stack_depth_ 深度为1。
此处入栈和出栈的规则如下:
1. 遇到起始的 token,则入栈
2. 遇到结束的 token,则出栈

譬如,我们执行到下图中的 title 时

查看堆栈及数据结构:

tree_ 中 open_elements_ 为三层,之前的 meta 标签已经出栈。

将 www.so.com 的 html 资源全部解析完成后,变完成了 dom tree 的构造过程。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值