diff options
Diffstat (limited to 'Source/WebCore/dom/ScriptRunner.cpp')
-rw-r--r-- | Source/WebCore/dom/ScriptRunner.cpp | 72 |
1 files changed, 37 insertions, 35 deletions
diff --git a/Source/WebCore/dom/ScriptRunner.cpp b/Source/WebCore/dom/ScriptRunner.cpp index f48913d0b..0c666aa52 100644 --- a/Source/WebCore/dom/ScriptRunner.cpp +++ b/Source/WebCore/dom/ScriptRunner.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2010 Google, Inc. All Rights Reserved. + * Copyright (C) 2011-2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,7 +27,6 @@ #include "config.h" #include "ScriptRunner.h" -#include "CachedScript.h" #include "Element.h" #include "PendingScript.h" #include "ScriptElement.h" @@ -35,40 +35,44 @@ namespace WebCore { ScriptRunner::ScriptRunner(Document& document) : m_document(document) - , m_timer(this, &ScriptRunner::timerFired) + , m_timer(*this, &ScriptRunner::timerFired) { } ScriptRunner::~ScriptRunner() { - for (size_t i = 0; i < m_scriptsToExecuteSoon.size(); ++i) + for (auto& pendingScript : m_scriptsToExecuteSoon) { + UNUSED_PARAM(pendingScript); m_document.decrementLoadEventDelayCount(); - for (size_t i = 0; i < m_scriptsToExecuteInOrder.size(); ++i) + } + for (auto& pendingScript : m_scriptsToExecuteInOrder) { + if (pendingScript->watchingForLoad()) + pendingScript->clearClient(); m_document.decrementLoadEventDelayCount(); - for (int i = 0; i < m_pendingAsyncScripts.size(); ++i) + } + for (auto& pendingScript : m_pendingAsyncScripts) { + if (pendingScript->watchingForLoad()) + pendingScript->clearClient(); m_document.decrementLoadEventDelayCount(); + } } -void ScriptRunner::queueScriptForExecution(ScriptElement* scriptElement, CachedResourceHandle<CachedScript> cachedScript, ExecutionType executionType) +void ScriptRunner::queueScriptForExecution(ScriptElement& scriptElement, LoadableScript& loadableScript, ExecutionType executionType) { - ASSERT(scriptElement); - ASSERT(cachedScript.get()); - - Element* element = scriptElement->element(); - ASSERT(element); - ASSERT(element->inDocument()); + ASSERT(scriptElement.element().isConnected()); m_document.incrementLoadEventDelayCount(); + auto pendingScript = PendingScript::create(scriptElement, loadableScript); switch (executionType) { case ASYNC_EXECUTION: - m_pendingAsyncScripts.add(scriptElement, PendingScript(element, cachedScript.get())); + m_pendingAsyncScripts.add(pendingScript.copyRef()); break; - case IN_ORDER_EXECUTION: - m_scriptsToExecuteInOrder.append(PendingScript(element, cachedScript.get())); + m_scriptsToExecuteInOrder.append(pendingScript.copyRef()); break; } + pendingScript->setClient(*this); } void ScriptRunner::suspend() @@ -82,41 +86,39 @@ void ScriptRunner::resume() m_timer.startOneShot(0); } -void ScriptRunner::notifyScriptReady(ScriptElement* scriptElement, ExecutionType executionType) +void ScriptRunner::notifyFinished(PendingScript& pendingScript) { - switch (executionType) { - case ASYNC_EXECUTION: - ASSERT(m_pendingAsyncScripts.contains(scriptElement)); - m_scriptsToExecuteSoon.append(m_pendingAsyncScripts.take(scriptElement)); - break; - - case IN_ORDER_EXECUTION: + if (pendingScript.element().willExecuteInOrder()) ASSERT(!m_scriptsToExecuteInOrder.isEmpty()); - break; + else { + ASSERT(m_pendingAsyncScripts.contains(pendingScript)); + m_scriptsToExecuteSoon.append(m_pendingAsyncScripts.take(pendingScript)->ptr()); } + pendingScript.clearClient(); m_timer.startOneShot(0); } -void ScriptRunner::timerFired(Timer<ScriptRunner>& timer) +void ScriptRunner::timerFired() { - ASSERT_UNUSED(timer, &timer == &m_timer); - Ref<Document> protect(m_document); - Vector<PendingScript> scripts; + Vector<RefPtr<PendingScript>> scripts; scripts.swap(m_scriptsToExecuteSoon); size_t numInOrderScriptsToExecute = 0; - for (; numInOrderScriptsToExecute < m_scriptsToExecuteInOrder.size() && m_scriptsToExecuteInOrder[numInOrderScriptsToExecute].cachedScript()->isLoaded(); ++numInOrderScriptsToExecute) - scripts.append(m_scriptsToExecuteInOrder[numInOrderScriptsToExecute]); + for (; numInOrderScriptsToExecute < m_scriptsToExecuteInOrder.size() && m_scriptsToExecuteInOrder[numInOrderScriptsToExecute]->isLoaded(); ++numInOrderScriptsToExecute) + scripts.append(m_scriptsToExecuteInOrder[numInOrderScriptsToExecute].ptr()); if (numInOrderScriptsToExecute) m_scriptsToExecuteInOrder.remove(0, numInOrderScriptsToExecute); - size_t size = scripts.size(); - for (size_t i = 0; i < size; ++i) { - CachedScript* cachedScript = scripts[i].cachedScript(); - RefPtr<Element> element = scripts[i].releaseElementAndClear(); - toScriptElementIfPossible(element.get())->execute(cachedScript); + for (auto& currentScript : scripts) { + auto script = WTFMove(currentScript); + ASSERT(script); + // Paper over https://bugs.webkit.org/show_bug.cgi?id=144050 + if (!script) + continue; + ASSERT(script->needsLoading()); + script->element().executePendingScript(*script); m_document.decrementLoadEventDelayCount(); } } |