WebKit HTML解析的新理解与未解问题

1、脚本解析的过程中要暂停HTML的parse过程,因为脚本的执行可能会使用write方法写入HTML,但是当脚本执行时,会启动与scan过程,查看下面有那些需要预取的css和js文件,提前下载。

2、当解析CSS的过程虽然不会改变Dom,但还是要暂停script的执行,因为script可能会请求,element的style信息,如果此时css还没有解析完成,就会取得错误的样式信息,但webkit只有在脚本可能请求到未加载的style信息时,才阻塞脚本的执行。

3、HTMLConstructionSite::attach完成Dom树的构建,同时在这个函数中,会调用Element的attach函数,将节点加入到renderTree当中。在Element的attach函数中,会根据需要创建RenderObject,并将RenderObject加入到renderTree当中。

-------------

困惑的问题

1、脚本到底在哪里执行的呢?在HTMLTreeBuilder中只是看到了获得了脚本text,但并没有找到谁来调用脚本的执行

script的执行过程是这样的:在HTMLDocumentParser::runScriptsForPausedTreeBuilder()函数执行HTMLScriptRunner::execute(Element,scriptStartPosition),进而调用HTMLScriptRunner::runScript(Element,scriptStartPosition),在runScript函数中,首先通过toScriptElement函数,将Element转成ScriptElement,通过prepareScript(scriptStartPosition),来构建ScriptElement,根据是否立刻执行scirpt来决定是否延迟执行script,如果立刻执行则调用ScriptElement::executeScript(sourceCode),参数是ScriptSourceCode类型。在ScriptElement::executeScript函数中,会调用frame->script->evaluate(sourceCode),也就是说调用Frame中的ScriptControler::evaluate(sourceCode),而ScriptControler的实现是与js解析引擎相关的,V8有自己的ScriptControler的实现。Script的执行一定会牵扯到Frame,因为Script的一些重要函数都是有Frame提供的(猜测的hehe)

2、执行脚本的过程中,什么地方执行预取操作了呢?还没有看清楚

3、当解析style时,是如何阻塞script的执行的呢?

4、FragmentParsingContext作用是什么?它保存了一个指向DocumenFragment的指针,而且还可以决定是否执行script

5、文档如何加载的?

Document类创建时设定了URL,Document类有Frame的实例,不过可以为空,Frame有loader



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值