| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org> | 3 * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org> |
| 4 * Copyright (C) 2007 Rob Buis <buis@kde.org> | 4 * Copyright (C) 2007 Rob Buis <buis@kde.org> |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 Element* element = *firstElement; | 300 Element* element = *firstElement; |
| 301 | 301 |
| 302 resourceSet->remove(firstElement); | 302 resourceSet->remove(firstElement); |
| 303 | 303 |
| 304 if (resourceSet->isEmpty()) | 304 if (resourceSet->isEmpty()) |
| 305 removePendingResourceForRemoval(id); | 305 removePendingResourceForRemoval(id); |
| 306 | 306 |
| 307 return element; | 307 return element; |
| 308 } | 308 } |
| 309 | 309 |
| 310 HashSet<SVGElement*>* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGE
lement* referencedElement) const | 310 SVGElementSet* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGElement*
referencedElement) const |
| 311 { | 311 { |
| 312 ASSERT(referencedElement); | 312 ASSERT(referencedElement); |
| 313 const HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::const_iterator i
t = m_elementDependencies.find(referencedElement); | 313 const ElementDependenciesMap::const_iterator it = m_elementDependencies.find
(referencedElement); |
| 314 if (it == m_elementDependencies.end()) | 314 if (it == m_elementDependencies.end()) |
| 315 return 0; | 315 return 0; |
| 316 return it->value.get(); | 316 return it->value.get(); |
| 317 } | 317 } |
| 318 | 318 |
| 319 void SVGDocumentExtensions::addElementReferencingTarget(SVGElement* referencingE
lement, SVGElement* referencedElement) | 319 void SVGDocumentExtensions::addElementReferencingTarget(SVGElement* referencingE
lement, SVGElement* referencedElement) |
| 320 { | 320 { |
| 321 ASSERT(referencingElement); | 321 ASSERT(referencingElement); |
| 322 ASSERT(referencedElement); | 322 ASSERT(referencedElement); |
| 323 | 323 |
| 324 if (HashSet<SVGElement*>* elements = m_elementDependencies.get(referencedEle
ment)) { | 324 if (SVGElementSet* elements = m_elementDependencies.get(referencedElement))
{ |
| 325 elements->add(referencingElement); | 325 elements->add(referencingElement); |
| 326 return; | 326 return; |
| 327 } | 327 } |
| 328 | 328 |
| 329 OwnPtr<HashSet<SVGElement*> > elements = adoptPtr(new HashSet<SVGElement*>); | 329 OwnPtrWillBeRawPtr<SVGElementSet> elements = adoptPtrWillBeNoop(new SVGEleme
ntSet); |
| 330 elements->add(referencingElement); | 330 elements->add(referencingElement); |
| 331 m_elementDependencies.set(referencedElement, elements.release()); | 331 m_elementDependencies.set(referencedElement, elements.release()); |
| 332 } | 332 } |
| 333 | 333 |
| 334 void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* refe
rencingElement) | 334 void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* refe
rencingElement) |
| 335 { | 335 { |
| 336 Vector<SVGElement*> toBeRemoved; | 336 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > toBeRemoved; |
| 337 | 337 |
| 338 HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator end = m_eleme
ntDependencies.end(); | 338 ElementDependenciesMap::iterator end = m_elementDependencies.end(); |
| 339 for (HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_e
lementDependencies.begin(); it != end; ++it) { | 339 for (ElementDependenciesMap::iterator it = m_elementDependencies.begin(); it
!= end; ++it) { |
| 340 SVGElement* referencedElement = it->key; | 340 SVGElement* referencedElement = it->key; |
| 341 HashSet<SVGElement*>* referencingElements = it->value.get(); | 341 SVGElementSet* referencingElements = it->value.get(); |
| 342 HashSet<SVGElement*>::iterator setIt = referencingElements->find(referen
cingElement); | 342 SVGElementSet::iterator setIt = referencingElements->find(referencingEle
ment); |
| 343 if (setIt == referencingElements->end()) | 343 if (setIt == referencingElements->end()) |
| 344 continue; | 344 continue; |
| 345 | 345 |
| 346 referencingElements->remove(setIt); | 346 referencingElements->remove(setIt); |
| 347 if (referencingElements->isEmpty()) | 347 if (referencingElements->isEmpty()) |
| 348 toBeRemoved.append(referencedElement); | 348 toBeRemoved.append(referencedElement); |
| 349 } | 349 } |
| 350 | 350 |
| 351 m_elementDependencies.removeAll(toBeRemoved); | 351 m_elementDependencies.removeAll(toBeRemoved); |
| 352 } | 352 } |
| 353 | 353 |
| 354 void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement* ref
erencedElement) | 354 void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement* ref
erencedElement) |
| 355 { | 355 { |
| 356 ASSERT(referencedElement); | 356 ASSERT(referencedElement); |
| 357 HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elemen
tDependencies.find(referencedElement); | 357 ElementDependenciesMap::iterator it = m_elementDependencies.find(referencedE
lement); |
| 358 if (it == m_elementDependencies.end()) | 358 if (it == m_elementDependencies.end()) |
| 359 return; | 359 return; |
| 360 ASSERT(it->key == referencedElement); | 360 ASSERT(it->key == referencedElement); |
| 361 Vector<SVGElement*> toBeNotified; | |
| 362 | 361 |
| 363 HashSet<SVGElement*>* referencingElements = it->value.get(); | 362 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > toBeNotified; |
| 364 HashSet<SVGElement*>::iterator setEnd = referencingElements->end(); | 363 SVGElementSet* referencingElements = it->value.get(); |
| 365 for (HashSet<SVGElement*>::iterator setIt = referencingElements->begin(); se
tIt != setEnd; ++setIt) | 364 copyToVector(*referencingElements, toBeNotified); |
| 366 toBeNotified.append(*setIt); | |
| 367 | 365 |
| 368 // Force rebuilding the referencingElement so it knows about this change. | 366 // Force rebuilding the referencingElement so it knows about this change. |
| 369 Vector<SVGElement*>::iterator vectorEnd = toBeNotified.end(); | 367 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::iterator vectorEnd = toBe
Notified.end(); |
| 370 for (Vector<SVGElement*>::iterator vectorIt = toBeNotified.begin(); vectorIt
!= vectorEnd; ++vectorIt) { | 368 for (WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::iterator vectorIt =
toBeNotified.begin(); vectorIt != vectorEnd; ++vectorIt) { |
| 371 // Before rebuilding referencingElement ensure it was not removed from u
nder us. | 369 // Before rebuilding referencingElement ensure it was not removed from u
nder us. |
| 372 if (HashSet<SVGElement*>* referencingElements = setOfElementsReferencing
Target(referencedElement)) { | 370 if (SVGElementSet* referencingElements = setOfElementsReferencingTarget(
referencedElement)) { |
| 373 if (referencingElements->contains(*vectorIt)) | 371 if (referencingElements->contains(*vectorIt)) |
| 374 (*vectorIt)->svgAttributeChanged(XLinkNames::hrefAttr); | 372 (*vectorIt)->svgAttributeChanged(XLinkNames::hrefAttr); |
| 375 } | 373 } |
| 376 } | 374 } |
| 377 } | 375 } |
| 378 | 376 |
| 379 void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* refe
rencedElement) | 377 void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* refe
rencedElement) |
| 380 { | 378 { |
| 381 ASSERT(referencedElement); | 379 ASSERT(referencedElement); |
| 382 HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elemen
tDependencies.find(referencedElement); | 380 ElementDependenciesMap::iterator it = m_elementDependencies.find(referencedE
lement); |
| 383 if (it == m_elementDependencies.end()) | 381 if (it == m_elementDependencies.end()) |
| 384 return; | 382 return; |
| 385 ASSERT(it->key == referencedElement); | 383 ASSERT(it->key == referencedElement); |
| 386 | 384 |
| 387 m_elementDependencies.remove(it); | 385 m_elementDependencies.remove(it); |
| 388 } | 386 } |
| 389 | 387 |
| 390 void SVGDocumentExtensions::addSVGRootWithRelativeLengthDescendents(SVGSVGElemen
t* svgRoot) | 388 void SVGDocumentExtensions::addSVGRootWithRelativeLengthDescendents(SVGSVGElemen
t* svgRoot) |
| 391 { | 389 { |
| 392 ASSERT(!m_inRelativeLengthSVGRootsInvalidation); | 390 ASSERT(!m_inRelativeLengthSVGRootsInvalidation); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 } | 471 } |
| 474 | 472 |
| 475 SVGSVGElement* SVGDocumentExtensions::rootElement() const | 473 SVGSVGElement* SVGDocumentExtensions::rootElement() const |
| 476 { | 474 { |
| 477 ASSERT(m_document); | 475 ASSERT(m_document); |
| 478 return rootElement(*m_document); | 476 return rootElement(*m_document); |
| 479 } | 477 } |
| 480 | 478 |
| 481 void SVGDocumentExtensions::trace(Visitor* visitor) | 479 void SVGDocumentExtensions::trace(Visitor* visitor) |
| 482 { | 480 { |
| 481 visitor->trace(m_document); |
| 483 visitor->trace(m_timeContainers); | 482 visitor->trace(m_timeContainers); |
| 484 visitor->trace(m_svgFontFaceElements); | 483 visitor->trace(m_svgFontFaceElements); |
| 485 visitor->trace(m_pendingSVGFontFaceElementsForRemoval); | 484 visitor->trace(m_pendingSVGFontFaceElementsForRemoval); |
| 485 visitor->trace(m_elementDependencies); |
| 486 visitor->trace(m_relativeLengthSVGRoots); | 486 visitor->trace(m_relativeLengthSVGRoots); |
| 487 } | 487 } |
| 488 | 488 |
| 489 } | 489 } |
| OLD | NEW |