Title: [119627] branches/chromium/1132/Source/WebCore

Diff

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGBlock.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGBlock.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGBlock.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -104,12 +104,6 @@
     SVGResourcesCache::clientStyleChanged(this, diff, style());
 }
 
-void RenderSVGBlock::updateFromElement()
-{
-    RenderBlock::updateFromElement();
-    SVGResourcesCache::clientUpdatedFromElement(this, style());
 }
 
-}
-
 #endif

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGBlock.h (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGBlock.h	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGBlock.h	2012-06-06 22:44:27 UTC (rev 119627)
@@ -45,7 +45,6 @@
 
     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
-    virtual void updateFromElement();
 };
 
 }

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGContainer.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGContainer.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGContainer.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -87,6 +87,19 @@
     setNeedsLayout(false);
 }
 
+void RenderSVGContainer::addChild(RenderObject* child, RenderObject* beforeChild)
+{
+    RenderSVGModelObject::addChild(child, beforeChild);
+    SVGResourcesCache::clientWasAddedToTree(child, child->style());
+}
+
+void RenderSVGContainer::removeChild(RenderObject* child)
+{
+    SVGResourcesCache::clientWillBeRemovedFromTree(child);
+    RenderSVGModelObject::removeChild(child);
+}
+
+
 bool RenderSVGContainer::selfWillPaint()
 {
     SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(this);

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGContainer.h (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGContainer.h	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGContainer.h	2012-06-06 22:44:27 UTC (rev 119627)
@@ -53,6 +53,8 @@
 
     virtual void layout();
 
+    virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE;
+    virtual void removeChild(RenderObject*) OVERRIDE;
     virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint&);
 
     virtual FloatRect objectBoundingBox() const { return m_objectBoundingBox; }

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGInline.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGInline.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGInline.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -114,21 +114,19 @@
     SVGResourcesCache::clientStyleChanged(this, diff, style());
 }
 
-void RenderSVGInline::updateFromElement()
-{
-    RenderInline::updateFromElement();
-    SVGResourcesCache::clientUpdatedFromElement(this, style());
-}
-
 void RenderSVGInline::addChild(RenderObject* child, RenderObject* beforeChild)
 {
     RenderInline::addChild(child, beforeChild);
+    SVGResourcesCache::clientWasAddedToTree(child, child->style());
+
     if (RenderSVGText* textRenderer = RenderSVGText::locateRenderSVGTextAncestor(this))
         textRenderer->subtreeChildWasAdded(child);
 }
 
 void RenderSVGInline::removeChild(RenderObject* child)
 {
+    SVGResourcesCache::clientWillBeRemovedFromTree(child);
+
     RenderSVGText* textRenderer = RenderSVGText::locateRenderSVGTextAncestor(this);
     if (!textRenderer) {
         RenderInline::removeChild(child);

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGInline.h (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGInline.h	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGInline.h	2012-06-06 22:44:27 UTC (rev 119627)
@@ -56,9 +56,8 @@
     virtual void willBeDestroyed();
     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
-    virtual void updateFromElement();
 
-    virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0);
+    virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE;
     virtual void removeChild(RenderObject*) OVERRIDE;
 };
 

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -106,12 +106,6 @@
     SVGResourcesCache::clientStyleChanged(this, diff, style());
 }
 
