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