diff options
Diffstat (limited to 'WebCore/html/HTMLParser.cpp')
-rw-r--r-- | WebCore/html/HTMLParser.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/WebCore/html/HTMLParser.cpp b/WebCore/html/HTMLParser.cpp index 1cb47ae..f13c19b 100644 --- a/WebCore/html/HTMLParser.cpp +++ b/WebCore/html/HTMLParser.cpp @@ -203,6 +203,25 @@ void HTMLParser::setCurrent(Node* newCurrent) m_didRefCurrent = didRefNewCurrent; } +inline static int tagPriorityOfNode(Node* n) +{ + return n->isHTMLElement() ? static_cast<HTMLElement*>(n)->tagPriority() : 0; +} + +inline void HTMLParser::limitBlockDepth(int tagPriority) +{ + if (tagPriority >= minBlockLevelTagPriority) { + while (m_blocksInStack >= cMaxBlockDepth) + popBlock(m_blockStack->tagName); + } +} + +inline bool HTMLParser::insertNodeAfterLimitBlockDepth(Node* n, bool flat) +{ + limitBlockDepth(tagPriorityOfNode(n)); + return insertNode(n, flat); +} + PassRefPtr<Node> HTMLParser::parseToken(Token* t) { if (!m_skipModeTag.isNull()) { @@ -241,7 +260,7 @@ PassRefPtr<Node> HTMLParser::parseToken(Token* t) while (charsLeft) { // split large blocks of text to nodes of manageable size n = Text::createWithLengthLimit(m_document, text, charsLeft); - if (!insertNode(n.get(), t->selfClosingTag)) + if (!insertNodeAfterLimitBlockDepth(n.get(), t->selfClosingTag)) return 0; } return n; @@ -271,7 +290,7 @@ PassRefPtr<Node> HTMLParser::parseToken(Token* t) } } - if (!insertNode(n.get(), t->selfClosingTag)) { + if (!insertNodeAfterLimitBlockDepth(n.get(), t->selfClosingTag)) { // we couldn't insert the node if (n->isElementNode()) { @@ -329,21 +348,17 @@ bool HTMLParser::insertNode(Node* n, bool flat) RefPtr<Node> protectNode(n); const AtomicString& localName = n->localName(); - int tagPriority = n->isHTMLElement() ? static_cast<HTMLElement*>(n)->tagPriority() : 0; // <table> is never allowed inside stray table content. Always pop out of the stray table content // and close up the first table, and then start the second table as a sibling. if (m_inStrayTableContent && localName == tableTag) popBlock(tableTag); - if (tagPriority >= minBlockLevelTagPriority) { - while (m_blocksInStack >= cMaxBlockDepth) - popBlock(m_blockStack->tagName); - } - if (m_parserQuirks && !m_parserQuirks->shouldInsertNode(m_current, n)) return false; + int tagPriority = tagPriorityOfNode(n); + // let's be stupid and just try to insert it. // this should work if the document is well-formed Node* newNode = m_current->addChild(n); |