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)#ifndef HTMLElementStack_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define HTMLElementStack_h
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLStackItem.h"
31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Forward.h"
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Noncopyable.h"
33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/OwnPtr.h"
34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassOwnPtr.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/RefPtr.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ContainerNode;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DocumentFragment;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Element;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class QualifiedName;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NOTE: The HTML5 spec uses a backwards (grows downward) stack.  We're using
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// more standard (grows upwards) stack terminology here.
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLElementStack {
47d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(HTMLElementStack);
48d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    DISALLOW_ALLOCATION();
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLElementStack();
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~HTMLElementStack();
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    class ElementRecord FINAL : public NoBaseWillBeGarbageCollected<ElementRecord> {
54d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        WTF_MAKE_NONCOPYABLE(ElementRecord); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
56d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ~ElementRecord(); // Public for ~PassOwnPtr()
58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
5902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Element* element() const { return m_item->element(); }
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ContainerNode* node() const { return m_item->node(); }
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const AtomicString& namespaceURI() const { return m_item->namespaceURI(); }
63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        PassRefPtrWillBeRawPtr<HTMLStackItem> stackItem() const { return m_item; }
64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        void replaceElement(PassRefPtrWillBeRawPtr<HTMLStackItem>);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool isAbove(ElementRecord*) const;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ElementRecord* next() const { return m_next.get(); }
69d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
70d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        void trace(Visitor*);
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        friend class HTMLElementStack;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        ElementRecord(PassRefPtrWillBeRawPtr<HTMLStackItem>, PassOwnPtrWillBeRawPtr<ElementRecord>);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        PassOwnPtrWillBeRawPtr<ElementRecord> releaseNext() { return m_next.release(); }
77d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        void setNext(PassOwnPtrWillBeRawPtr<ElementRecord> next) { m_next = next; }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        RefPtrWillBeMember<HTMLStackItem> m_item;
80d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        OwnPtrWillBeMember<ElementRecord> m_next;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned stackDepth() const { return m_stackDepth; }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Inlining this function is a (small) performance win on the parsing
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // benchmark.
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* top() const
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_top->element());
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_top->element();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* topNode() const
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_top->node());
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_top->node();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLStackItem* topStackItem() const
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_top->stackItem());
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_top->stackItem().get();
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLStackItem* oneBelowTop() const;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ElementRecord* topRecord() const;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ElementRecord* find(Element*) const;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ElementRecord* furthestBlockForFormattingElement(Element*) const;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ElementRecord* topmost(const AtomicString& tagName) const;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void insertAbove(PassRefPtrWillBeRawPtr<HTMLStackItem>, ElementRecord*);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void push(PassRefPtrWillBeRawPtr<HTMLStackItem>);
114d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void pushRootNode(PassRefPtrWillBeRawPtr<HTMLStackItem>);
115d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void pushHTMLHtmlElement(PassRefPtrWillBeRawPtr<HTMLStackItem>);
116d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void pushHTMLHeadElement(PassRefPtrWillBeRawPtr<HTMLStackItem>);
117d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void pushHTMLBodyElement(PassRefPtrWillBeRawPtr<HTMLStackItem>);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void pop();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntil(const AtomicString& tagName);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntil(Element*);
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntilPopped(const AtomicString& tagName);
12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void popUntilPopped(const QualifiedName& tagName) { popUntilPopped(tagName.localName()); }
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntilPopped(Element*);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntilNumberedHeaderElementPopped();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntilTableScopeMarker(); // "clear the stack back to a table context" in the spec.
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntilTableBodyScopeMarker(); // "clear the stack back to a table body context" in the spec.
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntilTableRowScopeMarker(); // "clear the stack back to a table row context" in the spec.
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popUntilForeignContentScopeMarker();
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popHTMLHeadElement();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popHTMLBodyElement();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popAll();
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isMathMLTextIntegrationPoint(HTMLStackItem*);
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isHTMLIntegrationPoint(HTMLStackItem*);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void remove(Element*);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeHTMLHeadElement(Element*);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool contains(Element*) const;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool contains(const AtomicString& tagName) const;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inScope(Element*) const;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inScope(const AtomicString& tagName) const;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inScope(const QualifiedName&) const;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inListItemScope(const AtomicString& tagName) const;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inListItemScope(const QualifiedName&) const;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inTableScope(const AtomicString& tagName) const;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inTableScope(const QualifiedName&) const;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inButtonScope(const AtomicString& tagName) const;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inButtonScope(const QualifiedName&) const;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inSelectScope(const AtomicString& tagName) const;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inSelectScope(const QualifiedName&) const;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasNumberedHeaderElementInScope() const;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasOnlyOneElement() const;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool secondElementIsHTMLBodyElement() const;
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool hasTemplateInHTMLScope() const;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* htmlElement() const;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* headElement() const;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* bodyElement() const;
16402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* rootNode() const;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void trace(Visitor*);
168d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void show();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
174d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void pushCommon(PassRefPtrWillBeRawPtr<HTMLStackItem>);
175d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void pushRootNodeCommon(PassRefPtrWillBeRawPtr<HTMLStackItem>);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void popCommon();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeNonTopCommon(Element*);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
179d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    OwnPtrWillBeMember<ElementRecord> m_top;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We remember the root node, <head> and <body> as they are pushed. Their
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ElementRecords keep them alive. The root node is never popped.
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: We don't currently require type-specific information about
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // these elements so we haven't yet bothered to plumb the types all the
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // way down through createElement, etc.
186d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RawPtrWillBeMember<ContainerNode> m_rootNode;
187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RawPtrWillBeMember<Element> m_headElement;
188d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RawPtrWillBeMember<Element> m_bodyElement;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_stackDepth;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
19102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // HTMLElementStack_h
195