Chromium Code Reviews| Index: third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp |
| diff --git a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp |
| index e1b14f284a4d4af8aa807151ba8e4b7dde9d0fac..df6181bedc9ac8f4987d9efd6adfc96bca7b51c2 100644 |
| --- a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp |
| +++ b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp |
| @@ -48,6 +48,7 @@ using namespace HTMLNames; |
| HTMLScriptRunner::HTMLScriptRunner(Document* document, HTMLScriptRunnerHost* host) |
| : m_document(document) |
| , m_host(host) |
| + , m_parserBlockingScript(PendingScript::create(nullptr, nullptr)) |
| , m_scriptNestingLevel(0) |
| , m_hasScriptsWaitingForResources(false) |
| , m_parserBlockingScriptAlreadyLoaded(false) |
| @@ -74,13 +75,13 @@ void HTMLScriptRunner::detach() |
| if (!m_document) |
| return; |
| - m_parserBlockingScript.stopWatchingForLoad(this); |
| - m_parserBlockingScript.releaseElementAndClear(); |
| + m_parserBlockingScript->stopWatchingForLoad(this); |
|
haraken
2016/01/12 00:22:52
You cannot touch m_parserBlockingScript here becau
Nate Chapin
2016/01/13 20:36:33
Done.
|
| + m_parserBlockingScript->releaseElementAndClear(); |
| while (!m_scriptsToExecuteAfterParsing.isEmpty()) { |
| - PendingScript pendingScript = m_scriptsToExecuteAfterParsing.takeFirst(); |
| - pendingScript.stopWatchingForLoad(this); |
| - pendingScript.releaseElementAndClear(); |
| + OwnPtrWillBeRawPtr<PendingScript> pendingScript = m_scriptsToExecuteAfterParsing.takeFirst(); |
| + pendingScript->stopWatchingForLoad(this); |
| + pendingScript->releaseElementAndClear(); |
| } |
| m_document = nullptr; |
| } |
| @@ -105,12 +106,12 @@ inline PassRefPtrWillBeRawPtr<Event> createScriptLoadEvent() |
| return Event::create(EventTypeNames::load); |
| } |
| -bool HTMLScriptRunner::isPendingScriptReady(const PendingScript& script) |
| +bool HTMLScriptRunner::isPendingScriptReady(const PendingScript* script) |
| { |
| m_hasScriptsWaitingForResources = !m_document->isScriptExecutionReady(); |
| if (m_hasScriptsWaitingForResources) |
| return false; |
| - return script.isReady(); |
| + return script->isReady(); |
| } |
| void HTMLScriptRunner::executeParsingBlockingScript() |
| @@ -118,20 +119,20 @@ void HTMLScriptRunner::executeParsingBlockingScript() |
| ASSERT(m_document); |
| ASSERT(!isExecutingScript()); |
| ASSERT(m_document->isScriptExecutionReady()); |
| - ASSERT(isPendingScriptReady(m_parserBlockingScript)); |
| + ASSERT(isPendingScriptReady(m_parserBlockingScript.get())); |
| InsertionPointRecord insertionPointRecord(m_host->inputStream()); |
| - executePendingScriptAndDispatchEvent(m_parserBlockingScript, PendingScript::ParsingBlocking); |
| + executePendingScriptAndDispatchEvent(m_parserBlockingScript.get(), PendingScript::ParsingBlocking); |
| } |
| -void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendingScript, PendingScript::Type pendingScriptType) |
| +void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript* pendingScript, PendingScript::Type pendingScriptType) |
| { |
| bool errorOccurred = false; |
| - double loadFinishTime = pendingScript.resource() && pendingScript.resource()->url().protocolIsInHTTPFamily() ? pendingScript.resource()->loadFinishTime() : 0; |
| - ScriptSourceCode sourceCode = pendingScript.getSource(documentURLForScriptExecution(m_document), errorOccurred); |
| + double loadFinishTime = pendingScript->resource() && pendingScript->resource()->url().protocolIsInHTTPFamily() ? pendingScript->resource()->loadFinishTime() : 0; |
| + ScriptSourceCode sourceCode = pendingScript->getSource(documentURLForScriptExecution(m_document), errorOccurred); |
| // Stop watching loads before executeScript to prevent recursion if the script reloads itself. |
| - pendingScript.stopWatchingForLoad(this); |
| + pendingScript->stopWatchingForLoad(this); |
| if (!isExecutingScript()) { |
| Microtask::performCheckpoint(V8PerIsolateData::mainThreadIsolate()); |
| @@ -144,7 +145,7 @@ void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendi |
| } |
| // Clear the pending script before possible rentrancy from executeScript() |
| - RefPtrWillBeRawPtr<Element> element = pendingScript.releaseElementAndClear(); |
| + RefPtrWillBeRawPtr<Element> element = pendingScript->releaseElementAndClear(); |
| double compilationFinishTime = 0; |
| if (ScriptLoader* scriptLoader = toScriptLoaderIfPossible(element.get())) { |
| NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); |
| @@ -171,15 +172,15 @@ void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendi |
| void HTMLScriptRunner::stopWatchingResourceForLoad(Resource* resource) |
| { |
| - if (m_parserBlockingScript.resource() == resource) { |
| - m_parserBlockingScript.stopWatchingForLoad(this); |
| - m_parserBlockingScript.releaseElementAndClear(); |
| + if (m_parserBlockingScript->resource() == resource) { |
| + m_parserBlockingScript->stopWatchingForLoad(this); |
| + m_parserBlockingScript->releaseElementAndClear(); |
| return; |
| } |
| - for (PendingScript& script : m_scriptsToExecuteAfterParsing) { |
| - if (script.resource() == resource) { |
| - script.stopWatchingForLoad(this); |
| - script.releaseElementAndClear(); |
| + for (auto& script : m_scriptsToExecuteAfterParsing) { |
| + if (script->resource() == resource) { |
| + script->stopWatchingForLoad(this); |
| + script->releaseElementAndClear(); |
| return; |
| } |
| } |
| @@ -225,12 +226,12 @@ void HTMLScriptRunner::execute(PassRefPtrWillBeRawPtr<Element> scriptElement, co |
| bool HTMLScriptRunner::hasParserBlockingScript() const |
| { |
| - return !!m_parserBlockingScript.element(); |
| + return !!m_parserBlockingScript->element(); |
| } |
| void HTMLScriptRunner::executeParsingBlockingScripts() |
| { |
| - while (hasParserBlockingScript() && isPendingScriptReady(m_parserBlockingScript)) |
| + while (hasParserBlockingScript() && isPendingScriptReady(m_parserBlockingScript.get())) |
| executeParsingBlockingScript(); |
| } |
| @@ -238,8 +239,8 @@ void HTMLScriptRunner::executeScriptsWaitingForLoad(Resource* resource) |
| { |
| ASSERT(!isExecutingScript()); |
| ASSERT(hasParserBlockingScript()); |
| - ASSERT_UNUSED(resource, m_parserBlockingScript.resource() == resource); |
| - ASSERT(m_parserBlockingScript.isReady()); |
| + ASSERT_UNUSED(resource, m_parserBlockingScript->resource() == resource); |
| + ASSERT(m_parserBlockingScript->isReady()); |
| executeParsingBlockingScripts(); |
| } |
| @@ -259,13 +260,13 @@ bool HTMLScriptRunner::executeScriptsWaitingForParsing() |
| while (!m_scriptsToExecuteAfterParsing.isEmpty()) { |
| ASSERT(!isExecutingScript()); |
| ASSERT(!hasParserBlockingScript()); |
| - ASSERT(m_scriptsToExecuteAfterParsing.first().resource()); |
| - if (!m_scriptsToExecuteAfterParsing.first().isReady()) { |
| - m_scriptsToExecuteAfterParsing.first().watchForLoad(this); |
| + ASSERT(m_scriptsToExecuteAfterParsing.first()->resource()); |
| + if (!m_scriptsToExecuteAfterParsing.first()->isReady()) { |
| + m_scriptsToExecuteAfterParsing.first()->watchForLoad(this); |
| return false; |
| } |
| - PendingScript first = m_scriptsToExecuteAfterParsing.takeFirst(); |
| - executePendingScriptAndDispatchEvent(first, PendingScript::Deferred); |
| + OwnPtrWillBeRawPtr<PendingScript> first = m_scriptsToExecuteAfterParsing.takeFirst(); |
| + executePendingScriptAndDispatchEvent(first.get(), PendingScript::Deferred); |
| // FIXME: What is this m_document check for? |
| if (!m_document) |
| return false; |
| @@ -275,52 +276,52 @@ bool HTMLScriptRunner::executeScriptsWaitingForParsing() |
| void HTMLScriptRunner::requestParsingBlockingScript(Element* element) |
| { |
| - if (!requestPendingScript(m_parserBlockingScript, element)) |
| + if (!requestPendingScript(m_parserBlockingScript.get(), element)) |
| return; |
| - ASSERT(m_parserBlockingScript.resource()); |
| + ASSERT(m_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 (!m_parserBlockingScript->isReady()) { |
| if (m_document->frame()) { |
| ScriptState* scriptState = ScriptState::forMainWorld(m_document->frame()); |
| if (scriptState) |
| - ScriptStreamer::startStreaming(m_parserBlockingScript, PendingScript::ParsingBlocking, m_document->frame()->settings(), scriptState, m_document->loadingTaskRunner()); |
| + ScriptStreamer::startStreaming(m_parserBlockingScript.get(), PendingScript::ParsingBlocking, m_document->frame()->settings(), scriptState, m_document->loadingTaskRunner()); |
| } |
| - m_parserBlockingScript.watchForLoad(this); |
| + m_parserBlockingScript->watchForLoad(this); |
| } |
| } |
| void HTMLScriptRunner::requestDeferredScript(Element* element) |
| { |
| - PendingScript pendingScript; |
| - if (!requestPendingScript(pendingScript, element)) |
| + OwnPtrWillBeRawPtr<PendingScript> pendingScript = PendingScript::create(nullptr, nullptr); |
| + if (!requestPendingScript(pendingScript.get(), element)) |
| return; |
| - if (m_document->frame() && !pendingScript.isReady()) { |
| + if (m_document->frame() && !pendingScript->isReady()) { |
| ScriptState* scriptState = ScriptState::forMainWorld(m_document->frame()); |
| if (scriptState) |
| - ScriptStreamer::startStreaming(pendingScript, PendingScript::Deferred, m_document->frame()->settings(), scriptState, m_document->loadingTaskRunner()); |
| + ScriptStreamer::startStreaming(pendingScript.get(), PendingScript::Deferred, m_document->frame()->settings(), scriptState, m_document->loadingTaskRunner()); |
| } |
| - ASSERT(pendingScript.resource()); |
| - m_scriptsToExecuteAfterParsing.append(pendingScript); |
| + ASSERT(pendingScript->resource()); |
| + m_scriptsToExecuteAfterParsing.append(pendingScript.release()); |
| } |
| -bool HTMLScriptRunner::requestPendingScript(PendingScript& pendingScript, Element* script) const |
| +bool HTMLScriptRunner::requestPendingScript(PendingScript* pendingScript, Element* script) const |
| { |
| - ASSERT(!pendingScript.element()); |
| - pendingScript.setElement(script); |
| + ASSERT(!pendingScript->element()); |
| + pendingScript->setElement(script); |
| // This should correctly return 0 for empty or invalid srcValues. |
| ScriptResource* resource = toScriptLoaderIfPossible(script)->resource().get(); |
| if (!resource) { |
| notImplemented(); // Dispatch error event. |
| return false; |
| } |
| - pendingScript.setScriptResource(resource); |
| + pendingScript->setScriptResource(resource); |
| return true; |
| } |
| @@ -358,8 +359,8 @@ void HTMLScriptRunner::runScript(Element* script, const TextPosition& scriptStar |
| requestDeferredScript(script); |
| } else if (scriptLoader->readyToBeParserExecuted()) { |
| if (m_scriptNestingLevel == 1) { |
| - m_parserBlockingScript.setElement(script); |
| - m_parserBlockingScript.setStartingPosition(scriptStartPosition); |
| + m_parserBlockingScript->setElement(script); |
| + m_parserBlockingScript->setStartingPosition(scriptStartPosition); |
| } else { |
| ScriptSourceCode sourceCode(script->textContent(), documentURLForScriptExecution(m_document), scriptStartPosition); |
| scriptLoader->executeScript(sourceCode); |