Changeset 57659 in webkit


Ignore:
Timestamp:
Apr 15, 2010 11:32:31 AM (14 years ago)
Author:
Nikolas Zimmermann
Message:

2010-04-15 Nikolas Zimmermann <nzimmermann@rim.com>

Reviewed by Beth Dakin.

RenderSVGResource <-> id mapping should be cached
https://bugs.webkit.org/show_bug.cgi?id=37575

Test: svg/custom/clip-path-id-changes.svg

  • rendering/RenderSVGResource.h: (WebCore::RenderSVGResource::RenderSVGResource): (WebCore::RenderSVGResource::~RenderSVGResource): (WebCore::RenderSVGResource::idChanged): (WebCore::getRenderSVGResourceById):
  • svg/SVGDocumentExtensions.cpp: (WebCore::SVGDocumentExtensions::addResource): (WebCore::SVGDocumentExtensions::removeResource): (WebCore::SVGDocumentExtensions::resourceById):
  • svg/SVGDocumentExtensions.h:
  • svg/SVGStyledElement.cpp: (WebCore::SVGStyledElement::svgAttributeChanged):

2010-04-15 Nikolas Zimmermann <nzimmermann@rim.com>

Reviewed by Beth Dakin.

RenderSVGResource <-> id mapping should be cached
https://bugs.webkit.org/show_bug.cgi?id=37575

  • platform/mac/svg/custom/clip-path-id-changes-expected.checksum: Added.
  • platform/mac/svg/custom/clip-path-id-changes-expected.png: Added.
  • platform/mac/svg/custom/clip-path-id-changes-expected.txt: Added.
  • svg/custom/clip-path-id-changes.svg: Added.
Location:
trunk
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r57647 r57659  
     12010-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
    1132010-04-15  Anton Muhin   <antonm@chromium.org>
    214
  • trunk/WebCore/ChangeLog

    r57658 r57659  
     12010-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
    1232010-04-15  Justin Schuh  <jschuh@chromium.org>
    224
  • trunk/WebCore/rendering/RenderSVGResource.h

    r56693 r57659  
    3636class RenderSVGResource : public RenderSVGHiddenContainer {
    3737public:
    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    }
    3982
    4083    template<class Renderer>
     
    58101
    59102    virtual RenderSVGResourceType resourceType() const = 0;
     103
     104private:
     105    AtomicString m_id;
    60106};
    61107
     
    66112        return 0;
    67113
    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>();
    71116
    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;
    81118}
    82119
  • trunk/WebCore/svg/SVGDocumentExtensions.cpp

    r55066 r57659  
    6161{
    6262    m_timeContainers.remove(element);
     63}
     64
     65void 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
     76void 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
     85RenderSVGResource* SVGDocumentExtensions::resourceById(const String& id) const
     86{
     87    if (id.isEmpty())
     88        return 0;
     89
     90    return m_resources.get(id);
    6391}
    6492
  • trunk/WebCore/svg/SVGDocumentExtensions.h

    r55066 r57659  
    3636
    3737class Document;
     38class RenderSVGResource;
    3839class String;
    3940class SVGStyledElement;
     
    4849    void addTimeContainer(SVGSVGElement*);
    4950    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
    5156    void startAnimations();
    5257    void pauseAnimations();
     
    6065    Document* m_doc; // weak reference
    6166    HashSet<SVGSVGElement*> m_timeContainers; // For SVG 1.2 support this will need to be made more general.
     67    HashMap<String, RenderSVGResource*> m_resources;
    6268    HashMap<String, HashSet<SVGStyledElement*>*> m_pendingResources;
    6369
  • trunk/WebCore/svg/SVGStyledElement.cpp

    r57575 r57659  
    200200        classAttributeChanged(className());
    201201
     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
    202210    // If we're the child of a resource element, be sure to invalidate it.
    203211    invalidateResourcesInAncestorChain();
Note: See TracChangeset for help on using the changeset viewer.