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

Side by Side Diff: Source/core/svg/SVGDocumentExtensions.cpp

Issue 327473002: Prepare SVGDocumentExtensions::m_elementDependencies for oilpan (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 20 matching lines...) Expand all
31 #include "core/svg/SVGViewSpec.h" 31 #include "core/svg/SVGViewSpec.h"
32 #include "core/svg/SVGZoomAndPan.h" 32 #include "core/svg/SVGZoomAndPan.h"
33 #include "core/svg/animation/SMILTimeContainer.h" 33 #include "core/svg/animation/SMILTimeContainer.h"
34 #include "wtf/TemporaryChange.h" 34 #include "wtf/TemporaryChange.h"
35 #include "wtf/text/AtomicString.h" 35 #include "wtf/text/AtomicString.h"
36 36
37 namespace WebCore { 37 namespace WebCore {
38 38
39 SVGDocumentExtensions::SVGDocumentExtensions(Document* document) 39 SVGDocumentExtensions::SVGDocumentExtensions(Document* document)
40 : m_document(document) 40 : m_document(document)
41 , m_elementDependencies(adoptPtrWillBeNoop(new ElementDependenciesMap))
41 , m_resourcesCache(adoptPtr(new SVGResourcesCache)) 42 , m_resourcesCache(adoptPtr(new SVGResourcesCache))
42 #if !ASSERT_DISABLED 43 #if !ASSERT_DISABLED
43 , m_inRelativeLengthSVGRootsInvalidation(false) 44 , m_inRelativeLengthSVGRootsInvalidation(false)
44 #endif 45 #endif
45 { 46 {
46 } 47 }
47 48
48 SVGDocumentExtensions::~SVGDocumentExtensions() 49 SVGDocumentExtensions::~SVGDocumentExtensions()
49 { 50 {
50 } 51 }
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 Element* element = *firstElement; 301 Element* element = *firstElement;
301 302
302 resourceSet->remove(firstElement); 303 resourceSet->remove(firstElement);
303 304
304 if (resourceSet->isEmpty()) 305 if (resourceSet->isEmpty())
305 removePendingResourceForRemoval(id); 306 removePendingResourceForRemoval(id);
306 307
307 return element; 308 return element;
308 } 309 }
309 310
310 HashSet<SVGElement*>* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGE lement* referencedElement) const 311 WeakSVGElementSet* SVGDocumentExtensions::setOfElementsReferencingTarget(SVGElem ent* referencedElement) const
311 { 312 {
312 ASSERT(referencedElement); 313 ASSERT(referencedElement);
313 const HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::const_iterator i t = m_elementDependencies.find(referencedElement); 314 const ElementDependenciesMap::const_iterator it = m_elementDependencies->fin d(referencedElement);
314 if (it == m_elementDependencies.end()) 315 if (it == m_elementDependencies->end())
315 return 0; 316 return 0;
316 return it->value.get(); 317 return it->value.get();
317 } 318 }
318 319
319 void SVGDocumentExtensions::addElementReferencingTarget(SVGElement* referencingE lement, SVGElement* referencedElement) 320 void SVGDocumentExtensions::addElementReferencingTarget(SVGElement* referencingE lement, SVGElement* referencedElement)
320 { 321 {
321 ASSERT(referencingElement); 322 ASSERT(referencingElement);
322 ASSERT(referencedElement); 323 ASSERT(referencedElement);
323 324
324 if (HashSet<SVGElement*>* elements = m_elementDependencies.get(referencedEle ment)) { 325 if (WeakSVGElementSet* elements = m_elementDependencies->get(referencedEleme nt)) {
325 elements->add(referencingElement); 326 elements->add(referencingElement);
326 return; 327 return;
327 } 328 }
328 329
329 OwnPtr<HashSet<SVGElement*> > elements = adoptPtr(new HashSet<SVGElement*>); 330 OwnPtrWillBeRawPtr<WeakSVGElementSet> elements = adoptPtrWillBeNoop(new Weak SVGElementSet);
330 elements->add(referencingElement); 331 elements->add(referencingElement);
331 m_elementDependencies.set(referencedElement, elements.release()); 332 m_elementDependencies->set(referencedElement, elements.release());
332 } 333 }
333 334
334 void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* refe rencingElement) 335 void SVGDocumentExtensions::removeAllTargetReferencesForElement(SVGElement* refe rencingElement)
335 { 336 {
336 Vector<SVGElement*> toBeRemoved; 337 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > toBeRemoved;
337 338
338 HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator end = m_eleme ntDependencies.end(); 339 ElementDependenciesMap::iterator end = m_elementDependencies->end();
339 for (HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_e lementDependencies.begin(); it != end; ++it) { 340 for (ElementDependenciesMap::iterator it = m_elementDependencies->begin(); i t != end; ++it) {
340 SVGElement* referencedElement = it->key; 341 SVGElement* referencedElement = it->key;
341 HashSet<SVGElement*>* referencingElements = it->value.get(); 342 WeakSVGElementSet* referencingElements = it->value.get();
342 HashSet<SVGElement*>::iterator setIt = referencingElements->find(referen cingElement); 343 WeakSVGElementSet::iterator setIt = referencingElements->find(referencin gElement);
343 if (setIt == referencingElements->end()) 344 if (setIt == referencingElements->end())
344 continue; 345 continue;
345 346
346 referencingElements->remove(setIt); 347 referencingElements->remove(setIt);
347 if (referencingElements->isEmpty()) 348 if (referencingElements->isEmpty())
348 toBeRemoved.append(referencedElement); 349 toBeRemoved.append(referencedElement);
349 } 350 }
350 351
351 m_elementDependencies.removeAll(toBeRemoved); 352 m_elementDependencies->removeAll(toBeRemoved);
352 } 353 }
353 354
354 void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement* ref erencedElement) 355 void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement* ref erencedElement)
355 { 356 {
356 ASSERT(referencedElement); 357 ASSERT(referencedElement);
357 HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elemen tDependencies.find(referencedElement); 358 ElementDependenciesMap::iterator it = m_elementDependencies->find(referenced Element);
358 if (it == m_elementDependencies.end()) 359 if (it == m_elementDependencies->end())
359 return; 360 return;
360 ASSERT(it->key == referencedElement); 361 ASSERT(it->key == referencedElement);
361 Vector<SVGElement*> toBeNotified;
362 362
363 HashSet<SVGElement*>* referencingElements = it->value.get(); 363 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > toBeNotified;
364 HashSet<SVGElement*>::iterator setEnd = referencingElements->end(); 364 WeakSVGElementSet* referencingElements = it->value.get();
365 for (HashSet<SVGElement*>::iterator setIt = referencingElements->begin(); se tIt != setEnd; ++setIt) 365 copyToVector(*referencingElements, toBeNotified);
366 toBeNotified.append(*setIt);
367 366
368 // Force rebuilding the referencingElement so it knows about this change. 367 // Force rebuilding the referencingElement so it knows about this change.
369 Vector<SVGElement*>::iterator vectorEnd = toBeNotified.end(); 368 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::iterator vectorEnd = toBe Notified.end();
370 for (Vector<SVGElement*>::iterator vectorIt = toBeNotified.begin(); vectorIt != vectorEnd; ++vectorIt) { 369 for (WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::iterator vectorIt = toBeNotified.begin(); vectorIt != vectorEnd; ++vectorIt) {
371 // Before rebuilding referencingElement ensure it was not removed from u nder us. 370 // Before rebuilding referencingElement ensure it was not removed from u nder us.
372 if (HashSet<SVGElement*>* referencingElements = setOfElementsReferencing Target(referencedElement)) { 371 if (WeakSVGElementSet* referencingElements = setOfElementsReferencingTar get(referencedElement)) {
373 if (referencingElements->contains(*vectorIt)) 372 if (referencingElements->contains(*vectorIt))
374 (*vectorIt)->svgAttributeChanged(XLinkNames::hrefAttr); 373 (*vectorIt)->svgAttributeChanged(XLinkNames::hrefAttr);
375 } 374 }
376 } 375 }
377 } 376 }
378 377
379 void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* refe rencedElement) 378 void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* refe rencedElement)
380 { 379 {
381 ASSERT(referencedElement); 380 ASSERT(referencedElement);
382 HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > >::iterator it = m_elemen tDependencies.find(referencedElement); 381 ElementDependenciesMap::iterator it = m_elementDependencies->find(referenced Element);
383 if (it == m_elementDependencies.end()) 382 if (it == m_elementDependencies->end())
384 return; 383 return;
385 ASSERT(it->key == referencedElement); 384 ASSERT(it->key == referencedElement);
386 385
387 m_elementDependencies.remove(it); 386 m_elementDependencies->remove(it);
388 } 387 }
389 388
390 void SVGDocumentExtensions::addSVGRootWithRelativeLengthDescendents(SVGSVGElemen t* svgRoot) 389 void SVGDocumentExtensions::addSVGRootWithRelativeLengthDescendents(SVGSVGElemen t* svgRoot)
391 { 390 {
392 ASSERT(!m_inRelativeLengthSVGRootsInvalidation); 391 ASSERT(!m_inRelativeLengthSVGRootsInvalidation);
393 m_relativeLengthSVGRoots.add(svgRoot); 392 m_relativeLengthSVGRoots.add(svgRoot);
394 } 393 }
395 394
396 void SVGDocumentExtensions::removeSVGRootWithRelativeLengthDescendents(SVGSVGEle ment* svgRoot) 395 void SVGDocumentExtensions::removeSVGRootWithRelativeLengthDescendents(SVGSVGEle ment* svgRoot)
397 { 396 {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 } 472 }
474 473
475 SVGSVGElement* SVGDocumentExtensions::rootElement() const 474 SVGSVGElement* SVGDocumentExtensions::rootElement() const
476 { 475 {
477 ASSERT(m_document); 476 ASSERT(m_document);
478 return rootElement(*m_document); 477 return rootElement(*m_document);
479 } 478 }
480 479
481 void SVGDocumentExtensions::trace(Visitor* visitor) 480 void SVGDocumentExtensions::trace(Visitor* visitor)
482 { 481 {
482 visitor->trace(m_document);
483 visitor->trace(m_timeContainers); 483 visitor->trace(m_timeContainers);
484 visitor->trace(m_svgFontFaceElements); 484 visitor->trace(m_svgFontFaceElements);
485 visitor->trace(m_pendingSVGFontFaceElementsForRemoval); 485 visitor->trace(m_pendingSVGFontFaceElementsForRemoval);
486 visitor->trace(m_elementDependencies);
486 } 487 }
487 488
488 } 489 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698