Index: Source/core/svg/SVGDocumentExtensions.cpp |
diff --git a/Source/core/svg/SVGDocumentExtensions.cpp b/Source/core/svg/SVGDocumentExtensions.cpp |
index 6f678e64e5167d0c64efa8a5029687b7485050a9..378690592da1750b9c403e4d261a2a6b69339258 100644 |
--- a/Source/core/svg/SVGDocumentExtensions.cpp |
+++ b/Source/core/svg/SVGDocumentExtensions.cpp |
@@ -38,6 +38,7 @@ namespace WebCore { |
SVGDocumentExtensions::SVGDocumentExtensions(Document* document) |
: m_document(document) |
+ , m_elementDependencies(adoptPtrWillBeNoop(new ElementDependenciesMap)) |
, m_resourcesCache(adoptPtr(new SVGResourcesCache)) |
#if !ASSERT_DISABLED |
, m_inRelativeLengthSVGRootsInvalidation(false) |
@@ -307,11 +308,11 @@ Element* SVGDocumentExtensions::removeElementFromPendingResourcesForRemoval(cons |
return element; |
} |
-HashSet<SVGElement*>* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGElement* referencedElement) const |
+WeakSVGElementSet* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGElement* referencedElement) const |
{ |
ASSERT(referencedElement); |
- const HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::const_iterator it = m_elementDependencies.find(referencedElement); |
- if (it == m_elementDependencies.end()) |
+ const ElementDependenciesMap::const_iterator it = m_elementDependencies->find(referencedElement); |
+ if (it == m_elementDependencies->end()) |
return 0; |
return it->value.get(); |
} |
@@ -321,25 +322,25 @@ void SVGDocumentExtensions::addElementReferencingTarget(SVGElement* referencingE |
ASSERT(referencingElement); |
ASSERT(referencedElement); |
- if (HashSet<SVGElement*>* elements = m_elementDependencies.get(referencedElement)) { |
+ if (WeakSVGElementSet* elements = m_elementDependencies->get(referencedElement)) { |
elements->add(referencingElement); |
return; |
} |
- OwnPtr<HashSet<SVGElement*> > elements = adoptPtr(new HashSet<SVGElement*>); |
+ OwnPtrWillBeRawPtr<WeakSVGElementSet> elements = adoptPtrWillBeNoop(new WeakSVGElementSet); |
elements->add(referencingElement); |
- m_elementDependencies.set(referencedElement, elements.release()); |
+ m_elementDependencies->set(referencedElement, elements.release()); |
} |
void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* referencingElement) |
{ |
- Vector<SVGElement*> toBeRemoved; |
+ WillBeHeapVector<RawPtrWillBeMember<SVGElement> > toBeRemoved; |
- HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator end = m_elementDependencies.end(); |
- for (HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.begin(); it != end; ++it) { |
+ ElementDependenciesMap::iterator end = m_elementDependencies->end(); |
+ for (ElementDependenciesMap::iterator it = m_elementDependencies->begin(); it != end; ++it) { |
SVGElement* referencedElement = it->key; |
- HashSet<SVGElement*>* referencingElements = it->value.get(); |
- HashSet<SVGElement*>::iterator setIt = referencingElements->find(referencingElement); |
+ WeakSVGElementSet* referencingElements = it->value.get(); |
+ WeakSVGElementSet::iterator setIt = referencingElements->find(referencingElement); |
if (setIt == referencingElements->end()) |
continue; |
@@ -348,28 +349,26 @@ void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* refe |
toBeRemoved.append(referencedElement); |
} |
- m_elementDependencies.removeAll(toBeRemoved); |
+ m_elementDependencies->removeAll(toBeRemoved); |
} |
void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement* referencedElement) |
{ |
ASSERT(referencedElement); |
- HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.find(referencedElement); |
- if (it == m_elementDependencies.end()) |
+ ElementDependenciesMap::iterator it = m_elementDependencies->find(referencedElement); |
+ if (it == m_elementDependencies->end()) |
return; |
ASSERT(it->key == referencedElement); |
- Vector<SVGElement*> toBeNotified; |
- HashSet<SVGElement*>* referencingElements = it->value.get(); |
- HashSet<SVGElement*>::iterator setEnd = referencingElements->end(); |
- for (HashSet<SVGElement*>::iterator setIt = referencingElements->begin(); setIt != setEnd; ++setIt) |
- toBeNotified.append(*setIt); |
+ WillBeHeapVector<RawPtrWillBeMember<SVGElement> > toBeNotified; |
+ WeakSVGElementSet* referencingElements = it->value.get(); |
+ copyToVector(*referencingElements, toBeNotified); |
// Force rebuilding the referencingElement so it knows about this change. |
- Vector<SVGElement*>::iterator vectorEnd = toBeNotified.end(); |
- for (Vector<SVGElement*>::iterator vectorIt = toBeNotified.begin(); vectorIt != vectorEnd; ++vectorIt) { |
+ WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::iterator vectorEnd = toBeNotified.end(); |
+ for (WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::iterator vectorIt = toBeNotified.begin(); vectorIt != vectorEnd; ++vectorIt) { |
// Before rebuilding referencingElement ensure it was not removed from under us. |
- if (HashSet<SVGElement*>* referencingElements = setOfElementsReferencingTarget(referencedElement)) { |
+ if (WeakSVGElementSet* referencingElements = setOfElementsReferencingTarget(referencedElement)) { |
if (referencingElements->contains(*vectorIt)) |
(*vectorIt)->svgAttributeChanged(XLinkNames::hrefAttr); |
} |
@@ -379,12 +378,12 @@ void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement* ref |
void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* referencedElement) |
{ |
ASSERT(referencedElement); |
- HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elementDependencies.find(referencedElement); |
- if (it == m_elementDependencies.end()) |
+ ElementDependenciesMap::iterator it = m_elementDependencies->find(referencedElement); |
+ if (it == m_elementDependencies->end()) |
return; |
ASSERT(it->key == referencedElement); |
- m_elementDependencies.remove(it); |
+ m_elementDependencies->remove(it); |
} |
void SVGDocumentExtensions::addSVGRootWithRelativeLengthDescendents(SVGSVGElement* svgRoot) |
@@ -480,9 +479,11 @@ SVGSVGElement* SVGDocumentExtensions::rootElement() const |
void SVGDocumentExtensions::trace(Visitor* visitor) |
{ |
+ visitor->trace(m_document); |
visitor->trace(m_timeContainers); |
visitor->trace(m_svgFontFaceElements); |
visitor->trace(m_pendingSVGFontFaceElementsForRemoval); |
+ visitor->trace(m_elementDependencies); |
} |
} |