From e95d45b534c5091eacb0fc6f12e1d5e2351d0549 Mon Sep 17 00:00:00 2001 From: iska Date: Sun, 22 Mar 2015 00:13:55 +0100 Subject: [PATCH] Fix clearing the stack of open elements for the "in table body" phase --- HTMLKit/HTMLParser.m | 6 +++--- HTMLKit/HTMLStackOfOpenElements.h | 2 +- HTMLKit/HTMLStackOfOpenElements.m | 8 +++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/HTMLKit/HTMLParser.m b/HTMLKit/HTMLParser.m index 53ef267..dbee1b0 100644 --- a/HTMLKit/HTMLParser.m +++ b/HTMLKit/HTMLParser.m @@ -1767,7 +1767,7 @@ [self emitParseError:@"Unexpected Tag Token (%@) for element in ", token.asTagToken.tagName]; return; } else { - [_stackOfOpenElements clearBackToTableContext]; + [_stackOfOpenElements clearBackToTableBodyContext]; [_stackOfOpenElements popCurrentNode]; [self switchInsertionMode:HTMLInsertionModeInTable]; } @@ -1780,12 +1780,12 @@ switch (token.type) { case HTMLTokenTypeStartTag: if ([token.asTagToken.tagName isEqualToString:@"tr"]) { - [_stackOfOpenElements clearBackToTableContext]; + [_stackOfOpenElements clearBackToTableBodyContext]; [self insertElementForToken:token.asTagToken]; [self switchInsertionMode:HTMLInsertionModeInRow]; } else if ([token.asTagToken.tagName isEqualToAny:@"th", @"td", nil]) { [self emitParseError:@"Unexpected Start Tag Token (%@) in ", token.asTagToken.tagName]; - [_stackOfOpenElements clearBackToTableContext]; + [_stackOfOpenElements clearBackToTableBodyContext]; HTMLStartTagToken *trToken = [[HTMLStartTagToken alloc] initWithTagName:@"tr"]; [self insertElementForToken:trToken]; [self switchInsertionMode:HTMLInsertionModeInRow]; diff --git a/HTMLKit/HTMLStackOfOpenElements.h b/HTMLKit/HTMLStackOfOpenElements.h index c6b697d..725276c 100644 --- a/HTMLKit/HTMLStackOfOpenElements.h +++ b/HTMLKit/HTMLStackOfOpenElements.h @@ -31,9 +31,9 @@ - (void)popElementsUntilAnElementPoppedWithAnyOfTagNames:(NSArray *)tagNames; - (void)popElementsUntilElementPopped:(HTMLElement *)element; - (void)clearBackToTableContext; +- (void)clearBackToTableBodyContext; - (void)popAll; - - (HTMLElement *)hasElementInScopeWithTagName:(NSString *)tagName; - (HTMLElement *)hasAnyElementInScopeWithAnyOfTagNames:(NSArray *)tagNames; - (HTMLElement *)hasElementInListItemScopeWithTagName:(NSString *)tagName; diff --git a/HTMLKit/HTMLStackOfOpenElements.m b/HTMLKit/HTMLStackOfOpenElements.m index 1531564..6d2ae52 100644 --- a/HTMLKit/HTMLStackOfOpenElements.m +++ b/HTMLKit/HTMLStackOfOpenElements.m @@ -24,6 +24,7 @@ { self = [super init]; if (self) { + _stack = [NSMutableArray new]; _specificScopeElementTypes = @{ @"applet": @(HTMLNamespaceHTML), @"caption": @(HTMLNamespaceHTML), @@ -138,7 +139,12 @@ - (void)clearBackToTableContext { - while (![self.currentNode.tagName isEqualToAny:@"table", @"template", @"html", nil]) { + +} + +- (void)clearBackToTableBodyContext +{ + while (![self.currentNode.tagName isEqualToAny:@"tbody", @"tfoot", @"thead", @"template", @"html", nil]) { [_stack removeLastObject]; } }