Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Unified Diff: third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp

Issue 2690273002: [Script Spec Annotation] Annotate "prepare a script" (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
index 3b41d8d5c32763fca6682618b984adab8194edea..df5a192b494f7b44dadc76c28874f2b2bdb920fe 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
@@ -438,7 +438,11 @@ bool HTMLParserScriptRunner::executeScriptsWaitingForParsing() {
return true;
}
+// 2nd Clause, Step 23 of https://html.spec.whatwg.org/#prepare-a-script
void HTMLParserScriptRunner::requestParsingBlockingScript(Element* element) {
+ // "The element is the pending parsing-blocking script of the Document of
+ // the parser that created the element.
+ // (There can only be one such script per Document at a time.)"
if (!requestPendingScript(m_parserBlockingScript.get(), element))
return;
@@ -462,6 +466,7 @@ void HTMLParserScriptRunner::requestParsingBlockingScript(Element* element) {
}
}
+// 1st Clause, Step 23 of https://html.spec.whatwg.org/#prepare-a-script
void HTMLParserScriptRunner::requestDeferredScript(Element* element) {
PendingScript* pendingScript = PendingScript::create(nullptr, nullptr);
if (!requestPendingScript(pendingScript, element))
@@ -478,6 +483,10 @@ void HTMLParserScriptRunner::requestDeferredScript(Element* element) {
}
DCHECK(pendingScript->resource());
+
+ // "Add the element to the end of the list of scripts that will execute
+ // when the document has finished parsing associated with the Document
+ // of the parser that created the element."
m_scriptsToExecuteAfterParsing.append(pendingScript);
}
@@ -525,16 +534,28 @@ void HTMLParserScriptRunner::processScriptElementInternal(
scriptLoader->prepareScript(scriptStartPosition);
+ // A part of Step 23 of https://html.spec.whatwg.org/#prepare-a-script:
if (!scriptLoader->willBeParserExecuted())
return;
if (scriptLoader->willExecuteWhenDocumentFinishedParsing()) {
+ // 1st Clause of Step 23.
requestDeferredScript(script);
} else if (scriptLoader->readyToBeParserExecuted()) {
+ // 5th Clause of Step 23.
+ // "If ... it's an HTML parser
+ // whose script nesting level is not greater than one"
if (m_reentryPermit->scriptNestingLevel() == 1u) {
+ // "The element is the pending parsing-blocking script of the
+ // Document of the parser that created the element.
+ // (There can only be one such script per Document at a time.)"
m_parserBlockingScript->setElement(script);
m_parserBlockingScript->setStartingPosition(scriptStartPosition);
} else {
+ // 6th Clause of Step 23.
+ // "Immediately execute the script block,
+ // even if other scripts are already executing."
+ // TODO(hiroshige): Merge the block into ScriptLoader::prepareScript().
DCHECK_GT(m_reentryPermit->scriptNestingLevel(), 1u);
m_parserBlockingScript->dispose();
ScriptSourceCode sourceCode(script->textContent(),
@@ -543,6 +564,7 @@ void HTMLParserScriptRunner::processScriptElementInternal(
doExecuteScript(script, sourceCode, scriptStartPosition);
}
} else {
+ // 2nd Clause of Step 23.
requestParsingBlockingScript(script);
}
}

Powered by Google App Engine
This is Rietveld 408576698