Chromium Code Reviews| Index: Source/core/html/parser/HTMLTreeBuilder.cpp |
| diff --git a/Source/core/html/parser/HTMLTreeBuilder.cpp b/Source/core/html/parser/HTMLTreeBuilder.cpp |
| index 84100a88e31f8edc5bbe4f2fb27c248c98bac633..43cf9f89ec7c597983900eb1c83bcfd4fa19bed7 100644 |
| --- a/Source/core/html/parser/HTMLTreeBuilder.cpp |
| +++ b/Source/core/html/parser/HTMLTreeBuilder.cpp |
| @@ -375,10 +375,15 @@ void HTMLTreeBuilder::constructTree(AtomicHTMLToken* token) |
| processToken(token); |
| if (m_parser->tokenizer()) { |
| - bool inForeignContent = !m_tree.isEmpty() |
| - && !m_tree.currentStackItem()->isInHTMLNamespace() |
| - && !HTMLElementStack::isHTMLIntegrationPoint(m_tree.currentStackItem()) |
| - && !HTMLElementStack::isMathMLTextIntegrationPoint(m_tree.currentStackItem()); |
| + bool inForeignContent = false; |
| + |
| + if (!m_tree.isEmpty()) { |
| + RefPtr<HTMLStackItem> contextNodeRef; |
|
abarth-chromium
2013/10/29 04:04:42
contextNodeRef <-- What does the "Ref" in this na
|
| + HTMLStackItem* adjustedCurrentNode = adjustedCurrentStackItem(contextNodeRef); |
| + inForeignContent = !adjustedCurrentNode->isInHTMLNamespace() |
| + && !HTMLElementStack::isHTMLIntegrationPoint(adjustedCurrentNode) |
| + && !HTMLElementStack::isMathMLTextIntegrationPoint(adjustedCurrentNode); |
| + } |
| m_parser->tokenizer()->setForceNullCharacterReplacement(m_insertionMode == TextMode || inForeignContent); |
| m_parser->tokenizer()->setShouldAllowCDATA(inForeignContent); |
| @@ -995,6 +1000,18 @@ bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup() |
| return true; |
| } |
| +// http://www.whatwg.org/specs/web-apps/current-work/#adjusted-current-node |
| +HTMLStackItem* HTMLTreeBuilder::adjustedCurrentStackItem(RefPtr<HTMLStackItem>& contextStackItem) const |
|
abarth-chromium
2013/10/29 04:04:42
Why not just return a PassRefPtr<HTMLStackItem>.
davve
2013/10/29 09:15:38
Just me showing my inexperience with the RefPtr-fa
|
| +{ |
| + ASSERT(!m_tree.isEmpty()); |
| + if (isParsingFragment() && m_tree.openElements()->hasOnlyOneElement()) { |
| + contextStackItem = HTMLStackItem::create(m_fragmentContext.contextElement(), HTMLStackItem::ItemForContextElement); |
| + return contextStackItem.get(); |
| + } |
| + |
| + return m_tree.currentStackItem(); |
| +} |
| + |
| // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#close-the-cell |
| void HTMLTreeBuilder::closeTheCell() |
| { |
| @@ -2675,10 +2692,12 @@ bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken* token) |
| { |
| if (m_tree.isEmpty()) |
| return false; |
| - HTMLStackItem* item = m_tree.currentStackItem(); |
| - if (item->isInHTMLNamespace()) |
| + RefPtr<HTMLStackItem> contextNodeRef; |
| + HTMLStackItem* adjustedCurrentNode = adjustedCurrentStackItem(contextNodeRef); |
| + |
| + if (adjustedCurrentNode->isInHTMLNamespace()) |
| return false; |
| - if (HTMLElementStack::isMathMLTextIntegrationPoint(item)) { |
| + if (HTMLElementStack::isMathMLTextIntegrationPoint(adjustedCurrentNode)) { |
| if (token->type() == HTMLToken::StartTag |
| && token->name() != MathMLNames::mglyphTag |
| && token->name() != MathMLNames::malignmarkTag) |
| @@ -2686,11 +2705,11 @@ bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken* token) |
| if (token->type() == HTMLToken::Character) |
| return false; |
| } |
| - if (item->hasTagName(MathMLNames::annotation_xmlTag) |
| + if (adjustedCurrentNode->hasTagName(MathMLNames::annotation_xmlTag) |
| && token->type() == HTMLToken::StartTag |
| && token->name() == SVGNames::svgTag) |
| return false; |
| - if (HTMLElementStack::isHTMLIntegrationPoint(item)) { |
| + if (HTMLElementStack::isHTMLIntegrationPoint(adjustedCurrentNode)) { |
| if (token->type() == HTMLToken::StartTag) |
| return false; |
| if (token->type() == HTMLToken::Character) |
| @@ -2703,6 +2722,9 @@ bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken* token) |
| void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token) |
| { |
| + RefPtr<HTMLStackItem> contextNodeRef; |
| + HTMLStackItem* adjustedCurrentNode = adjustedCurrentStackItem(contextNodeRef); |
| + |
| switch (token->type()) { |
| case HTMLToken::Uninitialized: |
| ASSERT_NOT_REACHED(); |
| @@ -2756,7 +2778,7 @@ void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token) |
| processStartTag(token); |
| return; |
| } |
| - const AtomicString& currentNamespace = m_tree.currentStackItem()->namespaceURI(); |
| + const AtomicString& currentNamespace = adjustedCurrentNode->namespaceURI(); |
| if (currentNamespace == MathMLNames::mathmlNamespaceURI) |
| adjustMathMLAttributes(token); |
| if (currentNamespace == SVGNames::svgNamespaceURI) { |
| @@ -2768,7 +2790,7 @@ void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token) |
| break; |
| } |
| case HTMLToken::EndTag: { |
| - if (m_tree.currentStackItem()->namespaceURI() == SVGNames::svgNamespaceURI) |
| + if (adjustedCurrentNode->namespaceURI() == SVGNames::svgNamespaceURI) |
| adjustSVGTagNameCase(token); |
| if (token->name() == SVGNames::scriptTag && m_tree.currentStackItem()->hasTagName(SVGNames::scriptTag)) { |