Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1015)

Unified Diff: Source/core/svg/SVGElement.cpp

Issue 266063002: Store SVGElement instead of SVGElementInstance for instancesForElement (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix nits Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/svg/SVGElement.h ('k') | Source/core/svg/SVGElementInstance.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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))
« no previous file with comments | « Source/core/svg/SVGElement.h ('k') | Source/core/svg/SVGElementInstance.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698