Index: Source/core/dom/ScriptLoader.cpp |
diff --git a/Source/core/dom/ScriptLoader.cpp b/Source/core/dom/ScriptLoader.cpp |
index e51592dab70ce86c91374db04e706e305ec30768..4879d4d051c23907a66a98f9b5b06ad076605b40 100644 |
--- a/Source/core/dom/ScriptLoader.cpp |
+++ b/Source/core/dom/ScriptLoader.cpp |
@@ -75,7 +75,7 @@ |
ScriptLoader::~ScriptLoader() |
{ |
- m_pendingScript.stopWatchingForLoad(this); |
+ stopLoadRequest(); |
} |
void ScriptLoader::didNotifySubtreeInsertionsToDocument() |
@@ -235,15 +235,11 @@ |
m_readyToBeParserExecuted = true; |
} else if (client->hasSourceAttribute() && !client->asyncAttributeValue() && !m_forceAsync) { |
m_willExecuteInOrder = true; |
- m_pendingScript = PendingScript(m_element, m_resource.get()); |
- contextDocument->scriptRunner()->queueScriptForExecution(this, ScriptRunner::IN_ORDER_EXECUTION); |
- // Note that watchForLoad can immediately call notifyFinished. |
- m_pendingScript.watchForLoad(this); |
+ contextDocument->scriptRunner()->queueScriptForExecution(this, m_resource, ScriptRunner::IN_ORDER_EXECUTION); |
+ m_resource->addClient(this); |
} else if (client->hasSourceAttribute()) { |
- m_pendingScript = PendingScript(m_element, m_resource.get()); |
- contextDocument->scriptRunner()->queueScriptForExecution(this, ScriptRunner::ASYNC_EXECUTION); |
- // Note that watchForLoad can immediately call notifyFinished. |
- m_pendingScript.watchForLoad(this); |
+ contextDocument->scriptRunner()->queueScriptForExecution(this, m_resource, ScriptRunner::ASYNC_EXECUTION); |
+ m_resource->addClient(this); |
} else { |
// Reset line numbering for nested writes. |
TextPosition position = elementDocument.isInDocumentWrite() ? TextPosition() : scriptStartPosition; |
@@ -360,20 +356,26 @@ |
} |
} |
-void ScriptLoader::execute() |
+void ScriptLoader::stopLoadRequest() |
+{ |
+ if (m_resource) { |
+ if (!m_willBeParserExecuted) |
+ m_resource->removeClient(this); |
+ m_resource = 0; |
+ } |
+} |
+ |
+void ScriptLoader::execute(ScriptResource* resource) |
{ |
ASSERT(!m_willBeParserExecuted); |
- ASSERT(m_pendingScript.resource()); |
- bool errorOccurred = false; |
- ScriptSourceCode source = m_pendingScript.getSource(KURL(), errorOccurred); |
- RefPtr<Element> element = m_pendingScript.releaseElementAndClear(); |
- if (errorOccurred) { |
+ ASSERT(resource); |
+ if (resource->errorOccurred()) { |
dispatchErrorEvent(); |
- } else if (!m_resource->wasCanceled()) { |
- executeScript(source); |
+ } else if (!resource->wasCanceled()) { |
+ executeScript(ScriptSourceCode(resource)); |
dispatchLoadEvent(); |
} |
- m_resource = 0; |
+ resource->removeClient(this); |
} |
void ScriptLoader::notifyFinished(Resource* resource) |
@@ -385,8 +387,13 @@ |
if (!contextDocument) |
return; |
+ // Resource possibly invokes this notifyFinished() more than |
+ // once because ScriptLoader doesn't unsubscribe itself from |
+ // Resource here and does it in execute() instead. |
+ // We use m_resource to check if this function is already called. |
ASSERT_UNUSED(resource, resource == m_resource); |
- |
+ if (!m_resource) |
+ return; |
if (m_resource->errorOccurred()) { |
dispatchErrorEvent(); |
contextDocument->scriptRunner()->notifyScriptLoadError(this, m_willExecuteInOrder ? ScriptRunner::IN_ORDER_EXECUTION : ScriptRunner::ASYNC_EXECUTION); |
@@ -397,7 +404,7 @@ |
else |
contextDocument->scriptRunner()->notifyScriptReady(this, ScriptRunner::ASYNC_EXECUTION); |
- m_pendingScript.stopWatchingForLoad(this); |
+ m_resource = 0; |
} |
bool ScriptLoader::ignoresLoadRequest() const |