| 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);
|
| }
|
|
|
| }
|
|
|