23#include "wtf/Platform.h"
33#include <wtf/Assertions.h>
37SVGElementInstance::SVGElementInstance(SVGUseElement* useElement, PassRefPtr<SVGElement> originalElement)
40 , m_useElement(useElement)
41 , m_element(originalElement)
42 , m_shadowTreeElement(0)
43 , m_previousSibling(0)
52 m_element->document()->accessSVGExtensions()->mapInstanceToElement(
this, m_element.get());
55SVGElementInstance::~SVGElementInstance()
57 for (RefPtr<SVGElementInstance> child = m_firstChild; child; child = child->m_nextSibling)
61 m_element->document()->accessSVGExtensions()->removeInstanceMapping(
this, m_element.get());
64SVGElement* SVGElementInstance::correspondingElement()
const
66 return m_element.get();
69SVGUseElement* SVGElementInstance::correspondingUseElement()
const
74SVGElementInstance* SVGElementInstance::parentNode()
const
79PassRefPtr<SVGElementInstanceList> SVGElementInstance::childNodes()
81 return SVGElementInstanceList::create(
this);
84SVGElementInstance* SVGElementInstance::previousSibling()
const
86 return m_previousSibling;
89SVGElementInstance* SVGElementInstance::nextSibling()
const
94SVGElementInstance* SVGElementInstance::firstChild()
const
99SVGElementInstance* SVGElementInstance::lastChild()
const
104SVGElement* SVGElementInstance::shadowTreeElement()
const
106 return m_shadowTreeElement;
109void SVGElementInstance::setShadowTreeElement(SVGElement* element)
112 m_shadowTreeElement = element;
115void SVGElementInstance::appendChild(PassRefPtr<SVGElementInstance> child)
117 child->setParent(
this);
120 child->m_previousSibling = m_lastChild;
121 m_lastChild->m_nextSibling = child.get();
123 m_firstChild = child.get();
125 m_lastChild = child.get();
129static bool containsUseChildNode(
Node* start)
131 if (start->hasTagName(SVGNames::useTag))
135 if (containsUseChildNode(current))
142void SVGElementInstance::updateInstance(SVGElement* element)
144 ASSERT(element == m_element);
145 ASSERT(m_shadowTreeElement);
158 if (m_element->hasTagName(SVGNames::symbolTag) ||
159 m_element->hasTagName(SVGNames::svgTag) ||
160 containsUseChildNode(m_element.get())) {
161 m_useElement->buildPendingResource();
166 WTF::PassRefPtr<Node> clone = m_element->cloneNode(
true);
167 SVGUseElement::removeDisallowedElementsFromSubtree(clone.get());
168 SVGElement* svgClone = 0;
169 if (clone && clone->isSVGElement())
170 svgClone =
static_cast<SVGElement*
>(clone.get());
175 m_shadowTreeElement->parentNode()->replaceChild(clone.releaseRef(), m_shadowTreeElement, ec);
178 m_shadowTreeElement = svgClone;
181SVGElementInstance* SVGElementInstance::toSVGElementInstance()
186EventTargetNode* SVGElementInstance::toNode()
188 return m_element.get();
191void SVGElementInstance::addEventListener(
const AtomicString& eventType, PassRefPtr<EventListener> eventListener,
bool useCapture)
194 Q_UNUSED(eventListener);
195 Q_UNUSED(useCapture);
199void SVGElementInstance::removeEventListener(
const AtomicString& eventType, EventListener* eventListener,
bool useCapture)
202 Q_UNUSED(eventListener);
203 Q_UNUSED(useCapture);
207bool SVGElementInstance::dispatchEvent(PassRefPtr<Event>, ExceptionCode& ec,
bool tempEvent)
Node nextSibling() const
The node immediately following this node.
The Node interface is the primary datatype for the entire Document Object Model.
Node firstChild() const
The first child of this node.