| Index: Source/core/html/parser/HTMLTreeBuilder.cpp
|
| diff --git a/Source/core/html/parser/HTMLTreeBuilder.cpp b/Source/core/html/parser/HTMLTreeBuilder.cpp
|
| index 1c910153d31a30fcb46b03a7fde4c2d1235602d5..0553f7384f9054e234ed2df991d0f728c1e81317 100644
|
| --- a/Source/core/html/parser/HTMLTreeBuilder.cpp
|
| +++ b/Source/core/html/parser/HTMLTreeBuilder.cpp
|
| @@ -358,6 +358,7 @@ HTMLTreeBuilder::FragmentParsingContext::~FragmentParsingContext()
|
| PassRefPtr<Element> HTMLTreeBuilder::takeScriptToProcess(TextPosition& scriptStartPosition)
|
| {
|
| ASSERT(m_scriptToProcess);
|
| + ASSERT(!m_tree.hasPendingTasks());
|
| // Unpause ourselves, callers may pause us again when processing the script.
|
| // The HTML5 spec is written as though scripts are executed inside the tree
|
| // builder. We pause the parser to exit the tree builder, and then resume
|
| @@ -398,6 +399,9 @@ void HTMLTreeBuilder::processToken(AtomicHTMLToken* token)
|
| return;
|
| }
|
|
|
| + // Any non-character token needs to cause us to flush any pending text immediately.
|
| + // NOTE: flush() can cause any queued tasks to execute, possibly re-entering the parser.
|
| + m_tree.flush();
|
| m_shouldSkipLeadingNewline = false;
|
|
|
| switch (token->type()) {
|
| @@ -2717,6 +2721,15 @@ bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken* token)
|
|
|
| void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token)
|
| {
|
| + if (token->type() == HTMLToken::Character) {
|
| + const String& characters = token->characters();
|
| + m_tree.insertTextNode(characters);
|
| + if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))
|
| + m_framesetOk = false;
|
| + return;
|
| + }
|
| +
|
| + m_tree.flush();
|
| RefPtr<HTMLStackItem> adjustedCurrentNode = adjustedCurrentStackItem();
|
|
|
| switch (token->type()) {
|
| @@ -2815,14 +2828,8 @@ void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token)
|
| }
|
| case HTMLToken::Comment:
|
| m_tree.insertComment(token);
|
| - return;
|
| - case HTMLToken::Character: {
|
| - const String& characters = token->characters();
|
| - m_tree.insertTextNode(characters);
|
| - if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))
|
| - m_framesetOk = false;
|
| break;
|
| - }
|
| + case HTMLToken::Character:
|
| case HTMLToken::EndOfFile:
|
| ASSERT_NOT_REACHED();
|
| break;
|
|
|