Title: [224094] releases/WebKitGTK/webkit-2.18/Source/WebCore
Revision
224094
Author
[email protected]
Date
2017-10-27 01:28:50 -0700 (Fri, 27 Oct 2017)

Log Message

Merge r223789 - 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 <[email protected]> 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):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog (224093 => 224094)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog	2017-10-27 08:26:36 UTC (rev 224093)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog	2017-10-27 08:28:50 UTC (rev 224094)
@@ -1,3 +1,38 @@
+2017-10-20  Said Abou-Hallawa  <[email protected]>
+
+        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>
+
+        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):
+
 2017-10-20  Joanmarie Diggs  <[email protected]>
 
         AX: [ATK] Events missing and state incorrect for aria-activedescendant

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResources.cpp (224093 => 224094)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResources.cpp	2017-10-27 08:26:36 UTC (rev 224093)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResources.cpp	2017-10-27 08:28:50 UTC (rev 224094)
@@ -171,18 +171,18 @@
 static inline RenderSVGResourceContainer* paintingResourceFromSVGPaint(Document& document, const SVGPaintType& paintType, const String& paintUri, AtomicString& id, bool& hasPendingResource)
 {
     if (paintType != SVG_PAINTTYPE_URI && paintType != SVG_PAINTTYPE_URI_RGBCOLOR && paintType != SVG_PAINTTYPE_URI_CURRENTCOLOR)
-        return 0;
+        return nullptr;
 
     id = SVGURIReference::fragmentIdentifierFromIRIString(paintUri, document);
     RenderSVGResourceContainer* container = getRenderSVGResourceContainerById(document, id);
     if (!container) {
         hasPendingResource = true;
-        return 0;
+        return nullptr;
     }
 
     RenderSVGResourceType resourceType = container->resourceType();
     if (resourceType != PatternResourceType && resourceType != LinearGradientResourceType && resourceType != RadialGradientResourceType)
-        return 0;
+        return nullptr;
 
     return container;
 }
@@ -330,7 +330,7 @@
 
 void SVGResources::removeClientFromCache(RenderElement& renderer, bool markForInvalidation) const
 {
-    if (!m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)
+    if (isEmpty())
         return;
 
     if (m_linkedResource) {
@@ -367,10 +367,10 @@
     }
 }
 