-void RenderSVGModelObject::updateFromElement()
-{
-    RenderObject::updateFromElement();
-    SVGResourcesCache::clientUpdatedFromElement(this, style());
-}
-
 bool RenderSVGModelObject::nodeAtPoint(const HitTestRequest&, HitTestResult&, const LayoutPoint&, const LayoutPoint&, HitTestAction)
 {
     ASSERT_NOT_REACHED();

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGModelObject.h (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGModelObject.h	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGModelObject.h	2012-06-06 22:44:27 UTC (rev 119627)
@@ -61,7 +61,6 @@
     virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const;
     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
-    virtual void updateFromElement();
 
     static bool checkIntersection(RenderObject*, const FloatRect&);
     static bool checkEnclosure(RenderObject*, const FloatRect&);

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -165,7 +165,7 @@
         RenderObject* renderer = (*it)->renderer();
         if (!renderer)
             continue;
-        SVGResourcesCache::clientUpdatedFromElement(renderer, renderer->style());
+        SVGResourcesCache::clientStyleChanged(renderer, StyleDifferenceLayout, renderer->style());
         renderer->setNeedsLayout(true);
     }
 }

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGRoot.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -326,12 +326,18 @@
     SVGResourcesCache::clientStyleChanged(this, diff, style());
 }
 
-void RenderSVGRoot::updateFromElement()
+void RenderSVGRoot::addChild(RenderObject* child, RenderObject* beforeChild)
 {
-    RenderReplaced::updateFromElement();
-    SVGResourcesCache::clientUpdatedFromElement(this, style());
+    RenderReplaced::addChild(child, beforeChild);
+    SVGResourcesCache::clientWasAddedToTree(child, child->style());
 }
 
+void RenderSVGRoot::removeChild(RenderObject* child)
+{
+    SVGResourcesCache::clientWillBeRemovedFromTree(child);
+    RenderReplaced::removeChild(child);
+}
+
 // RenderBox methods will expect coordinates w/o any transforms in coordinates
 // relative to our borderBox origin.  This method gives us exactly that.
 void RenderSVGRoot::buildLocalToBorderBoxTransform()

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGRoot.h (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGRoot.h	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGRoot.h	2012-06-06 22:44:27 UTC (rev 119627)
@@ -78,7 +78,8 @@
     virtual void willBeDestroyed();
     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
-    virtual void updateFromElement();
+    virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE;
+    virtual void removeChild(RenderObject*) OVERRIDE;
 
     virtual const AffineTransform& localToParentTransform() const;
 

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGText.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGText.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/RenderSVGText.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -518,11 +518,15 @@
 void RenderSVGText::addChild(RenderObject* child, RenderObject* beforeChild)
 {
     RenderSVGBlock::addChild(child, beforeChild);
+
+    SVGResourcesCache::clientWasAddedToTree(child, child->style());
     subtreeChildWasAdded(child);
 }
 
 void RenderSVGText::removeChild(RenderObject* child)
 {
+    SVGResourcesCache::clientWillBeRemovedFromTree(child);
+
     Vector<SVGTextLayoutAttributes*, 2> affectedAttributes;
     subtreeChildWillBeRemoved(child, affectedAttributes);
     RenderSVGBlock::removeChild(child);

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/SVGResourcesCache.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/SVGResourcesCache.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/SVGResourcesCache.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -128,25 +128,45 @@
 void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifference diff, const RenderStyle* newStyle)
 {
     ASSERT(renderer);
-    if (diff == StyleDifferenceEqual)
+    if (diff == StyleDifferenceEqual || !renderer->parent())
         return;
 
     // In this case the proper SVGFE*Element will decide whether the modified CSS properties require a relayout or repaint.
     if (renderer->isSVGResourceFilterPrimitive() && diff == StyleDifferenceRepaint)
         return;
 
-    clientUpdatedFromElement(renderer, newStyle);
+    // Dynamic changes of CSS properties like 'clip-path' may require us to recompute the associated resources for a renderer.
+    // FIXME: Avoid passing in a useless StyleDifference, but instead compare oldStyle/newStyle to see which resources changed
+    // to be able to selectively rebuild individual resources, instead of all of them.
+    SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer);
+    cache->removeResourcesFromRenderObject(renderer);
+    cache->addResourcesFromRenderObject(renderer, newStyle);
+
+    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false);
 }
 
