summaryrefslogtreecommitdiff
path: root/Source/WebCore/dom/ScriptRunner.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/dom/ScriptRunner.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/dom/ScriptRunner.cpp')
-rw-r--r--Source/WebCore/dom/ScriptRunner.cpp72
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();
}
}