Index: Source/core/dom/ScriptLoader.cpp |
diff --git a/Source/core/dom/ScriptLoader.cpp b/Source/core/dom/ScriptLoader.cpp |
index f69e0e63d362e4750b5f16bbce060813de6b7058..4dea7b47e475275550b62de50658a5a59fdaef79 100644 |
--- a/Source/core/dom/ScriptLoader.cpp |
+++ b/Source/core/dom/ScriptLoader.cpp |
@@ -65,6 +65,8 @@ ScriptLoader::ScriptLoader(Element* element, bool parserInserted, bool alreadySt |
, m_readyToBeParserExecuted(false) |
, m_willExecuteWhenDocumentFinishedParsing(false) |
, m_forceAsync(!parserInserted) |
+ , m_hasAsyncAttribute(false) |
+ , m_hasDeferAttribute(false) |
, m_willExecuteInOrder(false) |
{ |
ASSERT(m_element); |
@@ -100,6 +102,7 @@ void ScriptLoader::handleSourceAttribute(const String& sourceUrl) |
void ScriptLoader::handleAsyncAttribute() |
{ |
m_forceAsync = false; |
+ m_hasAsyncAttribute = true; |
} |
// Helper function |
@@ -184,6 +187,9 @@ bool ScriptLoader::prepareScript(const TextPosition& scriptStartPosition, Legacy |
if (wasParserInserted && !client->asyncAttributeValue()) |
m_forceAsync = true; |
+ if (client->deferAttributeValue()) |
+ m_hasDeferAttribute = true; |
+ |
// FIXME: HTML5 spec says we should check that all children are either comments or empty text nodes. |
if (!client->hasSourceAttribute() && !m_element->hasChildren()) |
return false; |
@@ -267,6 +273,9 @@ bool ScriptLoader::fetchScript(const String& sourceUrl) |
if (scriptPassesCSP) |
request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); |
+ if (!m_parserInserted || m_hasAsyncAttribute || m_hasDeferAttribute) |
+ request.setExecAsync(true); |
+ |
m_resource = elementDocument->fetcher()->fetchScript(request); |
m_isExternalScript = true; |
} |