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
本文详细解析HTML、CSS和JS执行过程中如何暂停解析以避免冲突,以及预取CSS和JS文件的策略。同时,介绍了HTMLConstructionSite::attach函数构建DOM树并加入RenderObject的过程,解释了脚本执行、CSS阻塞脚本执行的原理,以及FragmentParsingContext的作用。
219

被折叠的 条评论
为什么被折叠?



