Index: Source/core/svg/SVGElement.cpp |
diff --git a/Source/core/svg/SVGElement.cpp b/Source/core/svg/SVGElement.cpp |
index 11616ed0dd5297177619f7d8e391bd2d32da962b..a8a6ec4c071b3c06c011963d107f39cb61cf2dc6 100644 |
--- a/Source/core/svg/SVGElement.cpp |
+++ b/Source/core/svg/SVGElement.cpp |
@@ -532,10 +532,10 @@ void SVGElement::mapInstanceToElement(SVGElementInstance* instance) |
{ |
ASSERT(instance); |
- HashSet<SVGElementInstance*>& instances = ensureSVGRareData()->elementInstances(); |
- ASSERT(!instances.contains(instance)); |
+ HashSet<SVGElement*>& instances = ensureSVGRareData()->elementInstances(); |
+ ASSERT(!instances.contains(instance->shadowTreeElement())); |
- instances.add(instance); |
+ instances.add(instance->shadowTreeElement()); |
} |
void SVGElement::removeInstanceMapping(SVGElementInstance* instance) |
@@ -543,16 +543,19 @@ void SVGElement::removeInstanceMapping(SVGElementInstance* instance) |
ASSERT(instance); |
ASSERT(hasSVGRareData()); |
- HashSet<SVGElementInstance*>& instances = svgRareData()->elementInstances(); |
- ASSERT(instances.contains(instance)); |
+ if (!instance->shadowTreeElement()) |
+ return; |
+ |
+ HashSet<SVGElement*>& instances = svgRareData()->elementInstances(); |
+ ASSERT(instances.contains(instance->shadowTreeElement())); |
- instances.remove(instance); |
+ instances.remove(instance->shadowTreeElement()); |
} |
-const HashSet<SVGElementInstance*>& SVGElement::instancesForElement() const |
+const HashSet<SVGElement*>& SVGElement::instancesForElement() const |
{ |
if (!hasSVGRareData()) { |
- DEFINE_STATIC_LOCAL(HashSet<SVGElementInstance*>, emptyInstances, ()); |
+ DEFINE_STATIC_LOCAL(HashSet<SVGElement*>, emptyInstances, ()); |
return emptyInstances; |
} |
return svgRareData()->elementInstances(); |
@@ -613,6 +616,15 @@ SVGElement* SVGElement::correspondingElement() |
return hasSVGRareData() ? svgRareData()->correspondingElement() : 0; |
} |
+SVGUseElement* SVGElement::correspondingUseElement() const |
+{ |
+ if (ShadowRoot* root = containingShadowRoot()) { |
+ if (isSVGUseElement(root->host()) && (root->type() == ShadowRoot::UserAgentShadowRoot)) |
+ return toSVGUseElement(root->host()); |
+ } |
+ return 0; |
+} |
+ |
void SVGElement::setCorrespondingElement(SVGElement* correspondingElement) |
{ |
ensureSVGRareData()->setCorrespondingElement(correspondingElement); |
@@ -620,9 +632,7 @@ void SVGElement::setCorrespondingElement(SVGElement* correspondingElement) |
bool SVGElement::inUseShadowTree() const |
{ |
- if (ShadowRoot* root = containingShadowRoot()) |
- return isSVGUseElement(root->host()) && (root->type() == ShadowRoot::UserAgentShadowRoot); |
- return false; |
+ return correspondingUseElement(); |
} |
bool SVGElement::supportsSpatialNavigationFocus() const |
@@ -775,7 +785,7 @@ bool SVGElement::haveLoadedRequiredResources() |
return true; |
} |
-static inline void collectInstancesForSVGElement(SVGElement* element, HashSet<SVGElementInstance*>& instances) |
+static inline void collectInstancesForSVGElement(SVGElement* element, HashSet<SVGElement*>& instances) |
{ |
ASSERT(element); |
if (element->containingShadowRoot()) |
@@ -795,14 +805,11 @@ bool SVGElement::addEventListener(const AtomicString& eventType, PassRefPtr<Even |
return false; |
// Add event listener to all shadow tree DOM element instances |
- HashSet<SVGElementInstance*> instances; |
+ HashSet<SVGElement*> instances; |
collectInstancesForSVGElement(this, instances); |
- const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); |
- for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) { |
- ASSERT((*it)->shadowTreeElement()); |
- ASSERT((*it)->correspondingElement() == this); |
- |
- bool result = (*it)->shadowTreeElement()->Node::addEventListener(eventType, listener, useCapture); |
+ const HashSet<SVGElement*>::const_iterator end = instances.end(); |
+ for (HashSet<SVGElement*>::const_iterator it = instances.begin(); it != end; ++it) { |
+ bool result = (*it)->Node::addEventListener(eventType, listener, useCapture); |
ASSERT_UNUSED(result, result); |
} |
@@ -811,7 +818,7 @@ bool SVGElement::addEventListener(const AtomicString& eventType, PassRefPtr<Even |
bool SVGElement::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture) |
{ |
- HashSet<SVGElementInstance*> instances; |
+ HashSet<SVGElement*> instances; |
collectInstancesForSVGElement(this, instances); |
if (instances.isEmpty()) |
return Node::removeEventListener(eventType, listener, useCapture); |
@@ -828,11 +835,9 @@ bool SVGElement::removeEventListener(const AtomicString& eventType, EventListene |
return false; |
// Remove event listener from all shadow tree DOM element instances |
- const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); |
- for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) { |
- ASSERT((*it)->correspondingElement() == this); |
- |
- SVGElement* shadowTreeElement = (*it)->shadowTreeElement(); |
+ const HashSet<SVGElement*>::const_iterator end = instances.end(); |
+ for (HashSet<SVGElement*>::const_iterator it = instances.begin(); it != end; ++it) { |
+ SVGElement* shadowTreeElement = *it; |
ASSERT(shadowTreeElement); |
if (shadowTreeElement->Node::removeEventListener(eventType, listener, useCapture)) |