Changeset 57659 in webkit
- Timestamp:
- Apr 15, 2010 11:32:31 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r57647 r57659 1 2010-04-15 Nikolas Zimmermann <nzimmermann@rim.com> 2 3 Reviewed by Beth Dakin. 4 5 RenderSVGResource <-> id mapping should be cached 6 https://bugs.webkit.org/show_bug.cgi?id=37575 7 8 * platform/mac/svg/custom/clip-path-id-changes-expected.checksum: Added. 9 * platform/mac/svg/custom/clip-path-id-changes-expected.png: Added. 10 * platform/mac/svg/custom/clip-path-id-changes-expected.txt: Added. 11 * svg/custom/clip-path-id-changes.svg: Added. 12 1 13 2010-04-15 Anton Muhin <antonm@chromium.org> 2 14 -
trunk/WebCore/ChangeLog
r57658 r57659 1 2010-04-15 Nikolas Zimmermann <nzimmermann@rim.com> 2 3 Reviewed by Beth Dakin. 4 5 RenderSVGResource <-> id mapping should be cached 6 https://bugs.webkit.org/show_bug.cgi?id=37575 7 8 Test: svg/custom/clip-path-id-changes.svg 9 10 * rendering/RenderSVGResource.h: 11 (WebCore::RenderSVGResource::RenderSVGResource): 12 (WebCore::RenderSVGResource::~RenderSVGResource): 13 (WebCore::RenderSVGResource::idChanged): 14 (WebCore::getRenderSVGResourceById): 15 * svg/SVGDocumentExtensions.cpp: 16 (WebCore::SVGDocumentExtensions::addResource): 17 (WebCore::SVGDocumentExtensions::removeResource): 18 (WebCore::SVGDocumentExtensions::resourceById): 19 * svg/SVGDocumentExtensions.h: 20 * svg/SVGStyledElement.cpp: 21 (WebCore::SVGStyledElement::svgAttributeChanged): 22 1 23 2010-04-15 Justin Schuh <jschuh@chromium.org> 2 24 -
trunk/WebCore/rendering/RenderSVGResource.h
r56693 r57659 36 36 class RenderSVGResource : public RenderSVGHiddenContainer { 37 37 public: 38 RenderSVGResource(SVGStyledElement* node) : RenderSVGHiddenContainer(node) { } 38 RenderSVGResource(SVGStyledElement* node) 39 : RenderSVGHiddenContainer(node) 40 , m_id(node->getIDAttribute()) 41 { 42 ASSERT(node->document()); 43 node->document()->accessSVGExtensions()->addResource(m_id, this); 44 } 45 46 virtual ~RenderSVGResource() 47 { 48 ASSERT(node()); 49 ASSERT(node()->document()); 50 node()->document()->accessSVGExtensions()->removeResource(m_id); 51 } 52 53 void idChanged() 54 { 55 ASSERT(node()); 56 ASSERT(node()->document()); 57 SVGDocumentExtensions* extensions = node()->document()->accessSVGExtensions(); 58 59 // Remove old id, that is guaranteed to be present in cache 60 extensions->removeResource(m_id); 61 62 m_id = static_cast<Element*>(node())->getIDAttribute(); 63 64 // It's possible that an element is referencing us with the new id, and has to be notified that we're existing now 65 if (extensions->isPendingResource(m_id)) { 66 OwnPtr<HashSet<SVGStyledElement*> > clients(extensions->removePendingResource(m_id)); 67 if (clients->isEmpty()) 68 return; 69 70 HashSet<SVGStyledElement*>::const_iterator it = clients->begin(); 71 const HashSet<SVGStyledElement*>::const_iterator end = clients->end(); 72 73 for (; it != end; ++it) { 74 if (RenderObject* renderer = (*it)->renderer()) 75 renderer->setNeedsLayout(true); 76 } 77 } 78 79 // Recache us with the new id 80 extensions->addResource(m_id, this); 81 } 39 82 40 83 template<class Renderer> … … 58 101 59 102 virtual RenderSVGResourceType resourceType() const = 0; 103 104 private: 105 AtomicString m_id; 60 106 }; 61 107 … … 66 112 return 0; 67 113 68 Element* element = document->getElementById(id); 69 if (!element || !element->isSVGElement()) 70 return 0; 114 if (RenderSVGResource* renderResource = document->accessSVGExtensions()->resourceById(id)) 115 return renderResource->cast<Renderer>(); 71 116 72 RenderObject* renderer = element->renderer(); 73 if (!renderer) 74 return 0; 75 76 RenderSVGResource* renderResource = renderer->toRenderSVGResource(); 77 if (!renderResource) 78 return 0; 79 80 return renderResource->cast<Renderer>(); 117 return 0; 81 118 } 82 119 -
trunk/WebCore/svg/SVGDocumentExtensions.cpp
r55066 r57659 61 61 { 62 62 m_timeContainers.remove(element); 63 } 64 65 void SVGDocumentExtensions::addResource(const String& id, RenderSVGResource* resource) 66 { 67 ASSERT(resource); 68 69 if (id.isEmpty()) 70 return; 71 72 // Replaces resource if already present, to handle potential id changes 73 m_resources.set(id, resource); 74 } 75 76 void SVGDocumentExtensions::removeResource(const String& id) 77 { 78 if (id.isEmpty()) 79 return; 80 81 ASSERT(m_resources.contains(id)); 82 m_resources.remove(id); 83 } 84 85 RenderSVGResource* SVGDocumentExtensions::resourceById(const String& id) const 86 { 87 if (id.isEmpty()) 88 return 0; 89 90 return m_resources.get(id); 63 91 } 64 92 -
trunk/WebCore/svg/SVGDocumentExtensions.h
r55066 r57659 36 36 37 37 class Document; 38 class RenderSVGResource; 38 39 class String; 39 40 class SVGStyledElement; … … 48 49 void addTimeContainer(SVGSVGElement*); 49 50 void removeTimeContainer(SVGSVGElement*); 50 51 52 void addResource(const String& id, RenderSVGResource*); 53 void removeResource(const String& id); 54 RenderSVGResource* resourceById(const String& id) const; 55 51 56 void startAnimations(); 52 57 void pauseAnimations(); … … 60 65 Document* m_doc; // weak reference 61 66 HashSet<SVGSVGElement*> m_timeContainers; // For SVG 1.2 support this will need to be made more general. 67 HashMap<String, RenderSVGResource*> m_resources; 62 68 HashMap<String, HashSet<SVGStyledElement*>*> m_pendingResources; 63 69 -
trunk/WebCore/svg/SVGStyledElement.cpp
r57575 r57659 200 200 classAttributeChanged(className()); 201 201 202 if (attrName == idAttributeName()) { 203 // Notify resources about id changes, this is important as we cache resources by id in SVGDocumentExtensions 204 if (renderer() && renderer()->isSVGResource()) { 205 RenderSVGResource* resource = renderer()->toRenderSVGResource(); 206 resource->idChanged(); 207 } 208 } 209 202 210 // If we're the child of a resource element, be sure to invalidate it. 203 211 invalidateResourcesInAncestorChain();
Note: See TracChangeset
for help on using the changeset viewer.