2010-06-30 Eric Seidel <eric@webkit.org>
[WebKit-https.git] / WebCore / html / HTMLElementStack.h
1 /*
2  * Copyright (C) 2010 Google, Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef HTMLElementStack_h
27 #define HTMLElementStack_h
28
29 #include "HTMLNames.h"
30 #include <wtf/Noncopyable.h>
31
32 namespace WebCore {
33
34 class Element;
35
36 class HTMLElementStack : public Noncopyable {
37 public:
38     HTMLElementStack();
39     ~HTMLElementStack();
40
41     Element* top() const;
42
43     void push(PassRefPtr<Element>);
44     void pushHTMLHtmlElement(PassRefPtr<Element>);
45     void pushHTMLHeadElement(PassRefPtr<Element>);
46     void pushHTMLBodyElement(PassRefPtr<Element>);
47
48     void pop();
49     void popHTMLHeadElement();
50
51     void remove(Element*);
52     void removeHTMLHeadElement(Element*);
53
54     bool contains(Element*) const;
55
56     bool inScope(const AtomicString& name) const;
57     bool inScope(Element*) const;
58
59     Element* htmlElement();
60     Element* headElement();
61     Element* bodyElement();
62
63 private:
64     void pushCommon(PassRefPtr<Element>);
65     void popCommon();
66     void removeNonFirstCommon(Element*);
67
68     class ElementRecord;
69     OwnPtr<ElementRecord> m_top;
70
71     // We remember <html>, <head> and <body> as they are pushed.  Their
72     // ElementRecords keep them alive.  <html> and <body> are never popped.
73     // FIXME: We don't currently require type-specific information about
74     // these elements so we haven't yet bothered to plumb the types all the
75     // way down through createElement, etc.
76     Element* m_htmlElement;
77     Element* m_headElement;
78     Element* m_bodyElement;
79 };
80
81 } // namespace WebCore
82
83 #endif // HTMLElementStack_h