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..7912e6a6e2c2577ff050064c1192645dc48d0a1a 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; |
+ 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 |
+{ |
+ ASSERT(!m_tree.isEmpty()); |
+ if (isParsingFragment() && m_tree.oneOpenElement() && m_fragmentContext.contextElement()) { |
+ 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)) { |