diff options
author | Iain Merrick <husky@google.com> | 2010-09-13 16:35:48 +0100 |
---|---|---|
committer | Iain Merrick <husky@google.com> | 2010-09-16 12:10:42 +0100 |
commit | 5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306 (patch) | |
tree | ddce1aa5e3b6967a69691892e500897558ff8ab6 /WebCore/html/parser/HTMLScriptRunner.cpp | |
parent | 12bec63ec71e46baba27f0bd9bd9d8067683690a (diff) | |
download | external_webkit-5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306.zip external_webkit-5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306.tar.gz external_webkit-5abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306.tar.bz2 |
Merge WebKit at r67178 : Initial merge by git.
Change-Id: I57e01163b6866cb029cdadf405a0394a3918bc18
Diffstat (limited to 'WebCore/html/parser/HTMLScriptRunner.cpp')
-rw-r--r-- | WebCore/html/parser/HTMLScriptRunner.cpp | 55 |
1 files changed, 47 insertions, 8 deletions
diff --git a/WebCore/html/parser/HTMLScriptRunner.cpp b/WebCore/html/parser/HTMLScriptRunner.cpp index 6d470a0..e1fc120 100644 --- a/WebCore/html/parser/HTMLScriptRunner.cpp +++ b/WebCore/html/parser/HTMLScriptRunner.cpp @@ -28,7 +28,7 @@ #include "Attribute.h" #include "CachedScript.h" -#include "DocLoader.h" +#include "CachedResourceLoader.h" #include "Element.h" #include "Event.h" #include "Frame.h" @@ -75,6 +75,12 @@ HTMLScriptRunner::~HTMLScriptRunner() // FIXME: Should we be passed a "done loading/parsing" callback sooner than destruction? if (m_parsingBlockingScript.cachedScript() && m_parsingBlockingScript.watchingForLoad()) stopWatchingForLoad(m_parsingBlockingScript); + + while (!m_scriptsToExecuteAfterParsing.isEmpty()) { + PendingScript pendingScript = m_scriptsToExecuteAfterParsing.takeFirst(); + if (pendingScript.cachedScript() && pendingScript.watchingForLoad()) + stopWatchingForLoad(pendingScript); + } } void HTMLScriptRunner::detach() @@ -129,10 +135,6 @@ void HTMLScriptRunner::executeParsingBlockingScript() ASSERT(m_document->haveStylesheetsLoaded()); ASSERT(isPendingScriptReady(m_parsingBlockingScript)); - // Stop watching loads before executeScript to prevent recursion if the script reloads itself. - if (m_parsingBlockingScript.cachedScript() && m_parsingBlockingScript.watchingForLoad()) - stopWatchingForLoad(m_parsingBlockingScript); - InsertionPointRecord insertionPointRecord(m_host->inputStream()); executePendingScriptAndDispatchEvent(m_parsingBlockingScript); } @@ -142,6 +144,10 @@ void HTMLScriptRunner::executePendingScriptAndDispatchEvent(PendingScript& pendi bool errorOccurred = false; ScriptSourceCode sourceCode = sourceFromPendingScript(pendingScript, errorOccurred); + // Stop watching loads before executeScript to prevent recursion if the script reloads itself. + if (pendingScript.cachedScript() && pendingScript.watchingForLoad()) + stopWatchingForLoad(pendingScript); + // Clear the pending script before possible rentrancy from executeScript() RefPtr<Element> scriptElement = pendingScript.releaseElementAndClear(); { @@ -238,6 +244,24 @@ bool HTMLScriptRunner::executeScriptsWaitingForStylesheets() return executeParsingBlockingScripts(); } +bool HTMLScriptRunner::executeScriptsWaitingForParsing() +{ + while (!m_scriptsToExecuteAfterParsing.isEmpty()) { + ASSERT(!m_scriptNestingLevel); + ASSERT(!haveParsingBlockingScript()); + ASSERT(m_scriptsToExecuteAfterParsing.first().cachedScript()); + if (!m_scriptsToExecuteAfterParsing.first().cachedScript()->isLoaded()) { + watchForLoad(m_scriptsToExecuteAfterParsing.first()); + return false; + } + PendingScript first = m_scriptsToExecuteAfterParsing.takeFirst(); + executePendingScriptAndDispatchEvent(first); + if (!m_document) + return false; + } + return true; +} + void HTMLScriptRunner::requestParsingBlockingScript(Element* element) { if (!requestPendingScript(m_parsingBlockingScript, element)) @@ -252,6 +276,16 @@ void HTMLScriptRunner::requestParsingBlockingScript(Element* element) watchForLoad(m_parsingBlockingScript); } +void HTMLScriptRunner::requestDeferredScript(Element* element) +{ + PendingScript pendingScript; + if (!requestPendingScript(pendingScript, element)) + return; + + ASSERT(pendingScript.cachedScript()); + m_scriptsToExecuteAfterParsing.append(pendingScript); +} + bool HTMLScriptRunner::requestPendingScript(PendingScript& pendingScript, Element* script) const { ASSERT(!pendingScript.element()); @@ -264,7 +298,7 @@ bool HTMLScriptRunner::requestPendingScript(PendingScript& pendingScript, Elemen return false; pendingScript.adoptElement(script); // This should correctly return 0 for empty or invalid srcValues. - CachedScript* cachedScript = m_document->docLoader()->requestScript(srcValue, toScriptElement(script)->scriptCharset()); + CachedScript* cachedScript = m_document->cachedResourceLoader()->requestScript(srcValue, toScriptElement(script)->scriptCharset()); if (!cachedScript) { notImplemented(); // Dispatch error event. return false; @@ -287,8 +321,13 @@ void HTMLScriptRunner::runScript(Element* script, int startingLineNumber) notImplemented(); // event for support if (script->hasAttribute(srcAttr)) { - // FIXME: Handle defer and async - requestParsingBlockingScript(script); + if (script->hasAttribute(asyncAttr)) // Async takes precendence over defer. + return; // Asynchronous scripts handle themselves. + + if (script->hasAttribute(deferAttr)) + requestDeferredScript(script); + else + requestParsingBlockingScript(script); } else { // FIXME: We do not block inline <script> tags on stylesheets to match the // old parser for now. When we do, the ASSERT below should be added. |