18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
32bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or
6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public
7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either
8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version.
9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful,
11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details.
14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License
16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA.
19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef SVGElementInstance_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SVGElementInstance_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventTarget.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGElement.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TreeShared.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochnamespace Private {
32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochtemplate<class GenericNode, class GenericNodeContainer>
33f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch};
35f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass SVGUseElement;
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass SVGElementInstanceList;
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// SVGElementInstance mimics Node, but without providing all its functionality
40f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass SVGElementInstance : public TreeShared<SVGElementInstance>,
41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                           public EventTarget {
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochpublic:
432bde8e466a4451c7319e3a072d118917957d6554Steve Block    static PassRefPtr<SVGElementInstance> create(SVGUseElement* correspondingUseElement, SVGUseElement* directUseElement, PassRefPtr<SVGElement> originalElement)
44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
452bde8e466a4451c7319e3a072d118917957d6554Steve Block        return adoptRef(new SVGElementInstance(correspondingUseElement, directUseElement, originalElement));
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual ~SVGElementInstance();
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
50f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual ScriptExecutionContext* scriptExecutionContext() const;
51f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
52f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void removeAllEventListeners();
55f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    using EventTarget::dispatchEvent;
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool dispatchEvent(PassRefPtr<Event>);
57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElement* correspondingElement() const { return m_element.get(); }
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    SVGUseElement* correspondingUseElement() const { return m_correspondingUseElement; }
602bde8e466a4451c7319e3a072d118917957d6554Steve Block    SVGUseElement* directUseElement() const { return m_directUseElement; }
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElement* shadowTreeElement() const { return m_shadowTreeElement.get(); }
622bde8e466a4451c7319e3a072d118917957d6554Steve Block    void clearUseElements()
632bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
642bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_directUseElement = 0;
652bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_correspondingUseElement = 0;
662bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* parentNode() const { return parent(); }
69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PassRefPtr<SVGElementInstanceList> childNodes();
70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* previousSibling() const { return m_previousSibling; }
72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* nextSibling() const { return m_nextSibling; }
73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
74f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* firstChild() const { return m_firstChild; }
75f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* lastChild() const { return m_lastChild; }
76f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Document* ownerDocument() const { return m_element ? m_element->ownerDocument() : 0; }
78f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static void invalidateAllInstancesOfElement(SVGElement*);
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    using TreeShared<SVGElementInstance>::ref;
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    using TreeShared<SVGElementInstance>::deref;
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // EventTarget API
85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), abort);
86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), blur);
87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), change);
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), click);
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), contextmenu);
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dblclick);
91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), error);
92f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), focus);
93f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), input);
94f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keydown);
95f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keypress);
96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keyup);
97f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), load);
98f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousedown);
99f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousemove);
100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseout);
101f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseover);
102f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseup);
103f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousewheel);
104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforecut);
105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), cut);
106f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforecopy);
107f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), copy);
108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforepaste);
109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), paste);
110f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragenter);
111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragover);
112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragleave);
113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), drop);
114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragstart);
115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), drag);
116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragend);
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), reset);
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), resize);
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), scroll);
120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), search);
121f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), select);
122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), selectstart);
123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), submit);
124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), unload);
125f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
126f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochprivate:
127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    friend class SVGUseElement;
128f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block    SVGElementInstance(SVGUseElement*, SVGUseElement*, PassRefPtr<SVGElement> originalElement);
130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual Node* toNode() { return shadowTreeElement(); }
132f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual SVGElementInstance* toSVGElementInstance() { return this; }
133f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
134f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void appendChild(PassRefPtr<SVGElementInstance> child);
135f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void setShadowTreeElement(SVGElement*);
136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    template<class GenericNode, class GenericNodeContainer>
138f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    friend void appendChildToContainer(GenericNode* child, GenericNodeContainer* container);
139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
140f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    template<class GenericNode, class GenericNodeContainer>
141f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    friend void removeAllChildrenInContainer(GenericNodeContainer* container);
142f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
143f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    template<class GenericNode, class GenericNodeContainer>
144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    friend void Private::addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
145f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool hasChildNodes() const { return m_firstChild; }
147f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
148f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void setFirstChild(SVGElementInstance* child) { m_firstChild = child; }
149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void setLastChild(SVGElementInstance* child) { m_lastChild = child; }
150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void setNextSibling(SVGElementInstance* sibling) { m_nextSibling = sibling; }
152f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void setPreviousSibling(SVGElementInstance* sibling) { m_previousSibling = sibling; }
153f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void refEventTarget() { ref(); }
155f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void derefEventTarget() { deref(); }
156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual EventTargetData* eventTargetData();
157f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual EventTargetData* ensureEventTargetData();
158f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block    SVGUseElement* m_correspondingUseElement;
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block    SVGUseElement* m_directUseElement;
161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<SVGElement> m_element;
162f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<SVGElement> m_shadowTreeElement;
163f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
164f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* m_previousSibling;
165f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* m_nextSibling;
166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
167f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* m_firstChild;
168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGElementInstance* m_lastChild;
169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch};
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG)
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
175