REGRESSION r119802: Remove unnecessary ASSERT(!m_deletionHasBegun) from Document.h
[WebKit-https.git] / Source / WebCore / svg / SVGElementInstance.h
1 /*
2  * Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2011 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef SVGElementInstance_h
22 #define SVGElementInstance_h
23
24 #if ENABLE(SVG)
25 #include "EventTarget.h"
26 #include "SVGElement.h"
27 #include "TreeShared.h"
28
29 namespace WebCore {
30
31 namespace Private {
32 template<class GenericNode, class GenericNodeContainer>
33 void addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
34 };
35
36 class SVGUseElement;
37 class SVGElementInstanceList;
38 class SVGStyledElement;
39
40 // SVGElementInstance mimics Node, but without providing all its functionality
41 class SVGElementInstance : public TreeShared<SVGElementInstance>,
42                            public EventTarget {
43 public:
44     static PassRefPtr<SVGElementInstance> create(SVGUseElement* correspondingUseElement, SVGUseElement* directUseElement, PassRefPtr<SVGElement> originalElement)
45     {
46         return adoptRef(new SVGElementInstance(correspondingUseElement, directUseElement, originalElement));
47     }
48
49     virtual ~SVGElementInstance();
50     virtual void removedLastRef()
51     {
52 #ifndef NDEBUG
53         m_deletionHasBegun = true;
54 #endif
55         delete this;
56     };
57
58     void setParentOrHostNode(SVGElementInstance* instance) { setParent(instance); }
59
60     virtual const AtomicString& interfaceName() const;
61     virtual ScriptExecutionContext* scriptExecutionContext() const;
62
63     virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
64     virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
65     virtual void removeAllEventListeners();
66     using EventTarget::dispatchEvent;
67     virtual bool dispatchEvent(PassRefPtr<Event>);
68
69     SVGElement* correspondingElement() const { return m_element.get(); }
70     SVGUseElement* correspondingUseElement() const { return m_correspondingUseElement; }
71     SVGUseElement* directUseElement() const { return m_directUseElement; }
72     SVGElement* shadowTreeElement() const { return m_shadowTreeElement.get(); }
73
74     void detach();
75
76     SVGElementInstance* parentNode() const { return parent(); }
77     PassRefPtr<SVGElementInstanceList> childNodes();
78
79     SVGElementInstance* previousSibling() const { return m_previousSibling; }
80     SVGElementInstance* nextSibling() const { return m_nextSibling; }
81
82     SVGElementInstance* firstChild() const { return m_firstChild; }
83     SVGElementInstance* lastChild() const { return m_lastChild; }
84
85     Document* ownerDocument() const { return m_element ? m_element->ownerDocument() : 0; }
86
87     class InvalidationGuard {
88         WTF_MAKE_NONCOPYABLE(InvalidationGuard);
89     public:    
90         InvalidationGuard(SVGElement* element) : m_element(element) { }
91         ~InvalidationGuard() { SVGElementInstance::invalidateAllInstancesOfElement(m_element); }
92     private:
93         SVGElement* m_element;
94     };
95
96     class InstanceUpdateBlocker {
97         WTF_MAKE_NONCOPYABLE(InstanceUpdateBlocker);
98     public:
99         InstanceUpdateBlocker(SVGElement* targetElement);
100         ~InstanceUpdateBlocker();
101
102     private:
103         SVGStyledElement* m_targetElement;
104     };
105     
106     static void invalidateAllInstancesOfElement(SVGElement*);
107
108     using TreeShared<SVGElementInstance>::ref;
109     using TreeShared<SVGElementInstance>::deref;
110
111     // EventTarget API
112     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), abort);
113     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), blur);
114     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), change);
115     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), click);
116     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), contextmenu);
117     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dblclick);
118     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), error);
119     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), focus);
120     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), input);
121     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keydown);
122     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keypress);
123     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keyup);
124     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), load);
125     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousedown);
126     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousemove);
127     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseout);
128     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseover);
129     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseup);
130     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousewheel);
131     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforecut);
132     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), cut);
133     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforecopy);
134     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), copy);
135     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforepaste);
136     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), paste);
137     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragenter);
138     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragover);
139     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragleave);
140     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), drop);
141     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragstart);
142     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), drag);
143     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragend);
144     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), reset);
145     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), resize);
146     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), scroll);
147     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), search);
148     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), select);
149     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), selectstart);
150     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), submit);
151     DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), unload);
152
153 private:
154     friend class SVGUseElement;
155     using TreeShared<SVGElementInstance>::parent;
156     using TreeShared<SVGElementInstance>::setParent;
157
158     SVGElementInstance(SVGUseElement*, SVGUseElement*, PassRefPtr<SVGElement> originalElement);
159
160     virtual Node* toNode() { return shadowTreeElement(); }
161
162     void appendChild(PassRefPtr<SVGElementInstance> child);
163     void setShadowTreeElement(SVGElement*);
164
165     template<class GenericNode, class GenericNodeContainer>
166     friend void appendChildToContainer(GenericNode* child, GenericNodeContainer* container);
167
168     template<class GenericNode, class GenericNodeContainer>
169     friend void removeAllChildrenInContainer(GenericNodeContainer* container);
170
171     template<class GenericNode, class GenericNodeContainer>
172     friend void Private::addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
173
174     bool hasChildNodes() const { return m_firstChild; }
175
176     void setFirstChild(SVGElementInstance* child) { m_firstChild = child; }
177     void setLastChild(SVGElementInstance* child) { m_lastChild = child; }
178
179     void setNextSibling(SVGElementInstance* sibling) { m_nextSibling = sibling; }
180     void setPreviousSibling(SVGElementInstance* sibling) { m_previousSibling = sibling; }    
181
182     virtual void refEventTarget() { ref(); }
183     virtual void derefEventTarget() { deref(); }
184     virtual EventTargetData* eventTargetData();
185     virtual EventTargetData* ensureEventTargetData();
186
187     SVGUseElement* m_correspondingUseElement;
188     SVGUseElement* m_directUseElement;
189     RefPtr<SVGElement> m_element;
190     RefPtr<SVGElement> m_shadowTreeElement;
191
192     SVGElementInstance* m_previousSibling;
193     SVGElementInstance* m_nextSibling;
194
195     SVGElementInstance* m_firstChild;
196     SVGElementInstance* m_lastChild;
197 };
198
199 } // namespace WebCore
200
201 #endif // ENABLE(SVG)
202 #endif