diff --git a/lib/parser/index.js b/lib/parser/index.js index da0c99687..03aa847ec 100644 --- a/lib/parser/index.js +++ b/lib/parser/index.js @@ -909,30 +909,36 @@ function aaInnerLoop(p, furthestBlock, formattingElement) { lastElement = furthestBlock, nextElement = p.openElements.getCommonAncestor(furthestBlock); - for (var i = 0; i < AA_INNER_LOOP_ITER; i++) { + for (var i = 0; ; i++) { element = nextElement; //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5) nextElement = p.openElements.getCommonAncestor(element); - var elementEntry = p.activeFormattingElements.getElementEntry(element); + if (element === formattingElement) + break; + + var elementEntry = p.activeFormattingElements.getElementEntry(element), + counterOverflow = elementEntry && i >= AA_INNER_LOOP_ITER, + shouldRemoveFromOpenElements = !elementEntry || counterOverflow; + + if (shouldRemoveFromOpenElements) { + if (counterOverflow) + p.activeFormattingElements.removeEntry(elementEntry); - if (!elementEntry) { p.openElements.remove(element); - continue; } - if (element === formattingElement) - break; - - element = aaRecreateElementFromEntry(p, elementEntry); + else { + element = aaRecreateElementFromEntry(p, elementEntry); - if (lastElement === furthestBlock) - p.activeFormattingElements.bookmark = elementEntry; + if (lastElement === furthestBlock) + p.activeFormattingElements.bookmark = elementEntry; - p.treeAdapter.detachNode(lastElement); - p.treeAdapter.appendChild(element, lastElement); - lastElement = element; + p.treeAdapter.detachNode(lastElement); + p.treeAdapter.appendChild(element, lastElement); + lastElement = element; + } } return lastElement;