-void SVGResources::resourceDestroyed(RenderSVGResourceContainer& resource)
+bool SVGResources::resourceDestroyed(RenderSVGResourceContainer& resource)
 {
-    if (!m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)
-        return;
+    if (isEmpty())
+        return false;
 
     if (m_linkedResource == &resource) {
         ASSERT(!m_clipperFilterMaskerData);
@@ -377,10 +377,11 @@
         ASSERT(!m_markerData);
         ASSERT(!m_fillStrokeData);
         m_linkedResource->removeAllClientsFromCache();
-        m_linkedResource = 0;
-        return;
+        m_linkedResource = nullptr;
+        return true;
     }
 
+    bool foundResources = false;
     switch (resource.resourceType()) {
     case MaskerResourceType:
         if (!m_clipperFilterMaskerData)
@@ -387,7 +388,8 @@
             break;
         if (m_clipperFilterMaskerData->masker == &resource) {
             m_clipperFilterMaskerData->masker->removeAllClientsFromCache();
-            m_clipperFilterMaskerData->masker = 0;
+            m_clipperFilterMaskerData->masker = nullptr;
+            foundResources = true;
         }
         break;
     case MarkerResourceType:
@@ -395,15 +397,18 @@
             break;
         if (m_markerData->markerStart == &resource) {
             m_markerData->markerStart->removeAllClientsFromCache();
-            m_markerData->markerStart = 0;
+            m_markerData->markerStart = nullptr;
+            foundResources = true;
         }
         if (m_markerData->markerMid == &resource) {
             m_markerData->markerMid->removeAllClientsFromCache();
-            m_markerData->markerMid = 0;
+            m_markerData->markerMid = nullptr;
+            foundResources = true;
         }
         if (m_markerData->markerEnd == &resource) {
             m_markerData->markerEnd->removeAllClientsFromCache();
-            m_markerData->markerEnd = 0;
+            m_markerData->markerEnd = nullptr;
+            foundResources = true;
         }
         break;
     case PatternResourceType:
@@ -413,11 +418,13 @@
             break;
         if (m_fillStrokeData->fill == &resource) {
             m_fillStrokeData->fill->removeAllClientsFromCache();
-            m_fillStrokeData->fill = 0;
+            m_fillStrokeData->fill = nullptr;
+            foundResources = true;
         }
         if (m_fillStrokeData->stroke == &resource) {
             m_fillStrokeData->stroke->removeAllClientsFromCache();
-            m_fillStrokeData->stroke = 0;
+            m_fillStrokeData->stroke = nullptr;
+            foundResources = true;
         }
         break;
     case FilterResourceType:
@@ -425,7 +432,8 @@
             break;
         if (m_clipperFilterMaskerData->filter == &resource) {
             m_clipperFilterMaskerData->filter->removeAllClientsFromCache();
-            m_clipperFilterMaskerData->filter = 0;
+            m_clipperFilterMaskerData->filter = nullptr;
+            foundResources = true;
         }
         break;
     case ClipperResourceType:
@@ -433,17 +441,19 @@
             break; 
         if (m_clipperFilterMaskerData->clipper == &resource) {
             m_clipperFilterMaskerData->clipper->removeAllClientsFromCache();
-            m_clipperFilterMaskerData->clipper = 0;
+            m_clipperFilterMaskerData->clipper = nullptr;
+            foundResources = true;
         }
         break;
     case SolidColorResourceType:
         ASSERT_NOT_REACHED();
     }
+    return foundResources;
 }
 
 void SVGResources::buildSetOfResources(HashSet<RenderSVGResourceContainer*>& set)
 {
-    if (!m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource)
+    if (isEmpty())
         return;
 
     if (m_linkedResource) {
@@ -498,7 +508,7 @@
 {
     ASSERT(m_clipperFilterMaskerData);
     ASSERT(m_clipperFilterMaskerData->clipper);
-    m_clipperFilterMaskerData->clipper = 0;
+    m_clipperFilterMaskerData->clipper = nullptr;
 }
 
 bool SVGResources::setFilter(RenderSVGResourceFilter* filter)
@@ -519,7 +529,7 @@
 {
     ASSERT(m_clipperFilterMaskerData);
     ASSERT(m_clipperFilterMaskerData->filter);
-    m_clipperFilterMaskerData->filter = 0;
+    m_clipperFilterMaskerData->filter = nullptr;
 }
 
 bool SVGResources::setMarkerStart(RenderSVGResourceMarker* markerStart)
@@ -540,7 +550,7 @@
 {
     ASSERT(m_markerData);
     ASSERT(m_markerData->markerStart);
-    m_markerData->markerStart = 0;
+    m_markerData->markerStart = nullptr;
 }
 
 bool SVGResources::setMarkerMid(RenderSVGResourceMarker* markerMid)
@@ -561,7 +571,7 @@
 {
     ASSERT(m_markerData);
     ASSERT(m_markerData->markerMid);
-    m_markerData->markerMid = 0;
+    m_markerData->markerMid = nullptr;
 }
 
 bool SVGResources::setMarkerEnd(RenderSVGResourceMarker* markerEnd)
@@ -582,7 +592,7 @@
 {
     ASSERT(m_markerData);
     ASSERT(m_markerData->markerEnd);
-    m_markerData->markerEnd = 0;
+    m_markerData->markerEnd = nullptr;
 }
 
 bool SVGResources::setMasker(RenderSVGResourceMasker* masker)
@@ -603,7 +613,7 @@
 {
     ASSERT(m_clipperFilterMaskerData);
     ASSERT(m_clipperFilterMaskerData->masker);
-    m_clipperFilterMaskerData->masker = 0;
+    m_clipperFilterMaskerData->masker = nullptr;
 }
 
 bool SVGResources::setFill(RenderSVGResourceContainer* fill)
@@ -626,7 +636,7 @@
 {
     ASSERT(m_fillStrokeData);
     ASSERT(m_fillStrokeData->fill);
-    m_fillStrokeData->fill = 0;
+    m_fillStrokeData->fill = nullptr;
 }
 
 bool SVGResources::setStroke(RenderSVGResourceContainer* stroke)
@@ -649,7 +659,7 @@
 {
     ASSERT(m_fillStrokeData);
     ASSERT(m_fillStrokeData->stroke);
-    m_fillStrokeData->stroke = 0;
+    m_fillStrokeData->stroke = nullptr;
 }
 
 bool SVGResources::setLinkedResource(RenderSVGResourceContainer* linkedResource)
@@ -664,7 +674,7 @@
 void SVGResources::resetLinkedResource()
 {
     ASSERT(m_linkedResource);
-    m_linkedResource = 0;
+    m_linkedResource = nullptr;
 }
 
 #if ENABLE(TREE_DEBUGGING)

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResources.h (224093 => 224094)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResources.h	2017-10-27 08:26:36 UTC (rev 224093)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResources.h	2017-10-27 08:28:50 UTC (rev 224094)
@@ -67,7 +67,8 @@
 
     // Methods operating on all cached resources
     void removeClientFromCache(RenderElement&, bool markForInvalidation = true) const;
-    void resourceDestroyed(RenderSVGResourceContainer&);
+    // Returns true if the resource-to-be-destroyed is one of our resources.
+    bool resourceDestroyed(RenderSVGResourceContainer&);
 
 #if ENABLE(TREE_DEBUGGING)
     void dump(const RenderObject*);
@@ -97,6 +98,8 @@
     bool setFill(RenderSVGResourceContainer*);
     bool setStroke(RenderSVGResourceContainer*);
     bool setLinkedResource(RenderSVGResourceContainer*);
+    
+    bool isEmpty() const { return !m_clipperFilterMaskerData && !m_markerData && !m_fillStrokeData && !m_linkedResource; }
 
     // From SVG 1.1 2nd Edition
     // clipper: 'container elements' and 'graphics elements'
@@ -106,16 +109,10 @@
     struct ClipperFilterMaskerData {
         WTF_MAKE_FAST_ALLOCATED;
     public:
-        ClipperFilterMaskerData()
-            : clipper(0)
-            , filter(0)
-            , masker(0)
-        {
-        }
-
-        RenderSVGResourceClipper* clipper;
-        RenderSVGResourceFilter* filter;
-        RenderSVGResourceMasker* masker;
+        ClipperFilterMaskerData() = default;
+        RenderSVGResourceClipper* clipper { nullptr };
+        RenderSVGResourceFilter* filter { nullptr };
+        RenderSVGResourceMasker* masker { nullptr };
     };
 
     // From SVG 1.1 2nd Edition
@@ -123,16 +120,10 @@
     struct MarkerData {
         WTF_MAKE_FAST_ALLOCATED;
     public:
-        MarkerData()
-            : markerStart(0)
-            , markerMid(0)
-            , markerEnd(0)
-        {
-        }
-
-        RenderSVGResourceMarker* markerStart;
-        RenderSVGResourceMarker* markerMid;
-        RenderSVGResourceMarker* markerEnd;
+        MarkerData() = default;
+        RenderSVGResourceMarker* markerStart { nullptr };
+        RenderSVGResourceMarker* markerMid { nullptr };
+        RenderSVGResourceMarker* markerEnd { nullptr };
     };
 
     // From SVG 1.1 2nd Edition
@@ -142,14 +133,9 @@
     struct FillStrokeData {
         WTF_MAKE_FAST_ALLOCATED;
     public:
-        FillStrokeData()
-            : fill(0)
-            , stroke(0)
-        {
-        }
-
-        RenderSVGResourceContainer* fill;
-        RenderSVGResourceContainer* stroke;
+        FillStrokeData() = default;
+        RenderSVGResourceContainer* fill { nullptr };
+        RenderSVGResourceContainer* stroke { nullptr };
     };
 
     std::unique_ptr<ClipperFilterMaskerData> m_clipperFilterMaskerData;

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResourcesCache.cpp (224093 => 224094)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResourcesCache.cpp	2017-10-27 08:26:36 UTC (rev 224093)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/rendering/svg/SVGResourcesCache.cpp	2017-10-27 08:28:50 UTC (rev 224094)
@@ -165,12 +165,12 @@
     cache.removeResourcesFromRenderer(resource);
 
     for (auto& it : cache.m_cache) {
-        it.value->resourceDestroyed(resource);
-
-        // Mark users of destroyed resources as pending resolution based on the id of the old resource.
-        Element& resourceElement = resource.element();
-        Element* clientElement = it.key->element();
-        clientElement->document().accessSVGExtensions().addPendingResource(resourceElement.getIdAttribute(), clientElement);
+        if (it.value->resourceDestroyed(resource)) {
+            // Mark users of destroyed resources as pending resolution based on the id of the old resource.
+            Element& resourceElement = resource.element();
+            Element* clientElement = it.key->element();
+            clientElement->document().accessSVGExtensions().addPendingResource(resourceElement.getIdAttribute(), clientElement);
+        }
     }
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to