15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google, Inc. All Rights Reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Apple Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLElementStack.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h" 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "MathMLNames.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SVGNames.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h" 34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLHtmlElement.h" 35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLOptGroupElement.h" 36e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLTableElement.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace { 44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline bool isRootNode(HTMLStackItem* item) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return item->isDocumentFragmentNode() 48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch || isHTMLHtmlElement(item->node()); 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isScopeMarker(HTMLStackItem* item) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return item->hasTagName(appletTag) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(captionTag) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(marqueeTag) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(objectTag) 57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch || isHTMLTableElement(item->node()) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(tdTag) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(thTag) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::miTag) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::moTag) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::mnTag) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::msTag) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::mtextTag) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::annotation_xmlTag) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(SVGNames::foreignObjectTag) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(SVGNames::descTag) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(SVGNames::titleTag) 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) || item->hasTagName(templateTag) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || isRootNode(item); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isListItemScopeMarker(HTMLStackItem* item) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isScopeMarker(item) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(olTag) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(ulTag); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isTableScopeMarker(HTMLStackItem* item) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return isHTMLTableElement(item->node()) 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) || item->hasTagName(templateTag) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || isRootNode(item); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isTableBodyScopeMarker(HTMLStackItem* item) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return item->hasTagName(tbodyTag) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(tfootTag) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(theadTag) 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) || item->hasTagName(templateTag) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || isRootNode(item); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isTableRowScopeMarker(HTMLStackItem* item) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return item->hasTagName(trTag) 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) || item->hasTagName(templateTag) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || isRootNode(item); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isForeignContentScopeMarker(HTMLStackItem* item) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return HTMLElementStack::isMathMLTextIntegrationPoint(item) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || HTMLElementStack::isHTMLIntegrationPoint(item) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->isInHTMLNamespace(); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isButtonScopeMarker(HTMLStackItem* item) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isScopeMarker(item) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(buttonTag); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isSelectScopeMarker(HTMLStackItem* item) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 118e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return !isHTMLOptGroupElement(item->node()) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && !item->hasTagName(optionTag); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::ElementRecord::ElementRecord(PassRefPtr<HTMLStackItem> item, PassOwnPtr<ElementRecord> next) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_item(item) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_next(next) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_item); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::ElementRecord::~ElementRecord() 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::ElementRecord::replaceElement(PassRefPtr<HTMLStackItem> item) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(item); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_item || m_item->isElementNode()); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Should this call finishParsingChildren? 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_item = item; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::ElementRecord::isAbove(ElementRecord* other) const 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* below = next(); below; below = below->next()) { 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (below == other) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::HTMLElementStack() 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_rootNode(0) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_headElement(0) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_bodyElement(0) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_stackDepth(0) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::~HTMLElementStack() 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::hasOnlyOneElement() const 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !topRecord()->next(); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::secondElementIsHTMLBodyElement() const 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is used the fragment case of <body> and <frameset> in the "in body" 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // insertion mode. 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#parsing-main-inbody 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_rootNode); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we have a body element, it must always be the second element on the 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // stack, as we always start with an html element, and any other element 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // would cause the implicit creation of a body element. 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!m_bodyElement; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popHTMLHeadElement() 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(top() == m_headElement); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_headElement = 0; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popCommon(); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popHTMLBodyElement() 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(top() == m_bodyElement); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bodyElement = 0; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popCommon(); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popAll() 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rootNode = 0; 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_headElement = 0; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bodyElement = 0; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_stackDepth = 0; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (m_top) { 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) topNode()->finishParsingChildren(); 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_top = m_top->releaseNext(); 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::pop() 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!topStackItem()->hasTagName(HTMLNames::headTag)); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popCommon(); 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntil(const AtomicString& tagName) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) while (!topStackItem()->matchesHTMLTag(tagName)) { 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // pop() will ASSERT if a <body>, <head> or <html> will be popped. 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntilPopped(const AtomicString& tagName) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popUntil(tagName); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntilNumberedHeaderElementPopped() 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (!topStackItem()->isNumberedHeaderElement()) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntil(Element* element) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (top() != element) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntilPopped(Element* element) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popUntil(element); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntilTableScopeMarker() 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#clear-the-stack-back-to-a-table-context 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (!isTableScopeMarker(topStackItem())) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntilTableBodyScopeMarker() 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#clear-the-stack-back-to-a-table-body-context 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (!isTableBodyScopeMarker(topStackItem())) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntilTableRowScopeMarker() 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#clear-the-stack-back-to-a-table-row-context 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (!isTableRowScopeMarker(topStackItem())) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#mathml-text-integration-point 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::isMathMLTextIntegrationPoint(HTMLStackItem* item) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!item->isElementNode()) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return item->hasTagName(MathMLNames::miTag) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::moTag) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::mnTag) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::msTag) 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(MathMLNames::mtextTag); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#html-integration-point 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::isHTMLIntegrationPoint(HTMLStackItem* item) 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!item->isElementNode()) 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (item->hasTagName(MathMLNames::annotation_xmlTag)) { 285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Attribute* encodingAttr = item->getAttributeItem(MathMLNames::encodingAttr); 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (encodingAttr) { 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const String& encoding = encodingAttr->value(); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return equalIgnoringCase(encoding, "text/html") 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || equalIgnoringCase(encoding, "application/xhtml+xml"); 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return item->hasTagName(SVGNames::foreignObjectTag) 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(SVGNames::descTag) 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || item->hasTagName(SVGNames::titleTag); 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popUntilForeignContentScopeMarker() 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (!isForeignContentScopeMarker(topStackItem())) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::pushRootNode(PassRefPtr<HTMLStackItem> rootItem) 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(rootItem->isDocumentFragmentNode()); 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pushRootNodeCommon(rootItem); 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::pushHTMLHtmlElement(PassRefPtr<HTMLStackItem> item) 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 312e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(isHTMLHtmlElement(item->node())); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pushRootNodeCommon(item); 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::pushRootNodeCommon(PassRefPtr<HTMLStackItem> rootItem) 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_top); 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_rootNode); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rootNode = rootItem->node(); 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pushCommon(rootItem); 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::pushHTMLHeadElement(PassRefPtr<HTMLStackItem> item) 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(item->hasTagName(HTMLNames::headTag)); 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_headElement); 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_headElement = item->element(); 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pushCommon(item); 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::pushHTMLBodyElement(PassRefPtr<HTMLStackItem> item) 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(item->hasTagName(HTMLNames::bodyTag)); 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_bodyElement); 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bodyElement = item->element(); 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pushCommon(item); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::push(PassRefPtr<HTMLStackItem> item) 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 342e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(!isHTMLHtmlElement(item->node())); 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!item->hasTagName(HTMLNames::headTag)); 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!item->hasTagName(HTMLNames::bodyTag)); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_rootNode); 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pushCommon(item); 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::insertAbove(PassRefPtr<HTMLStackItem> item, ElementRecord* recordBelow) 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(item); 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(recordBelow); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_top); 354e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(!isHTMLHtmlElement(item->node())); 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!item->hasTagName(HTMLNames::headTag)); 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!item->hasTagName(HTMLNames::bodyTag)); 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_rootNode); 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (recordBelow == m_top) { 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) push(item); 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* recordAbove = m_top.get(); recordAbove; recordAbove = recordAbove->next()) { 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (recordAbove->next() != recordBelow) 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_stackDepth++; 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) recordAbove->setNext(adoptPtr(new ElementRecord(item, recordAbove->releaseNext()))); 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) recordAbove->next()->element()->beginParsingChildren(); 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::ElementRecord* HTMLElementStack::topRecord() const 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_top); 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_top.get(); 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLStackItem* HTMLElementStack::oneBelowTop() const 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We should never call this if there are fewer than 2 elements on the stack. 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_top); 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_top->next()); 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_top->next()->stackItem()->isElementNode()) 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_top->next()->stackItem().get(); 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::removeHTMLHeadElement(Element* element) 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_headElement == element); 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_top->element() == element) { 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popHTMLHeadElement(); 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_headElement = 0; 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removeNonTopCommon(element); 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::remove(Element* element) 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!element->hasTagName(HTMLNames::headTag)); 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_top->element() == element) { 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pop(); 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removeNonTopCommon(element); 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::ElementRecord* HTMLElementStack::find(Element* element) const 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pos->node() == element) 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return pos; 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::ElementRecord* HTMLElementStack::topmost(const AtomicString& tagName) const 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { 42453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (pos->stackItem()->matchesHTMLTag(tagName)) 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return pos; 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::contains(Element* element) const 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!find(element); 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::contains(const AtomicString& tagName) const 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !!topmost(tagName); 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <bool isMarker(HTMLStackItem*)> 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool inScopeCommon(HTMLElementStack::ElementRecord* top, const AtomicString& targetTag) 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HTMLElementStack::ElementRecord* pos = top; pos; pos = pos->next()) { 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLStackItem* item = pos->stackItem().get(); 44553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (item->matchesHTMLTag(targetTag)) 446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isMarker(item)) 448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_NOT_REACHED(); // <html> is always on the stack and is a scope marker. 451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::hasNumberedHeaderElementInScope() const 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* record = m_top.get(); record; record = record->next()) { 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLStackItem* item = record->stackItem().get(); 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (item->isNumberedHeaderElement()) 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isScopeMarker(item)) 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); // <html> is always on the stack and is a scope marker. 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inScope(Element* targetElement) const 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLStackItem* item = pos->stackItem().get(); 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (item->node() == targetElement) 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isScopeMarker(item)) 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); // <html> is always on the stack and is a scope marker. 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inScope(const AtomicString& targetTag) const 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inScopeCommon<isScopeMarker>(m_top.get(), targetTag); 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inScope(const QualifiedName& tagName) const 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inScope(tagName.localName()); 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inListItemScope(const AtomicString& targetTag) const 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inScopeCommon<isListItemScopeMarker>(m_top.get(), targetTag); 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inListItemScope(const QualifiedName& tagName) const 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inListItemScope(tagName.localName()); 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inTableScope(const AtomicString& targetTag) const 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inScopeCommon<isTableScopeMarker>(m_top.get(), targetTag); 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inTableScope(const QualifiedName& tagName) const 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 50753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return inTableScope(tagName.localName()); 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inButtonScope(const AtomicString& targetTag) const 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inScopeCommon<isButtonScopeMarker>(m_top.get(), targetTag); 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inButtonScope(const QualifiedName& tagName) const 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inButtonScope(tagName.localName()); 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inSelectScope(const AtomicString& targetTag) const 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inScopeCommon<isSelectScopeMarker>(m_top.get(), targetTag); 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLElementStack::inSelectScope(const QualifiedName& tagName) const 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inSelectScope(tagName.localName()); 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLElementStack::hasTemplateInHTMLScope() const 531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return inScopeCommon<isRootNode>(m_top.get(), templateTag.localName()); 533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* HTMLElementStack::htmlElement() const 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_rootNode); 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return toElement(m_rootNode); 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* HTMLElementStack::headElement() const 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_headElement); 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_headElement; 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* HTMLElementStack::bodyElement() const 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_bodyElement); 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_bodyElement; 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 55202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContainerNode* HTMLElementStack::rootNode() const 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_rootNode); 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_rootNode; 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::pushCommon(PassRefPtr<HTMLStackItem> item) 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_rootNode); 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_stackDepth++; 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_top = adoptPtr(new ElementRecord(item, m_top.release())); 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::popCommon() 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 569e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(!isHTMLHtmlElement(topStackItem()->node())); 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!topStackItem()->hasTagName(HTMLNames::headTag) || !m_headElement); 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!topStackItem()->hasTagName(HTMLNames::bodyTag) || !m_bodyElement); 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) top()->finishParsingChildren(); 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_top = m_top->releaseNext(); 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_stackDepth--; 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::removeNonTopCommon(Element* element) 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 580e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(!isHTMLHtmlElement(element)); 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!element->hasTagName(HTMLNames::bodyTag)); 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(top() != element); 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pos->next()->element() == element) { 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Is it OK to call finishParsingChildren() 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when the children aren't actually finished? 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) element->finishParsingChildren(); 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pos->setNext(pos->next()->releaseNext()); 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_stackDepth--; 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElementStack::ElementRecord* HTMLElementStack::furthestBlockForFormattingElement(Element* formattingElement) const 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ElementRecord* furthestBlock = 0; 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pos->element() == formattingElement) 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return furthestBlock; 6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pos->stackItem()->isSpecialNode()) 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) furthestBlock = pos; 6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLElementStack::show() 6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (ElementRecord* record = m_top.get(); record; record = record->next()) 6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) record->element()->showNode(); 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 620