Changeset 118608 in webkit
- Timestamp:
- May 26, 2012, 2:08:14 AM (14 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 17 edited
-
ChangeLog (modified) (1 diff)
-
rendering/svg/RenderSVGBlock.cpp (modified) (1 diff)
-
rendering/svg/RenderSVGBlock.h (modified) (1 diff)
-
rendering/svg/RenderSVGContainer.cpp (modified) (1 diff)
-
rendering/svg/RenderSVGContainer.h (modified) (1 diff)
-
rendering/svg/RenderSVGInline.cpp (modified) (2 diffs)
-
rendering/svg/RenderSVGInline.h (modified) (1 diff)
-
rendering/svg/RenderSVGModelObject.cpp (modified) (1 diff)
-
rendering/svg/RenderSVGModelObject.h (modified) (1 diff)
-
rendering/svg/RenderSVGResourceContainer.cpp (modified) (1 diff)
-
rendering/svg/RenderSVGRoot.cpp (modified) (1 diff)
-
rendering/svg/RenderSVGRoot.h (modified) (1 diff)
-
rendering/svg/RenderSVGText.cpp (modified) (2 diffs)
-
rendering/svg/SVGResourcesCache.cpp (modified) (2 diffs)
-
rendering/svg/SVGResourcesCache.h (modified) (2 diffs)
-
svg/SVGStyledElement.cpp (modified) (1 diff)
-
svg/SVGStyledElement.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r118606 r118608 1 2012-05-26 Nikolas Zimmermann <nzimmermann@rim.com> 2 3 Avoid updateFromElement() usage in SVG 4 https://bugs.webkit.org/show_bug.cgi?id=87573 5 6 Stop relying on updateFromElement() - instead rely on addChild/removeChild, which 7 allows us to optimize the resources re-fetching. When a child is added to the tree 8 we don't need to remove existing resources from the SVGResourcesCache - the renderer 9 can't be in the cache yet. Similary, remove the entry from the cache earlier: as soon 10 as the renderer is removed from the tree, instead of waiting for willBeDestroyed(). 11 12 No new tests, refactoring only. 13 14 * rendering/svg/RenderSVGBlock.cpp: 15 * rendering/svg/RenderSVGBlock.h: 16 (RenderSVGBlock): 17 * rendering/svg/RenderSVGContainer.cpp: 18 (WebCore::RenderSVGContainer::addChild): 19 (WebCore): 20 (WebCore::RenderSVGContainer::removeChild): 21 * rendering/svg/RenderSVGContainer.h: 22 (RenderSVGContainer): 23 * rendering/svg/RenderSVGInline.cpp: 24 (WebCore::RenderSVGInline::addChild): 25 (WebCore::RenderSVGInline::removeChild): 26 * rendering/svg/RenderSVGInline.h: 27 (RenderSVGInline): 28 * rendering/svg/RenderSVGModelObject.cpp: 29 * rendering/svg/RenderSVGModelObject.h: 30 (RenderSVGModelObject): 31 * rendering/svg/RenderSVGResourceContainer.cpp: 32 (WebCore::RenderSVGResourceContainer::registerResource): 33 * rendering/svg/RenderSVGRoot.cpp: 34 (WebCore::RenderSVGRoot::addChild): 35 (WebCore): 36 (WebCore::RenderSVGRoot::removeChild): 37 * rendering/svg/RenderSVGRoot.h: 38 (RenderSVGRoot): 39 * rendering/svg/RenderSVGText.cpp: 40 (WebCore::RenderSVGText::addChild): 41 (WebCore::RenderSVGText::removeChild): 42 * rendering/svg/SVGResourcesCache.cpp: 43 (WebCore::SVGResourcesCache::clientStyleChanged): 44 (WebCore::rendererCanHaveResources): 45 (WebCore): 46 (WebCore::SVGResourcesCache::clientWasAddedToTree): 47 (WebCore::SVGResourcesCache::clientWillBeRemovedFromTree): 48 * rendering/svg/SVGResourcesCache.h: 49 (SVGResourcesCache): 50 * svg/SVGStyledElement.cpp: 51 * svg/SVGStyledElement.h: 52 (SVGStyledElement): 53 1 54 2012-05-25 Nat Duca <nduca@chromium.org> 2 55 -
trunk/Source/WebCore/rendering/svg/RenderSVGBlock.cpp
r110224 r118608 105 105 } 106 106 107 void RenderSVGBlock::updateFromElement()108 {109 RenderBlock::updateFromElement();110 SVGResourcesCache::clientUpdatedFromElement(this, style());111 }112 113 107 } 114 108 -
trunk/Source/WebCore/rendering/svg/RenderSVGBlock.h
r117225 r118608 46 46 virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle); 47 47 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 48 virtual void updateFromElement();49 48 }; 50 49 -
trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp
r112091 r118608 88 88 } 89 89 90 void RenderSVGContainer::addChild(RenderObject* child, RenderObject* beforeChild) 91 { 92 RenderSVGModelObject::addChild(child, beforeChild); 93 SVGResourcesCache::clientWasAddedToTree(child, child->style()); 94 } 95 96 void RenderSVGContainer::removeChild(RenderObject* child) 97 { 98 SVGResourcesCache::clientWillBeRemovedFromTree(child); 99 RenderSVGModelObject::removeChild(child); 100 } 101 102 90 103 bool RenderSVGContainer::selfWillPaint() 91 104 { -
trunk/Source/WebCore/rendering/svg/RenderSVGContainer.h
r112091 r118608 54 54 virtual void layout(); 55 55 56 virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE; 57 virtual void removeChild(RenderObject*) OVERRIDE; 56 58 virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint&); 57 59 -
trunk/Source/WebCore/rendering/svg/RenderSVGInline.cpp
r118567 r118608 120 120 } 121 121 122 void RenderSVGInline::updateFromElement()123 {124 RenderInline::updateFromElement();125 SVGResourcesCache::clientUpdatedFromElement(this, style());126 }127 128 122 void RenderSVGInline::addChild(RenderObject* child, RenderObject* beforeChild) 129 123 { 130 124 RenderInline::addChild(child, beforeChild); 125 SVGResourcesCache::clientWasAddedToTree(child, child->style()); 126 131 127 if (RenderSVGText* textRenderer = RenderSVGText::locateRenderSVGTextAncestor(this)) 132 128 textRenderer->subtreeChildWasAdded(child); … … 135 131 void RenderSVGInline::removeChild(RenderObject* child) 136 132 { 133 SVGResourcesCache::clientWillBeRemovedFromTree(child); 134 137 135 RenderSVGText* textRenderer = RenderSVGText::locateRenderSVGTextAncestor(this); 138 136 if (!textRenderer) { -
trunk/Source/WebCore/rendering/svg/RenderSVGInline.h
r118567 r118608 58 58 virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle); 59 59 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 60 virtual void updateFromElement();61 60 62 virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) ;61 virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE; 63 62 virtual void removeChild(RenderObject*) OVERRIDE; 64 63 }; -
trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp
r118567 r118608 112 112 } 113 113 114 void RenderSVGModelObject::updateFromElement()115 {116 RenderObject::updateFromElement();117 SVGResourcesCache::clientUpdatedFromElement(this, style());118 }119 120 114 bool RenderSVGModelObject::nodeAtPoint(const HitTestRequest&, HitTestResult&, const LayoutPoint&, const LayoutPoint&, HitTestAction) 121 115 { -
trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.h
r118567 r118608 63 63 virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle); 64 64 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 65 virtual void updateFromElement();66 65 67 66 static bool checkIntersection(RenderObject*, const FloatRect&); -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
r111601 r118608 166 166 if (!renderer) 167 167 continue; 168 SVGResourcesCache::client UpdatedFromElement(renderer, renderer->style());168 SVGResourcesCache::clientStyleChanged(renderer, StyleDifferenceLayout, renderer->style()); 169 169 renderer->setNeedsLayout(true); 170 170 } -
trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp
r118567 r118608 327 327 } 328 328 329 void RenderSVGRoot::updateFromElement() 330 { 331 RenderReplaced::updateFromElement(); 332 SVGResourcesCache::clientUpdatedFromElement(this, style()); 329 void RenderSVGRoot::addChild(RenderObject* child, RenderObject* beforeChild) 330 { 331 RenderReplaced::addChild(child, beforeChild); 332 SVGResourcesCache::clientWasAddedToTree(child, child->style()); 333 } 334 335 void RenderSVGRoot::removeChild(RenderObject* child) 336 { 337 SVGResourcesCache::clientWillBeRemovedFromTree(child); 338 RenderReplaced::removeChild(child); 333 339 } 334 340 -
trunk/Source/WebCore/rendering/svg/RenderSVGRoot.h
r118567 r118608 79 79 virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle); 80 80 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 81 virtual void updateFromElement(); 81 virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE; 82 virtual void removeChild(RenderObject*) OVERRIDE; 82 83 83 84 virtual const AffineTransform& localToParentTransform() const; -
trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp
r118567 r118608 530 530 { 531 531 RenderSVGBlock::addChild(child, beforeChild); 532 533 SVGResourcesCache::clientWasAddedToTree(child, child->style()); 532 534 subtreeChildWasAdded(child); 533 535 } … … 535 537 void RenderSVGText::removeChild(RenderObject* child) 536 538 { 539 SVGResourcesCache::clientWillBeRemovedFromTree(child); 540 537 541 Vector<SVGTextLayoutAttributes*, 2> affectedAttributes; 538 542 FontCachePurgePreventer fontCachePurgePreventer; -
trunk/Source/WebCore/rendering/svg/SVGResourcesCache.cpp
r117971 r118608 129 129 { 130 130 ASSERT(renderer); 131 if (diff == StyleDifferenceEqual )131 if (diff == StyleDifferenceEqual || !renderer->parent()) 132 132 return; 133 133 … … 136 136 return; 137 137 138 clientUpdatedFromElement(renderer, newStyle); 139 } 140 141 void SVGResourcesCache::clientUpdatedFromElement(RenderObject* renderer, const RenderStyle* newStyle) 142 { 143 ASSERT(renderer); 144 ASSERT(renderer->parent()); 145 138 // Dynamic changes of CSS properties like 'clip-path' may require us to recompute the associated resources for a renderer. 139 // FIXME: Avoid passing in a useless StyleDifference, but instead compare oldStyle/newStyle to see which resources changed 140 // to be able to selectively rebuild individual resources, instead of all of them. 146 141 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 147 142 cache->removeResourcesFromRenderObject(renderer); 148 143 cache->addResourcesFromRenderObject(renderer, newStyle); 144 145 RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); 146 } 147 148 static inline bool rendererCanHaveResources(RenderObject* renderer) 149 { 150 ASSERT(renderer); 151 ASSERT(renderer->parent()); 152 return renderer->node() && !renderer->isSVGInlineText(); 153 } 154 155 void SVGResourcesCache::clientWasAddedToTree(RenderObject* renderer, const RenderStyle* newStyle) 156 { 157 if (!rendererCanHaveResources(renderer)) 158 return; 159 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 160 cache->addResourcesFromRenderObject(renderer, newStyle); 161 } 162 163 void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject* renderer) 164 { 165 if (!rendererCanHaveResources(renderer)) 166 return; 167 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 168 cache->removeResourcesFromRenderObject(renderer); 149 169 150 170 RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer, false); -
trunk/Source/WebCore/rendering/svg/SVGResourcesCache.h
r117971 r118608 38 38 ~SVGResourcesCache(); 39 39 40 void addResourcesFromRenderObject(RenderObject*, const RenderStyle*);41 void removeResourcesFromRenderObject(RenderObject*);42 40 static SVGResources* cachedResourcesForRenderObject(const RenderObject*); 41 42 // Called from all SVG renderers addChild() methods. 43 static void clientWasAddedToTree(RenderObject*, const RenderStyle* newStyle); 44 45 // Called from all SVG renderers removeChild() methods. 46 static void clientWillBeRemovedFromTree(RenderObject*); 43 47 44 48 // Called from all SVG renderers destroy() methods - except for RenderSVGResourceContainer. … … 51 55 static void clientStyleChanged(RenderObject*, StyleDifference, const RenderStyle* newStyle); 52 56 53 // Called from all SVG renderers updateFromElement() methods.54 static void clientUpdatedFromElement(RenderObject*, const RenderStyle* newStyle);55 56 57 // Called from RenderSVGResourceContainer::willBeDestroyed(). 57 58 static void resourceDestroyed(RenderSVGResourceContainer*); 58 59 59 60 private: 61 void addResourcesFromRenderObject(RenderObject*, const RenderStyle*); 62 void removeResourcesFromRenderObject(RenderObject*); 63 60 64 HashMap<const RenderObject*, SVGResources*> m_cache; 61 65 }; -
trunk/Source/WebCore/svg/SVGStyledElement.cpp
r118192 r118608 351 351 } 352 352 353 void SVGStyledElement::attach()354 {355 SVGElement::attach();356 357 if (RenderObject* object = renderer())358 object->updateFromElement();359 }360 361 353 Node::InsertionNotificationRequest SVGStyledElement::insertedInto(ContainerNode* rootParent) 362 354 { -
trunk/Source/WebCore/svg/SVGStyledElement.h
r118192 r118608 72 72 virtual void svgAttributeChanged(const QualifiedName&); 73 73 74 virtual void attach();75 74 virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE; 76 75 virtual void removedFrom(ContainerNode*) OVERRIDE;
Note:
See TracChangeset
for help on using the changeset viewer.