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);