| 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)) {
|
|
|