Chromium Code Reviews| 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 3e25498464fb2d31de3e0953a636f297a7c036ba..ff592f12d2271bcc8c57915e8e3121b1b3833fdd 100644 |
| --- a/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp |
| +++ b/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp |
| @@ -157,7 +157,7 @@ HTMLParserScriptRunner::HTMLParserScriptRunner( |
| : m_reentryPermit(reentryPermit), |
| m_document(document), |
| m_host(host), |
| - m_parserBlockingScript(PendingScript::create(nullptr, nullptr)) { |
| + m_parserBlockingScript(nullptr) { |
|
sof
2017/02/16 08:15:16
I don't mind terribly, but null-initializing Membe
hiroshige
2017/02/17 23:15:15
I'd like to leave this to make it more explicitly
|
| DCHECK(m_host); |
| } |
| @@ -170,7 +170,9 @@ void HTMLParserScriptRunner::detach() { |
| if (!m_document) |
| return; |
| - m_parserBlockingScript->dispose(); |
| + if (m_parserBlockingScript) |
| + m_parserBlockingScript->dispose(); |
| + m_parserBlockingScript = nullptr; |
| while (!m_scriptsToExecuteAfterParsing.isEmpty()) { |
| PendingScript* pendingScript = m_scriptsToExecuteAfterParsing.takeFirst(); |
| @@ -183,9 +185,10 @@ void HTMLParserScriptRunner::detach() { |
| } |
| bool HTMLParserScriptRunner::isParserBlockingScriptReady() { |
| + DCHECK(parserBlockingScript()); |
| if (!m_document->isScriptExecutionReady()) |
| return false; |
| - return m_parserBlockingScript->isReady(); |
| + return parserBlockingScript()->isReady(); |
| } |
| // This has two callers and corresponds to different concepts in the spec: |
| @@ -228,6 +231,11 @@ void HTMLParserScriptRunner::executePendingScriptAndDispatchEvent( |
| // There is no longer a pending parsing-blocking script." |
| // Clear the pending script before possible re-entrancy from executeScript() |
| pendingScript->dispose(); |
| + pendingScript = nullptr; |
| + |
| + if (pendingScriptType == ScriptStreamer::ParsingBlocking) { |
| + m_parserBlockingScript = nullptr; |
| + } |
| if (ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element)) { |
| // 7. "Increment the parser's script nesting level by one (it should be |
| @@ -315,13 +323,14 @@ void HTMLParserScriptRunner::possiblyFetchBlockedDocWriteScript( |
| TextPosition startingPosition; |
|
sof
2017/02/16 08:15:16
nit: could you move these decls down to where they
hiroshige
2017/02/17 23:15:15
Done.
|
| bool isParserInserted = false; |
| - if (m_parserBlockingScript != pendingScript) |
| + if (parserBlockingScript() != pendingScript) |
| return; |
| - Element* element = m_parserBlockingScript->element(); |
| - if (!element) |
| + if (!parserBlockingScript()) |
|
sof
2017/02/16 08:15:16
I think it makes sense to have this check first.
hiroshige
2017/02/17 23:15:15
Done.
|
| return; |
| + Element* element = parserBlockingScript()->element(); |
| + |
| ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element); |
| if (!scriptLoader || !scriptLoader->disallowedFetchForDocWrittenScript()) |
| return; |
| @@ -338,7 +347,7 @@ void HTMLParserScriptRunner::possiblyFetchBlockedDocWriteScript( |
| emitErrorForDocWriteScripts(pendingScript->resource()->url().getString(), |
| *m_document); |
| - startingPosition = m_parserBlockingScript->startingPosition(); |
| + startingPosition = parserBlockingScript()->startingPosition(); |
| isParserInserted = scriptLoader->isParserInserted(); |
| // Remove this resource entry from memory cache as the new request |
| // should not join onto this existing entry. |
| @@ -401,7 +410,7 @@ void HTMLParserScriptRunner::processScriptElement( |
| // - "Otherwise": |
| - traceParserBlockingScript(m_parserBlockingScript.get(), |
| + traceParserBlockingScript(parserBlockingScript(), |
| !m_document->isScriptExecutionReady()); |
| m_parserBlockingScript->markParserBlockingLoadStartTime(); |
| @@ -415,7 +424,7 @@ void HTMLParserScriptRunner::processScriptElement( |
| } |
| bool HTMLParserScriptRunner::hasParserBlockingScript() const { |
| - return !!m_parserBlockingScript->element(); |
| + return parserBlockingScript(); |
| } |
| // Implements the "Otherwise" Clause of 'An end tag whose tag name is "script"' |
| @@ -440,7 +449,7 @@ void HTMLParserScriptRunner::executeParsingBlockingScripts() { |
| InsertionPointRecord insertionPointRecord(m_host->inputStream()); |
| // 1., 7.--9. |
| - executePendingScriptAndDispatchEvent(m_parserBlockingScript.get(), |
| + executePendingScriptAndDispatchEvent(m_parserBlockingScript, |
|
sof
2017/02/16 08:15:16
parserBlockingScript() for consistency.
hiroshige
2017/02/17 23:15:15
I used parserBlockingScript() for const ref and m_
|
| ScriptStreamer::ParsingBlocking); |
| // 10. "Let the insertion point be undefined again." |
| @@ -456,8 +465,8 @@ void HTMLParserScriptRunner::executeScriptsWaitingForLoad( |
| TRACE_EVENT0("blink", "HTMLParserScriptRunner::executeScriptsWaitingForLoad"); |
| DCHECK(!isExecutingScript()); |
| DCHECK(hasParserBlockingScript()); |
| - DCHECK_EQ(pendingScript, m_parserBlockingScript); |
| - DCHECK(m_parserBlockingScript->isReady()); |
| + DCHECK_EQ(pendingScript, parserBlockingScript()); |
| + DCHECK(parserBlockingScript()->isReady()); |
| executeParsingBlockingScripts(); |
| } |
| @@ -520,20 +529,22 @@ 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)) |
| + CHECK(!parserBlockingScript()); |
| + m_parserBlockingScript = requestPendingScript(element); |
| + if (!parserBlockingScript()) |
| return; |
| - DCHECK(m_parserBlockingScript->resource()); |
| + DCHECK(parserBlockingScript()->resource()); |
| // We only care about a load callback if resource is not already in the cache. |
| // Callers will attempt to run the m_parserBlockingScript if possible before |
| // returning control to the parser. |
| - if (!m_parserBlockingScript->isReady()) { |
| + if (!parserBlockingScript()->isReady()) { |
| if (m_document->frame()) { |
| ScriptState* scriptState = ScriptState::forMainWorld(m_document->frame()); |
| if (scriptState) { |
| ScriptStreamer::startStreaming( |
| - m_parserBlockingScript.get(), ScriptStreamer::ParsingBlocking, |
| + m_parserBlockingScript, ScriptStreamer::ParsingBlocking, |
| m_document->frame()->settings(), scriptState, |
| TaskRunnerHelper::get(TaskType::Networking, m_document)); |
| } |
| @@ -545,8 +556,8 @@ 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)) |
| + PendingScript* pendingScript = requestPendingScript(element); |
| + if (!pendingScript) |
| return; |
| if (m_document->frame() && !pendingScript->isReady()) { |
| @@ -567,18 +578,16 @@ void HTMLParserScriptRunner::requestDeferredScript(Element* element) { |
| m_scriptsToExecuteAfterParsing.append(pendingScript); |
| } |
| -bool HTMLParserScriptRunner::requestPendingScript(PendingScript* pendingScript, |
| - Element* script) const { |
| - DCHECK(!pendingScript->element()); |
| - pendingScript->setElement(script); |
| +PendingScript* HTMLParserScriptRunner::requestPendingScript( |
| + Element* element) const { |
| // This should correctly return 0 for empty or invalid srcValues. |
| - ScriptResource* resource = toScriptLoaderIfPossible(script)->resource(); |
| + ScriptResource* resource = toScriptLoaderIfPossible(element)->resource(); |
| if (!resource) { |
|
kouhei (in TOK)
2017/02/16 00:55:09
Do we ever get here?
hiroshige
2017/02/16 01:13:15
Probably no, because fetchScript() should have ret
hiroshige
2017/02/17 23:15:15
Created https://codereview.chromium.org/2692863013
|
| DVLOG(1) << "Not implemented."; // Dispatch error event. |
| - return false; |
| + return nullptr; |
| } |
| - pendingScript->setScriptResource(resource); |
| - return true; |
| + |
| + return PendingScript::create(element, resource); |
| } |
| // Implements the initial steps for 'An end tag whose tag name is "script"' |
| @@ -635,15 +644,18 @@ void HTMLParserScriptRunner::processScriptElementInternal( |
| // "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); |
| + CHECK(!m_parserBlockingScript); |
| + m_parserBlockingScript = |
| + PendingScript::create(script, 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(); |
| + if (m_parserBlockingScript) |
| + m_parserBlockingScript->dispose(); |
| + m_parserBlockingScript = nullptr; |
| ScriptSourceCode sourceCode(script->textContent(), |
| documentURLForScriptExecution(m_document), |
| scriptStartPosition); |