Changeset 138823 in webkit
- Timestamp:
- Jan 4, 2013 11:48:10 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 16 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r138820 r138823 1 2013-01-04 Stephen White <senorblanco@chromium.org> 2 3 CSS url() filters with forward references don't work 4 https://bugs.webkit.org/show_bug.cgi?id=90405 5 6 Based on a patch by Keyar Hood. 7 8 Reviewed by Dirk Schulze. 9 10 * css3/filters/effect-reference-after-expected.html: Added. 11 * css3/filters/effect-reference-after.html: Added. 12 * css3/filters/effect-reference-delete-crash.html: Added. 13 * css3/filters/effect-reference-delete-expected.html: Added. 14 * css3/filters/effect-reference-delete.html: Added. 15 * css3/filters/effect-reference-removed-while-pending-resources-expected.html: Added. 16 * css3/filters/effect-reference-removed-while-pending-resources.html: Added. 17 * css3/filters/effect-reference-rename-expected.html: Added. 18 * css3/filters/effect-reference-rename.html: Added. 19 * css3/filters/effect-reference-reset-style-delete-crash-expected.txt: Added. 20 * css3/filters/effect-reference-reset-style-delete-crash.html: Added. 21 * css3/filters/script-tests/effect-reference-delete-crash.js: Added. 22 * css3/filters/script-tests/effect-reference-reset-style-delete-crash.js: Added. 23 * svg/filters/filter-cycle-expected.html: Added. 24 * svg/filters/filter-cycle.html: Added. 25 1 26 2013-01-04 Mike West <mkwst@chromium.org> 2 27 -
trunk/Source/WebCore/ChangeLog
r138821 r138823 1 2013-01-04 Stephen White <senorblanco@chromium.org> 2 3 CSS url() filters with forward references don't work 4 https://bugs.webkit.org/show_bug.cgi?id=90405 5 6 Based on a patch by Keyar Hood. 7 8 Reviewed by Dirk Schulze. 9 10 In order for CSS to reference SVG filters that will occur later in 11 the document, or will be added at a future time, we need a way to 12 notify the target element (the one the filter style is applied to) 13 when the correct SVG filter is added to the DOM. 14 There is already code for SVG elements that handles this problem, in 15 SVGResourcesCache. This patch allows any element to have a reference to 16 an SVG element in SVGResourceCache. 17 18 Tests: css3/filters/effect-reference-after.html 19 css3/filters/effect-reference-delete-crash.html 20 css3/filters/effect-reference-delete.html 21 css3/filters/effect-reference-removed-while-pending-resources.html 22 css3/filters/effect-reference-rename.html 23 css3/filters/effect-reference-reset-style-delete-crash.html 24 svg/filters/filter-cycle.html 25 26 * dom/Element.cpp: 27 (WebCore::Element::~Element): 28 (WebCore::Element::removedFrom): 29 When an Element is deleted or removed from its container, and it 30 has pending resources, remove it from the SVGResourceCache resources 31 on deletion or when removed from its container. 32 (WebCore::Element::hasPendingResources): 33 (WebCore::Element::setHasPendingResources): 34 (WebCore::Element::clearHasPendingResources): 35 Accessors for ElementRareData's new bit flag. 36 * dom/Element.h: 37 (WebCore::Element::buildPendingResource): 38 Virtual function to override for referenced elements (moved from SVGElement). 39 * dom/ElementRareData.h: 40 (WebCore::ElementRareData::hasPendingResources): 41 (WebCore::ElementRareData::setHasPendingResources): 42 (WebCore::ElementRareData::ElementRareData): 43 Add a new bit flag to indicate whether the element depends on pending resources or not, and accessors. 44 * dom/NodeRareData.h: 45 (WebCore::NodeRareData::NodeRareData): 46 (NodeRareData): 47 The actual flag bit lives in NodeRareData, so it compacts better with 48 other flags. 49 * platform/graphics/texmap/TextureMapperImageBuffer.cpp: 50 (WebCore::BitmapTextureImageBuffer::applyFilters): 51 Changed to the new function signature for FilterEffectRenderer::build(). 52 * rendering/FilterEffectRenderer.cpp: 53 (WebCore::createCustomFilterEffect): 54 (WebCore::FilterEffectRenderer::buildReferenceFilter): 55 Changed signature to accept a RenderObject rather than a Document, so we know which node to notify when the SVG filter arrives. If the referenced filter cannot be found, add its id as a pending reference. 56 (WebCore::FilterEffectRenderer::build): 57 * rendering/FilterEffectRenderer.h: 58 Change to signatures of build() and buildReferenceFilter() to pass 59 * rendering/RenderLayer.cpp: 60 (WebCore::RenderLayer::updateOrRemoveFilterEffectRenderer): 61 Use the new semantics for FilterEffectRenderer::build(). 62 * rendering/svg/RenderSVGResourceContainer.cpp: 63 (WebCore::RenderSVGResourceContainer::registerResource): 64 Call clearHasPendingResourceIfPossible on the SVGDocumentExtensions, not 65 on the element, since we want to support generic Elements. 66 * rendering/svg/SVGResourcesCache.cpp: 67 (WebCore::SVGResourcesCache::addResourcesFromRenderObject): 68 (WebCore::SVGResourcesCache::clientStyleChanged): 69 For non-SVG elements, set a synthetic style change when parent resources 70 are invalidated. 71 (WebCore::SVGResourcesCache::resourceDestroyed): 72 Add support for non-SVG Elements. 73 * svg/SVGDocumentExtensions.cpp: 74 (WebCore::SVGDocumentExtensions::addPendingResource): 75 (WebCore::SVGDocumentExtensions::isElementPendingResources): 76 (WebCore::SVGDocumentExtensions::isElementPendingResource): 77 Changed to allow use of Element instead of SVGElement. 78 (WebCore::SVGDocumentExtensions::clearHasPendingResourcesIfPossible): 79 Moved from SVGElement, and made to work on any Element. This way, 80 we avoid adding this function to Element itself. 81 (WebCore::SVGDocumentExtensions::removeElementFromPendingResources): 82 (WebCore::SVGDocumentExtensions::removeElementFromPendingResourcesForRemoval): 83 Changed to allow use of Element instead of SVGElement. 84 * svg/SVGDocumentExtensions.h: 85 SVGElement -> Element. 86 * svg/SVGElement.cpp: 87 (WebCore::SVGElement::~SVGElement): 88 (WebCore::SVGElement::removedFrom): 89 Don't handle pending resource notifications (Element will do it). 90 * svg/SVGElement.h: 91 All functions moved to Element, except for clearHasPendingResourcesIfPossible() moved to SVGDocumentExtensions. 92 * svg/SVGElementRareData.h: 93 (WebCore::SVGElementRareData::SVGElementRareData): 94 m_hasPendingResources and accessors moved to ElementRareData. 95 * svg/SVGStyledElement.cpp: 96 (WebCore::SVGStyledElement::buildPendingResourcesIfNeeded): 97 SVGElement -> Element, and call SVGDocumentExtensions for 98 clearHasPendingResourcesIfPossible(). 99 1 100 2013-01-04 John Mellor <johnme@chromium.org> 2 101 -
trunk/Source/WebCore/dom/Element.cpp
r138811 r138823 85 85 86 86 #if ENABLE(SVG) 87 #include "SVGDocumentExtensions.h" 87 88 #include "SVGElement.h" 88 89 #include "SVGNames.h" … … 203 204 if (hasSyntheticAttrChildNodes()) 204 205 detachAllAttrNodesFromElement(); 206 207 #if ENABLE(SVG) 208 if (hasPendingResources()) { 209 document()->accessSVGExtensions()->removeElementFromPendingResources(this); 210 ASSERT(!hasPendingResources()); 211 } 212 #endif 205 213 } 206 214 … … 1127 1135 void Element::removedFrom(ContainerNode* insertionPoint) 1128 1136 { 1137 #if ENABLE(SVG) 1138 bool wasInDocument = insertionPoint->document(); 1139 #endif 1140 1129 1141 #if ENABLE(DIALOG_ELEMENT) 1130 1142 setIsInTopLayer(false); … … 1158 1170 1159 1171 ContainerNode::removedFrom(insertionPoint); 1172 #if ENABLE(SVG) 1173 if (wasInDocument && hasPendingResources()) 1174 document()->accessSVGExtensions()->removeElementFromPendingResources(this); 1175 #endif 1160 1176 } 1161 1177 … … 2716 2732 } 2717 2733 2734 #if ENABLE(SVG) 2735 bool Element::hasPendingResources() const 2736 { 2737 return hasRareData() && elementRareData()->hasPendingResources(); 2738 } 2739 2740 void Element::setHasPendingResources() 2741 { 2742 ensureElementRareData()->setHasPendingResources(true); 2743 } 2744 2745 void Element::clearHasPendingResources() 2746 { 2747 ensureElementRareData()->setHasPendingResources(false); 2748 } 2749 #endif 2750 2718 2751 } // namespace WebCore -
trunk/Source/WebCore/dom/Element.h
r138784 r138823 430 430 #if ENABLE(SVG) 431 431 virtual bool childShouldCreateRenderer(const NodeRenderingContext&) const; 432 bool hasPendingResources() const; 433 void setHasPendingResources(); 434 void clearHasPendingResources(); 435 virtual void buildPendingResource() { }; 432 436 #endif 433 437 -
trunk/Source/WebCore/dom/ElementRareData.h
r138784 r138823 120 120 void setSavedLayerScrollOffset(IntSize size) { m_savedLayerScrollOffset = size; } 121 121 122 #if ENABLE(SVG) 123 bool hasPendingResources() const { return m_hasPendingResources; } 124 void setHasPendingResources(bool has) { m_hasPendingResources = has; } 125 #endif 126 122 127 private: 123 128 // Many fields are in NodeRareData for better packing. -
trunk/Source/WebCore/dom/NodeRareData.h
r138811 r138823 261 261 , m_isInTopLayer(false) 262 262 #endif 263 #if ENABLE(SVG) 264 , m_hasPendingResources(false) 265 #endif 263 266 , m_childrenAffectedByHover(false) 264 267 , m_childrenAffectedByActive(false) … … 386 389 #if ENABLE(DIALOG_ELEMENT) 387 390 bool m_isInTopLayer : 1; 391 #endif 392 #if ENABLE(SVG) 393 bool m_hasPendingResources : 1; 388 394 #endif 389 395 bool m_childrenAffectedByHover : 1; -
trunk/Source/WebCore/platform/graphics/texmap/TextureMapperImageBuffer.cpp
r137555 r138823 171 171 renderer->setSourceImageRect(FloatRect(FloatPoint::zero(), contentTexture.size())); 172 172 173 // The document parameter is only needed for CSS shaders.174 renderer->build(0 /* document*/, filters);173 // The renderer parameter is only needed for CSS shaders and reference filters. 174 renderer->build(0 /*renderer */, filters); 175 175 renderer->allocateBackingStoreIfNeeded(); 176 176 GraphicsContext* context = renderer->inputContext(); -
trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp
r138250 r138823 89 89 static PassRefPtr<FECustomFilter> createCustomFilterEffect(Filter* filter, Document* document, ValidatedCustomFilterOperation* operation) 90 90 { 91 if (!document) 92 return 0; 93 91 94 CustomFilterGlobalContext* globalContext = document->renderView()->customFilterGlobalContext(); 92 95 globalContext->prepareContextIfNeeded(document->view()->hostWindow()); … … 123 126 } 124 127 125 PassRefPtr<FilterEffect> FilterEffectRenderer::buildReferenceFilter( Document* document, PassRefPtr<FilterEffect> previousEffect, ReferenceFilterOperation* filterOperation)128 PassRefPtr<FilterEffect> FilterEffectRenderer::buildReferenceFilter(RenderObject* renderer, PassRefPtr<FilterEffect> previousEffect, ReferenceFilterOperation* filterOperation) 126 129 { 127 130 #if ENABLE(SVG) 131 if (!renderer) 132 return 0; 133 134 Document* document = renderer->document(); 135 ASSERT(document); 136 128 137 CachedSVGDocumentReference* cachedSVGDocumentReference = filterOperation->cachedSVGDocumentReference(); 129 138 CachedSVGDocument* cachedSVGDocument = cachedSVGDocumentReference ? cachedSVGDocumentReference->document() : 0; … … 138 147 139 148 Element* filter = document->getElementById(filterOperation->fragment()); 140 if (!filter) 149 if (!filter) { 150 // Although we did not find the referenced filter, it might exist later 151 // in the document 152 document->accessSVGExtensions()->addPendingResource(filterOperation->fragment(), toElement(renderer->node())); 141 153 return 0; 154 } 142 155 143 156 RefPtr<FilterEffect> effect; … … 176 189 } 177 190 178 bool FilterEffectRenderer::build(Document* document, const FilterOperations& operations) 179 { 180 #if !ENABLE(CSS_SHADERS) || !USE(3D_GRAPHICS) 181 UNUSED_PARAM(document); 182 #endif 183 191 bool FilterEffectRenderer::build(RenderObject* renderer, const FilterOperations& operations) 192 { 184 193 #if ENABLE(CSS_SHADERS) 185 194 m_hasCustomShaderFilter = false; … … 201 210 case FilterOperation::REFERENCE: { 202 211 ReferenceFilterOperation* referenceOperation = static_cast<ReferenceFilterOperation*>(filterOperation); 203 effect = buildReferenceFilter( document, previousEffect, referenceOperation);212 effect = buildReferenceFilter(renderer, previousEffect, referenceOperation); 204 213 referenceOperation->setFilterEffect(effect); 205 214 break; … … 344 353 case FilterOperation::VALIDATED_CUSTOM: { 345 354 ValidatedCustomFilterOperation* customFilterOperation = static_cast<ValidatedCustomFilterOperation*>(filterOperation); 355 Document* document = renderer ? renderer->document() : 0; 346 356 effect = createCustomFilterEffect(this, document, customFilterOperation); 347 357 if (effect) -
trunk/Source/WebCore/rendering/FilterEffectRenderer.h
r137463 r138823 102 102 ImageBuffer* output() const { return lastEffect()->asImageBuffer(); } 103 103 104 bool build( Document*, const FilterOperations&);105 PassRefPtr<FilterEffect> buildReferenceFilter( Document*, PassRefPtr<FilterEffect> previousEffect, ReferenceFilterOperation*);104 bool build(RenderObject* renderer, const FilterOperations&); 105 PassRefPtr<FilterEffect> buildReferenceFilter(RenderObject* renderer, PassRefPtr<FilterEffect> previousEffect, ReferenceFilterOperation*); 106 106 bool updateBackingStoreRect(const FloatRect& filterRect); 107 107 void allocateBackingStoreIfNeeded(); -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r138809 r138823 5749 5749 // If the filter fails to build, remove it from the layer. It will still attempt to 5750 5750 // go through regular processing (e.g. compositing), but never apply anything. 5751 if (!filterInfo->renderer()->build(renderer() ->document(), computeFilterOperations(renderer()->style())))5751 if (!filterInfo->renderer()->build(renderer(), computeFilterOperations(renderer()->style()))) 5752 5752 filterInfo->setRenderer(0); 5753 5753 } -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
r137463 r138823 185 185 for (SVGDocumentExtensions::SVGPendingElements::const_iterator it = clients->begin(); it != end; ++it) { 186 186 ASSERT((*it)->hasPendingResources()); 187 (*it)->clearHasPendingResourcesIfPossible();187 extensions->clearHasPendingResourcesIfPossible(*it); 188 188 RenderObject* renderer = (*it)->renderer(); 189 189 if (!renderer) -
trunk/Source/WebCore/rendering/svg/SVGResourcesCache.cpp
r137463 r138823 126 126 } 127 127 128 static inline bool rendererCanHaveResources(RenderObject* renderer) 129 { 130 ASSERT(renderer); 131 return renderer->node() && renderer->node()->isSVGElement() && !renderer->isSVGInlineText(); 132 } 133 128 134 void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifference diff, const RenderStyle* newStyle) 129 135 { … … 139 145 // FIXME: Avoid passing in a useless StyleDifference, but instead compare oldStyle/newStyle to see which resources changed 140 146 // to be able to selectively rebuild individual resources, instead of all of them. 141 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 142 cache->removeResourcesFromRenderObject(renderer); 143 cache->addResourcesFromRenderObject(renderer, newStyle); 147 if (rendererCanHaveResources(renderer)) { 148 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); 149 cache->removeResourcesFromRenderObject(renderer); 150 cache->addResourcesFromRenderObject(renderer, newStyle); 151 } 144 152 145 153 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(); 154 155 if (renderer->node() && !renderer->node()->isSVGElement()) 156 renderer->node()->setNeedsStyleRecalc(SyntheticStyleChange); 153 157 } 154 158 … … 203 207 // Mark users of destroyed resources as pending resolution based on the id of the old resource. 204 208 Element* resourceElement = toElement(resource->node()); 205 SVGStyledElement* clientElement = toSVGStyledElement(it->key->node());209 Element* clientElement = toElement(it->key->node()); 206 210 SVGDocumentExtensions* extensions = clientElement->document()->accessSVGExtensions(); 207 211 -
trunk/Source/WebCore/svg/SVGDocumentExtensions.cpp
r137509 r138823 149 149 } 150 150 151 void SVGDocumentExtensions::addPendingResource(const AtomicString& id, SVGElement* element)151 void SVGDocumentExtensions::addPendingResource(const AtomicString& id, Element* element) 152 152 { 153 153 ASSERT(element); … … 176 176 } 177 177 178 bool SVGDocumentExtensions::isElementPendingResources( SVGElement* element) const178 bool SVGDocumentExtensions::isElementPendingResources(Element* element) const 179 179 { 180 180 // This algorithm takes time proportional to the number of pending resources and need not. … … 194 194 } 195 195 196 bool SVGDocumentExtensions::isElementPendingResource( SVGElement* element, const AtomicString& id) const196 bool SVGDocumentExtensions::isElementPendingResource(Element* element, const AtomicString& id) const 197 197 { 198 198 ASSERT(element); … … 204 204 } 205 205 206 void SVGDocumentExtensions::removeElementFromPendingResources(SVGElement* element) 206 void SVGDocumentExtensions::clearHasPendingResourcesIfPossible(Element* element) 207 { 208 if (!isElementPendingResources(element)) 209 element->clearHasPendingResources(); 210 } 211 212 void SVGDocumentExtensions::removeElementFromPendingResources(Element* element) 207 213 { 208 214 ASSERT(element); … … 222 228 } 223 229 224 element->clearHasPendingResourcesIfPossible();230 clearHasPendingResourcesIfPossible(element); 225 231 226 232 // We use the removePendingResource function here because it deals with set lifetime correctly. … … 275 281 } 276 282 277 SVGElement* SVGDocumentExtensions::removeElementFromPendingResourcesForRemoval(const AtomicString& id)283 Element* SVGDocumentExtensions::removeElementFromPendingResourcesForRemoval(const AtomicString& id) 278 284 { 279 285 if (id.isEmpty()) … … 285 291 286 292 SVGPendingElements::iterator firstElement = resourceSet->begin(); 287 SVGElement* element = *firstElement;293 Element* element = *firstElement; 288 294 289 295 resourceSet->remove(firstElement); -
trunk/Source/WebCore/svg/SVGDocumentExtensions.h
r137509 r138823 41 41 class SVGSMILElement; 42 42 class SVGSVGElement; 43 class Element; 43 44 44 45 class SVGDocumentExtensions { 45 46 WTF_MAKE_NONCOPYABLE(SVGDocumentExtensions); WTF_MAKE_FAST_ALLOCATED; 46 47 public: 47 typedef HashSet< SVGElement*> SVGPendingElements;48 typedef HashSet<Element*> SVGPendingElements; 48 49 SVGDocumentExtensions(Document*); 49 50 ~SVGDocumentExtensions(); … … 93 94 // This HashMap contains a list of pending resources. Pending resources, are such 94 95 // which are referenced by any object in the SVG document, but do NOT exist yet. 95 // For instance, dynamically buil tgradients / patterns / clippers...96 void addPendingResource(const AtomicString& id, SVGElement*);96 // For instance, dynamically build gradients / patterns / clippers... 97 void addPendingResource(const AtomicString& id, Element*); 97 98 bool hasPendingResource(const AtomicString& id) const; 98 bool isElementPendingResources(SVGElement*) const; 99 bool isElementPendingResource(SVGElement*, const AtomicString& id) const; 100 void removeElementFromPendingResources(SVGElement*); 99 bool isElementPendingResources(Element*) const; 100 bool isElementPendingResource(Element*, const AtomicString& id) const; 101 void clearHasPendingResourcesIfPossible(Element*); 102 void removeElementFromPendingResources(Element*); 101 103 PassOwnPtr<SVGPendingElements> removePendingResource(const AtomicString& id); 102 104 103 105 // The following two functions are used for scheduling a pending resource to be removed. 104 106 void markPendingResourcesForRemoval(const AtomicString&); 105 SVGElement* removeElementFromPendingResourcesForRemoval(const AtomicString&);107 Element* removeElementFromPendingResourcesForRemoval(const AtomicString&); 106 108 107 109 private: -
trunk/Source/WebCore/svg/SVGElement.cpp
r138296 r138823 66 66 else { 67 67 ASSERT(document()); 68 if (hasPendingResources())69 document()->accessSVGExtensions()->removeElementFromPendingResources(this);70 ASSERT(!hasPendingResources());71 68 SVGElementRareData::SVGElementRareDataMap& rareDataMap = SVGElementRareData::rareDataMap(); 72 69 SVGElementRareData::SVGElementRareDataMap::iterator it = rareDataMap.find(this); … … 186 183 document()->accessSVGExtensions()->rebuildAllElementReferencesForTarget(this); 187 184 document()->accessSVGExtensions()->removeAllElementReferencesForTarget(this); 188 document()->accessSVGExtensions()->removeElementFromPendingResources(this);189 185 } 190 186 } … … 545 541 if (name != HTMLNames::styleAttr) 546 542 svgAttributeChanged(name); 547 }548 549 bool SVGElement::hasPendingResources() const550 {551 return hasSVGRareData() && svgRareData()->hasPendingResources();552 }553 554 void SVGElement::setHasPendingResources()555 {556 ensureSVGRareData()->setHasPendingResources(true);557 }558 559 void SVGElement::clearHasPendingResourcesIfPossible()560 {561 if (!document()->accessSVGExtensions()->isElementPendingResources(this))562 ensureSVGRareData()->setHasPendingResources(false);563 543 } 564 544 -
trunk/Source/WebCore/svg/SVGElement.h
r138296 r138823 70 70 71 71 virtual void svgAttributeChanged(const QualifiedName&) { } 72 73 bool hasPendingResources() const;74 void setHasPendingResources();75 void clearHasPendingResourcesIfPossible();76 virtual void buildPendingResource() { }77 72 78 73 virtual void animatedPropertyTypeForAttribute(const QualifiedName&, Vector<AnimatedPropertyType>&); -
trunk/Source/WebCore/svg/SVGElementRareData.h
r137463 r138823 42 42 , m_correspondingElement(0) 43 43 , m_instancesUpdatesBlocked(false) 44 , m_hasPendingResources(false)45 44 , m_useOverrideComputedStyle(false) 46 45 , m_needsOverrideComputedStyleUpdate(false) … … 66 65 bool instanceUpdatesBlocked() const { return m_instancesUpdatesBlocked; } 67 66 void setInstanceUpdatesBlocked(bool value) { m_instancesUpdatesBlocked = value; } 68 69 bool hasPendingResources() const { return m_hasPendingResources; }70 void setHasPendingResources(bool value) { m_hasPendingResources = value; }71 67 72 68 SVGCursorElement* cursorElement() const { return m_cursorElement; } … … 116 112 SVGElement* m_correspondingElement; 117 113 bool m_instancesUpdatesBlocked : 1; 118 bool m_hasPendingResources : 1;119 114 bool m_useOverrideComputedStyle : 1; 120 115 bool m_needsOverrideComputedStyleUpdate : 1; -
trunk/Source/WebCore/svg/SVGStyledElement.cpp
r137463 r138823 369 369 370 370 // Rebuild pending resources for each client of a pending resource that is being removed. 371 while ( SVGElement* clientElement = extensions->removeElementFromPendingResourcesForRemoval(resourceId)) {371 while (Element* clientElement = extensions->removeElementFromPendingResourcesForRemoval(resourceId)) { 372 372 ASSERT(clientElement->hasPendingResources()); 373 373 if (clientElement->hasPendingResources()) { 374 374 clientElement->buildPendingResource(); 375 clientElement->clearHasPendingResourcesIfPossible();375 extensions->clearHasPendingResourcesIfPossible(clientElement); 376 376 } 377 377 }
Note: See TracChangeset
for help on using the changeset viewer.