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