Changeset 223789 in webkit


Ignore:
Timestamp:
Oct 20, 2017 1:34:27 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

When destroying a resource, register "only" the clients who are losing their resource as having pending resources
https://bugs.webkit.org/show_bug.cgi?id=178567
<rdar://problem/35064781>

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-10-20
Reviewed by Simon Fraser.

SVGResources::resourceDestroyed() will return a bool indicating whether
it had a reference to the destroyed resource or not. If it returns true
SVGResourcesCache::resourceDestroyed() will register the client Element
as having pending resources.

  • rendering/svg/SVGResources.cpp:

(WebCore::paintingResourceFromSVGPaint):
(WebCore::SVGResources::removeClientFromCache const):
(WebCore::SVGResources::resourceDestroyed):
(WebCore::SVGResources::buildSetOfResources):
(WebCore::SVGResources::resetClipper):
(WebCore::SVGResources::resetFilter):
(WebCore::SVGResources::resetMarkerStart):
(WebCore::SVGResources::resetMarkerMid):
(WebCore::SVGResources::resetMarkerEnd):
(WebCore::SVGResources::resetMasker):
(WebCore::SVGResources::resetFill):
(WebCore::SVGResources::resetStroke):
(WebCore::SVGResources::resetLinkedResource):

  • rendering/svg/SVGResources.h:

(WebCore::SVGResources::isEmpty const):
(WebCore::SVGResources::ClipperFilterMaskerData::ClipperFilterMaskerData): Deleted.
(WebCore::SVGResources::MarkerData::MarkerData): Deleted.
(WebCore::SVGResources::FillStrokeData::FillStrokeData): Deleted.

  • rendering/svg/SVGResourcesCache.cpp:

(WebCore::SVGResourcesCache::resourceDestroyed):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r223788 r223789  
     12017-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
    1362017-10-20  Ryosuke Niwa  <rniwa@webkit.org>
    237
  • trunk/Source/WebCore/rendering/svg/SVGResources.cpp

    r222304 r223789  
    172172{
    173173    if (paintType != SVG_PAINTTYPE_URI && paintType != SVG_PAINTTYPE_URI_RGBCOLOR && paintType != SVG_PAINTTYPE_URI_CURRENTCOLOR)
    174         return 0;
     174        return nullptr;
    175175
    176176    id = SVGURIReference::fragmentIdentifierFromIRIString(paintUri, document);
     
    178178    if (!container) {
    179179        hasPendingResource = true;
    180         return 0;
     180        return nullptr;
    181181    }
    182182
    183183    RenderSVGResourceType resourceType = container->resourceType();
    184184    if (resourceType != PatternResourceType && resourceType != LinearGradientResourceType && resourceType != RadialGradientResourceType)
    185         return 0;
     185        return nullptr;
    186186
    187187    return container;
     
    331331void SVGResources::removeClientFromCache(RenderElement& renderer, bool markForInvalidation) const
    332332{
    333     if (!m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)
     333    if (isEmpty())
    334334        return;
    335335
     
    368368}
    369369
    370 void SVGResources::resourceDestroyed(RenderSVGResourceContainer& resource)
    371 {
    372     if (!m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)
    373         return;
     370bool SVGResources::resourceDestroyed(RenderSVGResourceContainer& resource)
     371{
     372    if (isEmpty())
     373        return false;
    374374
    375375    if (m_linkedResource == &resource) {
     
    378378        ASSERT(!m_fillStrokeData);
    379379        m_linkedResource->removeAllClientsFromCache();
    380         m_linkedResource = 0;
    381         return;
    382     }
    383 
     380        m_linkedResource = nullptr;
     381        return true;
     382    }
     383
     384    bool foundResources = false;
    384385    switch (resource.resourceType()) {
    385386    case MaskerResourceType:
     
    388389        if (m_clipperFilterMaskerData->masker == &resource) {
    389390            m_clipperFilterMaskerData->masker->removeAllClientsFromCache();
    390             m_clipperFilterMaskerData->masker = 0;
     391            m_clipperFilterMaskerData->masker = nullptr;
     392            foundResources = true;
    391393        }
    392394        break;
     
    396398        if (m_markerData->markerStart == &resource) {
    397399            m_markerData->markerStart->removeAllClientsFromCache();
    398             m_markerData->markerStart = 0;
     400            m_markerData->markerStart = nullptr;
     401            foundResources = true;
    399402        }
    400403        if (m_markerData->markerMid == &resource) {
    401404            m_markerData->markerMid->removeAllClientsFromCache();
    402             m_markerData->markerMid = 0;
     405            m_markerData->markerMid = nullptr;
     406            foundResources = true;
    403407        }
    404408        if (m_markerData->markerEnd == &resource) {
    405409            m_markerData->markerEnd->removeAllClientsFromCache();
    406             m_markerData->markerEnd = 0;
     410            m_markerData->markerEnd = nullptr;
     411            foundResources = true;
    407412        }
    408413        break;
     
    414419        if (m_fillStrokeData->fill == &resource) {
    415420            m_fillStrokeData->fill->removeAllClientsFromCache();
    416             m_fillStrokeData->fill = 0;
     421            m_fillStrokeData->fill = nullptr;
     422            foundResources = true;
    417423        }
    418424        if (m_fillStrokeData->stroke == &resource) {
    419425            m_fillStrokeData->stroke->removeAllClientsFromCache();
    420             m_fillStrokeData->stroke = 0;
     426            m_fillStrokeData->stroke = nullptr;
     427            foundResources = true;
    421428        }
    422429        break;
     
    426433        if (m_clipperFilterMaskerData->filter == &resource) {
    427434            m_clipperFilterMaskerData->filter->removeAllClientsFromCache();
    428             m_clipperFilterMaskerData->filter = 0;
     435            m_clipperFilterMaskerData->filter = nullptr;
     436            foundResources = true;
    429437        }
    430438        break;
     
    434442        if (m_clipperFilterMaskerData->clipper == &resource) {
    435443            m_clipperFilterMaskerData->clipper->removeAllClientsFromCache();
    436             m_clipperFilterMaskerData->clipper = 0;
     444            m_clipperFilterMaskerData->clipper = nullptr;
     445            foundResources = true;
    437446        }
    438447        break;
     
    440449        ASSERT_NOT_REACHED();
    441450    }
     451    return foundResources;
    442452}
    443453
    444454void SVGResources::buildSetOfResources(HashSet<RenderSVGResourceContainer*>& set)
    445455{
    446     if (!m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)
     456    if (isEmpty())
    447457        return;
    448458
     
    499509    ASSERT(m_clipperFilterMaskerData);
    500510    ASSERT(m_clipperFilterMaskerData->clipper);
    501     m_clipperFilterMaskerData->clipper = 0;
     511    m_clipperFilterMaskerData->clipper = nullptr;
    502512}
    503513
     
    520530    ASSERT(m_clipperFilterMaskerData);
    521531    ASSERT(m_clipperFilterMaskerData->filter);
    522     m_clipperFilterMaskerData->filter = 0;
     532    m_clipperFilterMaskerData->filter = nullptr;
    523533}
    524534
     
    541551    ASSERT(m_markerData);
    542552    ASSERT(m_markerData->markerStart);
    543     m_markerData->markerStart = 0;
     553    m_markerData->markerStart = nullptr;
    544554}
    545555
     
    562572    ASSERT(m_markerData);
    563573    ASSERT(m_markerData->markerMid);
    564     m_markerData->markerMid = 0;
     574    m_markerData->markerMid = nullptr;
    565575}
    566576
     
    583593    ASSERT(m_markerData);
    584594    ASSERT(m_markerData->markerEnd);
    585     m_markerData->markerEnd = 0;
     595    m_markerData->markerEnd = nullptr;
    586596}
    587597
     
    604614    ASSERT(m_clipperFilterMaskerData);
    605615    ASSERT(m_clipperFilterMaskerData->masker);
    606     m_clipperFilterMaskerData->masker = 0;
     616    m_clipperFilterMaskerData->masker = nullptr;
    607617}
    608618
     
    627637    ASSERT(m_fillStrokeData);
    628638    ASSERT(m_fillStrokeData->fill);
    629     m_fillStrokeData->fill = 0;
     639    m_fillStrokeData->fill = nullptr;
    630640}
    631641
     
    650660    ASSERT(m_fillStrokeData);
    651661    ASSERT(m_fillStrokeData->stroke);
    652     m_fillStrokeData->stroke = 0;
     662    m_fillStrokeData->stroke = nullptr;
    653663}
    654664
     
    665675{
    666676    ASSERT(m_linkedResource);
    667     m_linkedResource = 0;
     677    m_linkedResource = nullptr;
    668678}
    669679
  • trunk/Source/WebCore/rendering/svg/SVGResources.h

    r222304 r223789  
    6868    // Methods operating on all cached resources
    6969    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&);
    7172
    7273#if ENABLE(TREE_DEBUGGING)
     
    9899    bool setStroke(RenderSVGResourceContainer*);
    99100    bool setLinkedResource(RenderSVGResourceContainer*);
     101   
     102    bool isEmpty() const { return !m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource; }
    100103
    101104    // From SVG 1.1 2nd Edition
     
    107110        WTF_MAKE_FAST_ALLOCATED;
    108111    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 };
    119116    };
    120117
     
    124121        WTF_MAKE_FAST_ALLOCATED;
    125122    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 };
    136127    };
    137128
     
    143134        WTF_MAKE_FAST_ALLOCATED;
    144135    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 };
    153139    };
    154140
  • trunk/Source/WebCore/rendering/svg/SVGResourcesCache.cpp

    r223728 r223789  
    162162
    163163    for (auto& it : cache.m_cache) {
    164         it.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        }
    170170    }
    171171}
Note: See TracChangeset for help on using the changeset viewer.