Changeset 223789 in webkit
- Timestamp:
- Oct 20, 2017 1:34:27 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r223788 r223789 1 2017-10-20 Said Abou-Hallawa <sabouhallawa@apple.com> 2 3 When destroying a resource, register "only" the clients who are losing their resource as having pending resources 4 https://bugs.webkit.org/show_bug.cgi?id=178567 5 <rdar://problem/35064781> 6 7 Reviewed by Simon Fraser. 8 9 SVGResources::resourceDestroyed() will return a bool indicating whether 10 it had a reference to the destroyed resource or not. If it returns true 11 SVGResourcesCache::resourceDestroyed() will register the client Element 12 as having pending resources. 13 14 * rendering/svg/SVGResources.cpp: 15 (WebCore::paintingResourceFromSVGPaint): 16 (WebCore::SVGResources::removeClientFromCache const): 17 (WebCore::SVGResources::resourceDestroyed): 18 (WebCore::SVGResources::buildSetOfResources): 19 (WebCore::SVGResources::resetClipper): 20 (WebCore::SVGResources::resetFilter): 21 (WebCore::SVGResources::resetMarkerStart): 22 (WebCore::SVGResources::resetMarkerMid): 23 (WebCore::SVGResources::resetMarkerEnd): 24 (WebCore::SVGResources::resetMasker): 25 (WebCore::SVGResources::resetFill): 26 (WebCore::SVGResources::resetStroke): 27 (WebCore::SVGResources::resetLinkedResource): 28 * rendering/svg/SVGResources.h: 29 (WebCore::SVGResources::isEmpty const): 30 (WebCore::SVGResources::ClipperFilterMaskerData::ClipperFilterMaskerData): Deleted. 31 (WebCore::SVGResources::MarkerData::MarkerData): Deleted. 32 (WebCore::SVGResources::FillStrokeData::FillStrokeData): Deleted. 33 * rendering/svg/SVGResourcesCache.cpp: 34 (WebCore::SVGResourcesCache::resourceDestroyed): 35 1 36 2017-10-20 Ryosuke Niwa <rniwa@webkit.org> 2 37 -
trunk/Source/WebCore/rendering/svg/SVGResources.cpp
r222304 r223789 172 172 { 173 173 if (paintType != SVG_PAINTTYPE_URI && paintType != SVG_PAINTTYPE_URI_RGBCOLOR && paintType != SVG_PAINTTYPE_URI_CURRENTCOLOR) 174 return 0;174 return nullptr; 175 175 176 176 id = SVGURIReference::fragmentIdentifierFromIRIString(paintUri, document); … … 178 178 if (!container) { 179 179 hasPendingResource = true; 180 return 0;180 return nullptr; 181 181 } 182 182 183 183 RenderSVGResourceType resourceType = container->resourceType(); 184 184 if (resourceType != PatternResourceType && resourceType != LinearGradientResourceType && resourceType != RadialGradientResourceType) 185 return 0;185 return nullptr; 186 186 187 187 return container; … … 331 331 void SVGResources::removeClientFromCache(RenderElement& renderer, bool markForInvalidation) const 332 332 { 333 if ( !m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)333 if (isEmpty()) 334 334 return; 335 335 … … 368 368 } 369 369 370 voidSVGResources::resourceDestroyed(RenderSVGResourceContainer& resource)371 { 372 if ( !m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)373 return ;370 bool SVGResources::resourceDestroyed(RenderSVGResourceContainer& resource) 371 { 372 if (isEmpty()) 373 return false; 374 374 375 375 if (m_linkedResource == &resource) { … … 378 378 ASSERT(!m_fillStrokeData); 379 379 m_linkedResource->removeAllClientsFromCache(); 380 m_linkedResource = 0; 381 return; 382 } 383 380 m_linkedResource = nullptr; 381 return true; 382 } 383 384 bool foundResources = false; 384 385 switch (resource.resourceType()) { 385 386 case MaskerResourceType: … … 388 389 if (m_clipperFilterMaskerData->masker == &resource) { 389 390 m_clipperFilterMaskerData->masker->removeAllClientsFromCache(); 390 m_clipperFilterMaskerData->masker = 0; 391 m_clipperFilterMaskerData->masker = nullptr; 392 foundResources = true; 391 393 } 392 394 break; … … 396 398 if (m_markerData->markerStart == &resource) { 397 399 m_markerData->markerStart->removeAllClientsFromCache(); 398 m_markerData->markerStart = 0; 400 m_markerData->markerStart = nullptr; 401 foundResources = true; 399 402 } 400 403 if (m_markerData->markerMid == &resource) { 401 404 m_markerData->markerMid->removeAllClientsFromCache(); 402 m_markerData->markerMid = 0; 405 m_markerData->markerMid = nullptr; 406 foundResources = true; 403 407 } 404 408 if (m_markerData->markerEnd == &resource) { 405 409 m_markerData->markerEnd->removeAllClientsFromCache(); 406 m_markerData->markerEnd = 0; 410 m_markerData->markerEnd = nullptr; 411 foundResources = true; 407 412 } 408 413 break; … … 414 419 if (m_fillStrokeData->fill == &resource) { 415 420 m_fillStrokeData->fill->removeAllClientsFromCache(); 416 m_fillStrokeData->fill = 0; 421 m_fillStrokeData->fill = nullptr; 422 foundResources = true; 417 423 } 418 424 if (m_fillStrokeData->stroke == &resource) { 419 425 m_fillStrokeData->stroke->removeAllClientsFromCache(); 420 m_fillStrokeData->stroke = 0; 426 m_fillStrokeData->stroke = nullptr; 427 foundResources = true; 421 428 } 422 429 break; … … 426 433 if (m_clipperFilterMaskerData->filter == &resource) { 427 434 m_clipperFilterMaskerData->filter->removeAllClientsFromCache(); 428 m_clipperFilterMaskerData->filter = 0; 435 m_clipperFilterMaskerData->filter = nullptr; 436 foundResources = true; 429 437 } 430 438 break; … … 434 442 if (m_clipperFilterMaskerData->clipper == &resource) { 435 443 m_clipperFilterMaskerData->clipper->removeAllClientsFromCache(); 436 m_clipperFilterMaskerData->clipper = 0; 444 m_clipperFilterMaskerData->clipper = nullptr; 445 foundResources = true; 437 446 } 438 447 break; … … 440 449 ASSERT_NOT_REACHED(); 441 450 } 451 return foundResources; 442 452 } 443 453 444 454 void SVGResources::buildSetOfResources(HashSet<RenderSVGResourceContainer*>& set) 445 455 { 446 if ( !m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)456 if (isEmpty()) 447 457 return; 448 458 … … 499 509 ASSERT(m_clipperFilterMaskerData); 500 510 ASSERT(m_clipperFilterMaskerData->clipper); 501 m_clipperFilterMaskerData->clipper = 0;511 m_clipperFilterMaskerData->clipper = nullptr; 502 512 } 503 513 … … 520 530 ASSERT(m_clipperFilterMaskerData); 521 531 ASSERT(m_clipperFilterMaskerData->filter); 522 m_clipperFilterMaskerData->filter = 0;532 m_clipperFilterMaskerData->filter = nullptr; 523 533 } 524 534 … … 541 551 ASSERT(m_markerData); 542 552 ASSERT(m_markerData->markerStart); 543 m_markerData->markerStart = 0;553 m_markerData->markerStart = nullptr; 544 554 } 545 555 … … 562 572 ASSERT(m_markerData); 563 573 ASSERT(m_markerData->markerMid); 564 m_markerData->markerMid = 0;574 m_markerData->markerMid = nullptr; 565 575 } 566 576 … … 583 593 ASSERT(m_markerData); 584 594 ASSERT(m_markerData->markerEnd); 585 m_markerData->markerEnd = 0;595 m_markerData->markerEnd = nullptr; 586 596 } 587 597 … … 604 614 ASSERT(m_clipperFilterMaskerData); 605 615 ASSERT(m_clipperFilterMaskerData->masker); 606 m_clipperFilterMaskerData->masker = 0;616 m_clipperFilterMaskerData->masker = nullptr; 607 617 } 608 618 … … 627 637 ASSERT(m_fillStrokeData); 628 638 ASSERT(m_fillStrokeData->fill); 629 m_fillStrokeData->fill = 0;639 m_fillStrokeData->fill = nullptr; 630 640 } 631 641 … … 650 660 ASSERT(m_fillStrokeData); 651 661 ASSERT(m_fillStrokeData->stroke); 652 m_fillStrokeData->stroke = 0;662 m_fillStrokeData->stroke = nullptr; 653 663 } 654 664 … … 665 675 { 666 676 ASSERT(m_linkedResource); 667 m_linkedResource = 0;677 m_linkedResource = nullptr; 668 678 } 669 679 -
trunk/Source/WebCore/rendering/svg/SVGResources.h
r222304 r223789 68 68 // Methods operating on all cached resources 69 69 void removeClientFromCache(RenderElement&, bool markForInvalidation = true) const; 70 void resourceDestroyed(RenderSVGResourceContainer&); 70 // Returns true if the resource-to-be-destroyed is one of our resources. 71 bool resourceDestroyed(RenderSVGResourceContainer&); 71 72 72 73 #if ENABLE(TREE_DEBUGGING) … … 98 99 bool setStroke(RenderSVGResourceContainer*); 99 100 bool setLinkedResource(RenderSVGResourceContainer*); 101 102 bool isEmpty() const { return !m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource; } 100 103 101 104 // From SVG 1.1 2nd Edition … … 107 110 WTF_MAKE_FAST_ALLOCATED; 108 111 public: 109 ClipperFilterMaskerData() 110 : clipper(0) 111 , filter(0) 112 , masker(0) 113 { 114 } 115 116 RenderSVGResourceClipper* clipper; 117 RenderSVGResourceFilter* filter; 118 RenderSVGResourceMasker* masker; 112 ClipperFilterMaskerData() = default; 113 RenderSVGResourceClipper* clipper { nullptr }; 114 RenderSVGResourceFilter* filter { nullptr }; 115 RenderSVGResourceMasker* masker { nullptr }; 119 116 }; 120 117 … … 124 121 WTF_MAKE_FAST_ALLOCATED; 125 122 public: 126 MarkerData() 127 : markerStart(0) 128 , markerMid(0) 129 , markerEnd(0) 130 { 131 } 132 133 RenderSVGResourceMarker* markerStart; 134 RenderSVGResourceMarker* markerMid; 135 RenderSVGResourceMarker* markerEnd; 123 MarkerData() = default; 124 RenderSVGResourceMarker* markerStart { nullptr }; 125 RenderSVGResourceMarker* markerMid { nullptr }; 126 RenderSVGResourceMarker* markerEnd { nullptr }; 136 127 }; 137 128 … … 143 134 WTF_MAKE_FAST_ALLOCATED; 144 135 public: 145 FillStrokeData() 146 : fill(0) 147 , stroke(0) 148 { 149 } 150 151 RenderSVGResourceContainer* fill; 152 RenderSVGResourceContainer* stroke; 136 FillStrokeData() = default; 137 RenderSVGResourceContainer* fill { nullptr }; 138 RenderSVGResourceContainer* stroke { nullptr }; 153 139 }; 154 140 -
trunk/Source/WebCore/rendering/svg/SVGResourcesCache.cpp
r223728 r223789 162 162 163 163 for (auto& it : cache.m_cache) { 164 i t.value->resourceDestroyed(resource);165 166 // Mark users of destroyed resources as pending resolution based on the id of the old resource.167 Element& resourceElement = resource.element();168 Element* clientElement = it.key->element();169 clientElement->document().accessSVGExtensions().addPendingResource(resourceElement.getIdAttribute(), clientElement);164 if (it.value->resourceDestroyed(resource)) { 165 // Mark users of destroyed resources as pending resolution based on the id of the old resource. 166 Element& resourceElement = resource.element(); 167 Element* clientElement = it.key->element(); 168 clientElement->document().accessSVGExtensions().addPendingResource(resourceElement.getIdAttribute(), clientElement); 169 } 170 170 } 171 171 }
Note: See TracChangeset
for help on using the changeset viewer.