Index: Source/core/html/parser/HTMLDocumentParser.cpp |
diff --git a/Source/core/html/parser/HTMLDocumentParser.cpp b/Source/core/html/parser/HTMLDocumentParser.cpp |
index a871096f1f7ad6f2bcc4ee8c7849034f9738e288..1d349669659c14a25a20a5e5a2b2e425478d756a 100644 |
--- a/Source/core/html/parser/HTMLDocumentParser.cpp |
+++ b/Source/core/html/parser/HTMLDocumentParser.cpp |
@@ -116,6 +116,7 @@ HTMLDocumentParser::HTMLDocumentParser(HTMLDocument& document, bool reportErrors |
, m_isPinnedToMainThread(false) |
, m_endWasDelayed(false) |
, m_haveBackgroundParser(false) |
+ , m_tasksWereSuspended(false) |
, m_pumpSessionNestingLevel(0) |
, m_pumpSpeculationsSessionNestingLevel(0) |
{ |
@@ -135,6 +136,7 @@ HTMLDocumentParser::HTMLDocumentParser(DocumentFragment* fragment, Element* cont |
, m_isPinnedToMainThread(true) |
, m_endWasDelayed(false) |
, m_haveBackgroundParser(false) |
+ , m_tasksWereSuspended(false) |
, m_pumpSessionNestingLevel(0) |
, m_pumpSpeculationsSessionNestingLevel(0) |
{ |
@@ -329,7 +331,9 @@ void HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser(PassOwnPtr<Pa |
// alert(), runModalDialog, and the JavaScript Debugger all run nested event loops |
// which can cause this method to be re-entered. We detect re-entry using |
// hasActiveParser(), save the chunk as a speculation, and return. |
- if (isWaitingForScripts() || !m_speculations.isEmpty() || document()->activeParserCount() > 0) { |
+ if (isWaitingForScripts() || !m_speculations.isEmpty() || document()->activeParserCount() > 0 || m_tasksWereSuspended || isScheduledForResume()) { |
+ if (m_tasksWereSuspended) |
+ m_parserScheduler->forceResumeAfterYield(); |
m_preloader->takeAndPreload(chunk->preloads); |
m_speculations.append(chunk); |
return; |
@@ -1012,12 +1016,16 @@ void HTMLDocumentParser::parseDocumentFragment(const String& source, DocumentFra |
void HTMLDocumentParser::suspendScheduledTasks() |
{ |
+ ASSERT(!m_tasksWereSuspended); |
+ m_tasksWereSuspended = true; |
if (m_parserScheduler) |
m_parserScheduler->suspend(); |
} |
void HTMLDocumentParser::resumeScheduledTasks() |
{ |
+ ASSERT(m_tasksWereSuspended); |
+ m_tasksWereSuspended = false; |
if (m_parserScheduler) |
m_parserScheduler->resume(); |
} |