ASSERTs in RenderInline::layout()
[WebKit-https.git] / Source / WebCore / svg / SVGElement.h
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4  * Copyright (C) 2009 Apple Inc. All rights reserved.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #ifndef SVGElement_h
23 #define SVGElement_h
24
25 #if ENABLE(SVG)
26 #include "SVGLocatable.h"
27 #include "SVGParsingError.h"
28 #include "SVGPropertyInfo.h"
29 #include "StyledElement.h"
30 #include <wtf/HashMap.h>
31
32 namespace WebCore {
33
34 class AffineTransform;
35 class CSSCursorImageValue;
36 class Document;
37 class SVGAttributeToPropertyMap;
38 class SVGCursorElement;
39 class SVGDocumentExtensions;
40 class SVGElementInstance;
41 class SVGElementRareData;
42 class SVGSVGElement;
43
44 class SVGElement : public StyledElement {
45 public:
46     static PassRefPtr<SVGElement> create(const QualifiedName&, Document*);
47     virtual ~SVGElement();
48
49     bool isOutermostSVGSVGElement() const;
50
51     String xmlbase() const;
52     void setXmlbase(const String&, ExceptionCode&);
53
54     SVGSVGElement* ownerSVGElement() const;
55     SVGElement* viewportElement() const;
56
57     SVGDocumentExtensions* accessDocumentSVGExtensions();
58
59     virtual bool isStyled() const { return false; }
60     virtual bool isStyledTransformable() const { return false; }
61     virtual bool isStyledLocatable() const { return false; }
62     virtual bool isSVG() const { return false; }
63     virtual bool isFilterEffect() const { return false; }
64     virtual bool isGradientStop() const { return false; }
65     virtual bool isTextContent() const { return false; }
66
67     // For SVGTests
68     virtual bool isValid() const { return true; }
69
70     virtual void svgAttributeChanged(const QualifiedName&) { }
71
72     virtual void animatedPropertyTypeForAttribute(const QualifiedName&, Vector<AnimatedPropertyType>&);
73
74     void sendSVGLoadEventIfPossible(bool sendParentLoadEvents = false);
75
76     virtual AffineTransform* supplementalTransform() { return 0; }
77
78     void invalidateSVGAttributes() { clearAreSVGAttributesValid(); }
79
80     const HashSet<SVGElementInstance*>& instancesForElement() const;
81
82     bool boundingBox(FloatRect&, SVGLocatable::StyleUpdateStrategy = SVGLocatable::AllowStyleUpdate);
83
84     void setCursorElement(SVGCursorElement*);
85     void cursorElementRemoved();
86     void setCursorImageValue(CSSCursorImageValue*);
87     void cursorImageValueRemoved();
88
89     SVGElement* correspondingElement();
90     void setCorrespondingElement(SVGElement*);
91
92     virtual void updateAnimatedSVGAttribute(const QualifiedName&) const;
93  
94     virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE;
95
96     static void synchronizeRequiredFeatures(void* contextElement);
97     static void synchronizeRequiredExtensions(void* contextElement);
98     static void synchronizeSystemLanguage(void* contextElement);
99
100     virtual void synchronizeRequiredFeatures() { }
101     virtual void synchronizeRequiredExtensions() { }
102     virtual void synchronizeSystemLanguage() { }
103
104     virtual SVGAttributeToPropertyMap& localAttributeToPropertyMap();
105
106 #ifndef NDEBUG
107     static bool isAnimatableAttribute(const QualifiedName&);
108 #endif
109
110     StylePropertySet* animatedSMILStyleProperties() const;
111     StylePropertySet* ensureAnimatedSMILStyleProperties();
112     void setUseOverrideComputedStyle(bool);
113
114     virtual bool haveLoadedRequiredResources();
115
116     virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) OVERRIDE;
117     virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) OVERRIDE;
118
119 protected:
120     SVGElement(const QualifiedName&, Document*, ConstructionType = CreateSVGElement);
121
122     virtual void parseAttribute(const Attribute&) OVERRIDE;
123
124     virtual void finishParsingChildren();
125     virtual void attributeChanged(const Attribute&) OVERRIDE;
126     virtual bool childShouldCreateRenderer(const NodeRenderingContext&) const OVERRIDE;
127     
128     virtual void removedFrom(Node*) OVERRIDE;
129
130     SVGElementRareData* rareSVGData() const;
131     SVGElementRareData* ensureRareSVGData();
132
133     void reportAttributeParsingError(SVGParsingError, const Attribute&);
134
135 private:
136     friend class SVGElementInstance;
137
138     RenderStyle* computedStyle(PseudoId = NOPSEUDO);
139     virtual RenderStyle* virtualComputedStyle(PseudoId pseudoElementSpecifier = NOPSEUDO) { return computedStyle(pseudoElementSpecifier); }
140     virtual bool willRecalcStyle(StyleChange);
141
142     virtual bool rendererIsNeeded(const NodeRenderingContext&) { return false; }
143
144     virtual bool isSupported(StringImpl* feature, StringImpl* version) const;
145
146     void mapInstanceToElement(SVGElementInstance*);
147     void removeInstanceMapping(SVGElementInstance*);
148
149 };
150
151 struct SVGAttributeHashTranslator {
152     static unsigned hash(QualifiedName key)
153     {
154         key.setPrefix(nullAtom);
155         return DefaultHash<QualifiedName>::Hash::hash(key);
156     }
157     static bool equal(QualifiedName a, QualifiedName b) { return a.matches(b); }
158 };
159
160 inline SVGElement* toSVGElement(Element* element)
161 {
162     ASSERT(!element || element->isSVGElement());
163     return static_cast<SVGElement*>(element);
164 }
165
166 }
167
168 #endif
169 #endif