c8583d221c7768e800268b906be20974eaf916ba
[WebKit-https.git] / WebCore / dom / ContainerNode.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #ifndef ContainerNode_h
25 #define ContainerNode_h
26
27 #include "Node.h"
28 #include "FloatPoint.h"
29
30 namespace WebCore {
31     
32 typedef void (*NodeCallback)(Node*);
33
34 namespace Private { 
35     template<class GenericNode, class GenericNodeContainer>
36     void addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
37 };
38
39 class ContainerNode : public Node {
40 public:
41     virtual ~ContainerNode();
42
43     Node* firstChild() const { return m_firstChild; }
44     Node* lastChild() const { return m_lastChild; }
45
46     virtual bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode&, bool shouldLazyAttach = false);
47     virtual bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode&, bool shouldLazyAttach = false);
48     virtual bool removeChild(Node* child, ExceptionCode&);
49     virtual bool appendChild(PassRefPtr<Node> newChild, ExceptionCode&, bool shouldLazyAttach = false);
50
51     // These methods are only used during parsing.
52     // They don't send DOM mutation events or handle reparenting.
53     // However, arbitrary code may be run by beforeload handlers.
54     void parserAddChild(PassRefPtr<Node>);
55     void parserRemoveChild(Node*);
56     void parserInsertBefore(PassRefPtr<Node> newChild, Node* refChild);
57
58     bool hasChildNodes() const { return m_firstChild; }
59     virtual void attach();
60     virtual void detach();
61     virtual void willRemove();
62     virtual IntRect getRect() const;
63     virtual void setFocus(bool = true);
64     virtual void setActive(bool active = true, bool pause = false);
65     virtual void setHovered(bool = true);
66     unsigned childNodeCount() const;
67     Node* childNode(unsigned index) const;
68
69     virtual void insertedIntoDocument();
70     virtual void removedFromDocument();
71     virtual void insertedIntoTree(bool deep);
72     virtual void removedFromTree(bool deep);
73     virtual void childrenChanged(bool createdByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
74
75     virtual bool removeChildren();
76
77     void removeAllChildren();
78     void takeAllChildrenFrom(ContainerNode*);
79
80     void cloneChildNodes(ContainerNode* clone);
81     
82     bool dispatchBeforeLoadEvent(const String& sourceURL);
83
84     static void queuePostAttachCallback(NodeCallback, Node*);
85     static bool postAttachCallbacksAreSuspended();
86     
87 protected:
88     ContainerNode(Document*, ConstructionType = CreateContainer);
89
90     void suspendPostAttachCallbacks();
91     void resumePostAttachCallbacks();
92
93     template<class GenericNode, class GenericNodeContainer>
94     friend void appendChildToContainer(GenericNode* child, GenericNodeContainer* container);
95
96     template<class GenericNode, class GenericNodeContainer>
97     friend void Private::addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
98
99     void setFirstChild(Node* child) { m_firstChild = child; }
100     void setLastChild(Node* child) { m_lastChild = child; }
101
102 private:
103     // Never call this function directly.  If you're trying to call this
104     // function, your code is either wrong or you're supposed to call
105     // parserAddChild.  Please do not call parserAddChild unless you are the
106     // parser!
107     virtual void deprecatedParserAddChild(PassRefPtr<Node>);
108
109     void removeBetween(Node* previousChild, Node* nextChild, Node* oldChild);
110     void insertBeforeCommon(Node* nextChild, Node* oldChild);
111
112     static void dispatchPostAttachCallbacks();
113
114     bool getUpperLeftCorner(FloatPoint&) const;
115     bool getLowerRightCorner(FloatPoint&) const;
116
117     Node* m_firstChild;
118     Node* m_lastChild;
119 };
120
121 inline ContainerNode* toContainerNode(Node* node)
122 {
123     ASSERT(!node || node->isContainerNode());
124     return static_cast<ContainerNode*>(node);
125 }
126
127 inline const ContainerNode* toContainerNode(const Node* node)
128 {
129     ASSERT(!node || node->isContainerNode());
130     return static_cast<const ContainerNode*>(node);
131 }
132
133 // This will catch anyone doing an unnecessary cast.
134 void toContainerNode(const ContainerNode*);
135
136 inline ContainerNode::ContainerNode(Document* document, ConstructionType type)
137     : Node(document, type)
138     , m_firstChild(0)
139     , m_lastChild(0)
140 {
141 }
142
143 inline unsigned Node::containerChildNodeCount() const
144 {
145     return toContainerNode(this)->childNodeCount();
146 }
147
148 inline Node* Node::containerChildNode(unsigned index) const
149 {
150     return toContainerNode(this)->childNode(index);
151 }
152
153 inline Node* Node::containerFirstChild() const
154 {
155     return toContainerNode(this)->firstChild();
156 }
157
158 inline Node* Node::containerLastChild() const
159 {
160     return toContainerNode(this)->lastChild();
161 }
162
163 } // namespace WebCore
164
165 #endif // ContainerNode_h