-void SVGResourcesCache::clientUpdatedFromElement(RenderObject* renderer, const RenderStyle* newStyle)
+static inline bool rendererCanHaveResources(RenderObject* renderer)
 {
     ASSERT(renderer);
     ASSERT(renderer->parent());
+    return renderer->node() && !renderer->isSVGInlineText();
+}
 
+void SVGResourcesCache::clientWasAddedToTree(RenderObject* renderer, const RenderStyle* newStyle)
+{
+    if (!rendererCanHaveResources(renderer))
+        return;
     SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer);
-    cache->removeResourcesFromRenderObject(renderer);
     cache->addResourcesFromRenderObject(renderer, newStyle);
+}
 
+void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject* renderer)
+{
+    if (!rendererCanHaveResources(renderer))
+        return;
+    SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer);
+    cache->removeResourcesFromRenderObject(renderer);
+
     RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false);
 }
 

Modified: branches/chromium/1132/Source/WebCore/rendering/svg/SVGResourcesCache.h (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/rendering/svg/SVGResourcesCache.h	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/rendering/svg/SVGResourcesCache.h	2012-06-06 22:44:27 UTC (rev 119627)
@@ -37,10 +37,14 @@
     SVGResourcesCache();
     ~SVGResourcesCache();
 
-    void addResourcesFromRenderObject(RenderObject*, const RenderStyle*);
-    void removeResourcesFromRenderObject(RenderObject*);
     static SVGResources* cachedResourcesForRenderObject(const RenderObject*);
 
+    // Called from all SVG renderers addChild() methods.
+    static void clientWasAddedToTree(RenderObject*, const RenderStyle* newStyle);
+
+    // Called from all SVG renderers removeChild() methods.
+    static void clientWillBeRemovedFromTree(RenderObject*);
+
     // Called from all SVG renderers destroy() methods - except for RenderSVGResourceContainer.
     static void clientDestroyed(RenderObject*);
 
@@ -50,13 +54,13 @@
     // Called from all SVG renderers styleDidChange() methods.
     static void clientStyleChanged(RenderObject*, StyleDifference, const RenderStyle* newStyle);
 
-    // Called from all SVG renderers updateFromElement() methods.
-    static void clientUpdatedFromElement(RenderObject*, const RenderStyle* newStyle);
-
     // Called from RenderSVGResourceContainer::willBeDestroyed().
     static void resourceDestroyed(RenderSVGResourceContainer*);
 
 private:
+    void addResourcesFromRenderObject(RenderObject*, const RenderStyle*);
+    void removeResourcesFromRenderObject(RenderObject*);
+
     HashMap<const RenderObject*, SVGResources*> m_cache;
 };
 

Modified: branches/chromium/1132/Source/WebCore/svg/SVGStyledElement.cpp (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/svg/SVGStyledElement.cpp	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/svg/SVGStyledElement.cpp	2012-06-06 22:44:27 UTC (rev 119627)
@@ -349,14 +349,6 @@
     }
 }
 
-void SVGStyledElement::attach()
-{
-    SVGElement::attach();
-
-    if (RenderObject* object = renderer())
-        object->updateFromElement();
-}
-
 Node::InsertionNotificationRequest SVGStyledElement::insertedInto(Node* rootParent)
 {
     SVGElement::insertedInto(rootParent);

Modified: branches/chromium/1132/Source/WebCore/svg/SVGStyledElement.h (119626 => 119627)


--- branches/chromium/1132/Source/WebCore/svg/SVGStyledElement.h	2012-06-06 22:38:25 UTC (rev 119626)
+++ branches/chromium/1132/Source/WebCore/svg/SVGStyledElement.h	2012-06-06 22:44:27 UTC (rev 119627)
@@ -71,7 +71,6 @@
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual void svgAttributeChanged(const QualifiedName&);
 
-    virtual void attach();
     virtual InsertionNotificationRequest insertedInto(Node*) OVERRIDE;
     virtual void removedFrom(Node*) OVERRIDE;
     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to