From bb948e0ef80ef262e8324a06c3a1d18a9713b2ad Mon Sep 17 00:00:00 2001 From: iska Date: Sun, 15 May 2016 18:50:20 +0200 Subject: [PATCH] Check the qualified instead of the local name in the stack of open elements This fixes the parser's behaviour when handling elements in the MathML and SVG namespaces. See: https://bugs.webkit.org/show_bug.cgi?id=113723 https://www.w3.org/Bugs/Public/show_bug.cgi?id=21308 https://www.w3.org/Bugs/Public/show_bug.cgi?id=21292 --- HTMLKit/HTMLStackOfOpenElements.m | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/HTMLKit/HTMLStackOfOpenElements.m b/HTMLKit/HTMLStackOfOpenElements.m index 7747366..daf1517 100644 --- a/HTMLKit/HTMLStackOfOpenElements.m +++ b/HTMLKit/HTMLStackOfOpenElements.m @@ -129,7 +129,11 @@ - (void)popElementsUntilElementPoppedWithTagName:(NSString *)tagName { - while (self.currentNode && ![self.currentNode.tagName isEqualToString:tagName]) { + while (self.currentNode) { + if (self.currentNode.htmlNamespace == HTMLNamespaceHTML && + [self.currentNode.tagName isEqualToString:tagName]) { + break; + } [_stack removeLastObject]; } [_stack removeLastObject]; @@ -137,7 +141,11 @@ - (void)popElementsUntilAnElementPoppedWithAnyOfTagNames:(NSArray *)tagNames { - while (self.currentNode && ![tagNames containsObject:self.currentNode.tagName]) { + while (self.currentNode) { + if (self.currentNode.htmlNamespace == HTMLNamespaceHTML && + [tagNames containsObject:self.currentNode.tagName]) { + break; + } [_stack removeLastObject]; } [_stack removeLastObject]; @@ -257,7 +265,10 @@ { for (HTMLElement *node in _stack.reverseObjectEnumerator) { if ([tagNames containsObject:node.tagName]) { - return node; + NSNumber *namespace = elementTypes[node.tagName] ?: @(HTMLNamespaceHTML); + if ([namespace isEqual:@(node.htmlNamespace)]) { + return node; + } } if ([elementTypes[node.tagName] isEqual:@(node.htmlNamespace)]) { return nil;