Home | History | Annotate | Download | only in svg
      1 /*
      2  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Library General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * Library General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU Library General Public License
     15  * along with this library; see the file COPYING.LIB.  If not, write to
     16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17  * Boston, MA 02110-1301, USA.
     18  */
     19 
     20 #ifndef SVGElementRareData_h
     21 #define SVGElementRareData_h
     22 
     23 #include "core/css/StylePropertySet.h"
     24 #include "core/css/resolver/StyleResolver.h"
     25 #include "wtf/HashSet.h"
     26 #include "wtf/Noncopyable.h"
     27 #include "wtf/StdLibExtras.h"
     28 
     29 namespace WebCore {
     30 
     31 class CSSCursorImageValue;
     32 class SVGCursorElement;
     33 class SVGElement;
     34 
     35 class SVGElementRareData : public NoBaseWillBeGarbageCollectedFinalized<SVGElementRareData> {
     36     WTF_MAKE_NONCOPYABLE(SVGElementRareData); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
     37 public:
     38     SVGElementRareData(SVGElement* owner)
     39 #if ENABLE(OILPAN)
     40         : m_owner(owner)
     41         , m_cursorElement(nullptr)
     42 #else
     43         : m_cursorElement(nullptr)
     44 #endif
     45         , m_cursorImageValue(nullptr)
     46         , m_correspondingElement(nullptr)
     47         , m_instancesUpdatesBlocked(false)
     48         , m_useOverrideComputedStyle(false)
     49         , m_needsOverrideComputedStyleUpdate(false)
     50     {
     51     }
     52 
     53     WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >& elementInstances() { return m_elementInstances; }
     54     const WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >& elementInstances() const { return m_elementInstances; }
     55 
     56     bool instanceUpdatesBlocked() const { return m_instancesUpdatesBlocked; }
     57     void setInstanceUpdatesBlocked(bool value) { m_instancesUpdatesBlocked = value; }
     58 
     59     SVGCursorElement* cursorElement() const { return m_cursorElement; }
     60     void setCursorElement(SVGCursorElement* cursorElement) { m_cursorElement = cursorElement; }
     61 
     62     SVGElement* correspondingElement() { return m_correspondingElement.get(); }
     63     void setCorrespondingElement(SVGElement* correspondingElement) { m_correspondingElement = correspondingElement; }
     64 
     65     CSSCursorImageValue* cursorImageValue() const { return m_cursorImageValue; }
     66     void setCursorImageValue(CSSCursorImageValue* cursorImageValue) { m_cursorImageValue = cursorImageValue; }
     67 
     68     MutableStylePropertySet* animatedSMILStyleProperties() const { return m_animatedSMILStyleProperties.get(); }
     69     MutableStylePropertySet* ensureAnimatedSMILStyleProperties()
     70     {
     71         if (!m_animatedSMILStyleProperties)
     72             m_animatedSMILStyleProperties = MutableStylePropertySet::create(SVGAttributeMode);
     73         return m_animatedSMILStyleProperties.get();
     74     }
     75 
     76     RenderStyle* overrideComputedStyle(Element* element, RenderStyle* parentStyle)
     77     {
     78         ASSERT(element);
     79         if (!m_useOverrideComputedStyle)
     80             return 0;
     81         if (!m_overrideComputedStyle || m_needsOverrideComputedStyleUpdate) {
     82             // The style computed here contains no CSS Animations/Transitions or SMIL induced rules - this is needed to compute the "base value" for the SMIL animation sandwhich model.
     83             m_overrideComputedStyle = element->document().ensureStyleResolver().styleForElement(element, parentStyle, DisallowStyleSharing, MatchAllRulesExcludingSMIL);
     84             m_needsOverrideComputedStyleUpdate = false;
     85         }
     86         ASSERT(m_overrideComputedStyle);
     87         return m_overrideComputedStyle.get();
     88     }
     89 
     90     bool useOverrideComputedStyle() const { return m_useOverrideComputedStyle; }
     91     void setUseOverrideComputedStyle(bool value) { m_useOverrideComputedStyle = value; }
     92     void setNeedsOverrideComputedStyleUpdate() { m_needsOverrideComputedStyleUpdate = true; }
     93 
     94     void trace(Visitor* visitor)
     95     {
     96 #if ENABLE(OILPAN)
     97         visitor->trace(m_animatedSMILStyleProperties);
     98         visitor->trace(m_elementInstances);
     99         visitor->trace(m_correspondingElement);
    100         visitor->trace(m_owner);
    101         visitor->registerWeakMembers<SVGElementRareData, &SVGElementRareData::processWeakMembers>(this);
    102 #endif
    103     }
    104 
    105     void processWeakMembers(Visitor* visitor)
    106     {
    107 #if ENABLE(OILPAN)
    108         ASSERT(m_owner);
    109         if (!visitor->isAlive(m_cursorElement))
    110             m_cursorElement = nullptr;
    111 
    112         if (!visitor->isAlive(m_cursorImageValue)) {
    113             // The owning SVGElement is still alive and if it is pointing to an SVGCursorElement
    114             // we unregister it when the CSSCursorImageValue dies.
    115             if (m_cursorElement) {
    116                 m_cursorElement->removeReferencedElement(m_owner);
    117                 m_cursorElement = nullptr;
    118             }
    119             m_cursorImageValue = nullptr;
    120         }
    121         ASSERT(!m_cursorElement || visitor->isAlive(m_cursorElement));
    122         ASSERT(!m_cursorImageValue || visitor->isAlive(m_cursorImageValue));
    123 #endif
    124     }
    125 
    126 private:
    127 #if ENABLE(OILPAN)
    128     Member<SVGElement> m_owner;
    129 #endif
    130     WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> > m_elementInstances;
    131     RawPtrWillBeWeakMember<SVGCursorElement> m_cursorElement;
    132     RawPtrWillBeWeakMember<CSSCursorImageValue> m_cursorImageValue;
    133     RefPtrWillBeMember<SVGElement> m_correspondingElement;
    134     bool m_instancesUpdatesBlocked : 1;
    135     bool m_useOverrideComputedStyle : 1;
    136     bool m_needsOverrideComputedStyleUpdate : 1;
    137     RefPtrWillBeMember<MutableStylePropertySet> m_animatedSMILStyleProperties;
    138     RefPtr<RenderStyle> m_overrideComputedStyle;
    139 };
    140 
    141 }
    142 
    143 #endif
    144