Devirtualize CSSValue.
[WebKit-https.git] / Source / WebCore / css / CSSValue.h
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef CSSValue_h
22 #define CSSValue_h
23
24 #include "KURLHash.h"
25 #include <wtf/ListHashSet.h>
26 #include <wtf/RefCounted.h>
27 #include <wtf/RefPtr.h>
28
29 namespace WebCore {
30
31 class CSSStyleSheet;
32
33 typedef int ExceptionCode;
34
35 class CSSValue : public RefCounted<CSSValue> {
36 public:
37     enum Type {
38         CSS_INHERIT = 0,
39         CSS_PRIMITIVE_VALUE = 1,
40         CSS_VALUE_LIST = 2,
41         CSS_CUSTOM = 3,
42         CSS_INITIAL = 4
43
44     };
45
46     // Override RefCounted's deref() to ensure operator delete is called on
47     // the appropriate subclass type.
48     void deref()
49     {
50         if (derefBase())
51             destroy();
52     }
53
54     Type cssValueType() const;
55
56     String cssText() const;
57     void setCssText(const String&, ExceptionCode&) { } // FIXME: Not implemented.
58
59     bool isMutableValue() const { return m_isMutable; }
60     bool isPrimitiveValue() const { return m_isPrimitive; }
61     bool isValueList() const { return m_isList; }
62     bool isInitialValue() const { return m_isInitial; }
63     bool isInheritedValue() const { return m_isInherited; }
64
65     bool isBorderImageValue() const { return m_classType == BorderImageClass; }
66     bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
67     bool isCursorImageValue() const { return m_classType == CursorImageClass; }
68     bool isFontFamilyValue() const { return m_classType == FontFamilyClass; }
69     bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
70     bool isFontValue() const { return m_classType == FontClass; }
71     bool isImageGeneratorValue() const { return m_classType == CanvasClass || m_classType == CrossfadeClass || m_classType == LinearGradientClass || m_classType == RadialGradientClass; }
72     bool isImageValue() const { return m_classType == ImageClass || m_classType == CursorImageClass; }
73     bool isImplicitInitialValue() const { return m_classType == ImplicitInitialClass; }
74     bool isReflectValue() const { return m_classType == ReflectClass; }
75     bool isShadowValue() const { return m_classType == ShadowClass; }
76     bool isTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass || m_classType == LinearTimingFunctionClass || m_classType == StepsTimingFunctionClass; }
77     bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; }
78     bool isCSSLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
79 #if ENABLE(CSS3_FLEXBOX)
80     bool isFlexValue() const { return m_classType == FlexClass; }
81 #endif
82 #if ENABLE(CSS_FILTERS)
83     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
84 #endif
85 #if ENABLE(SVG)
86     bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
87     bool isSVGPaint() const { return m_classType == SVGPaintClass; }
88 #endif
89
90     void addSubresourceStyleURLs(ListHashSet<KURL>&, const CSSStyleSheet*);
91
92 protected:
93
94     enum ClassType {
95         AspectRatioClass,
96         BorderImageClass,
97         BorderImageSliceClass,
98         CanvasClass,
99         CursorImageClass,
100         FontFamilyClass,
101         FontFeatureClass,
102         FontClass,
103         FontFaceSrcClass,
104         FunctionClass,
105         LinearGradientClass,
106         RadialGradientClass,
107         CrossfadeClass,
108         ImageClass,
109         InheritedClass,
110         InitialClass,
111         ImplicitInitialClass,
112         PrimitiveClass,
113         ReflectClass,
114         ShadowClass,
115         LinearTimingFunctionClass,
116         CubicBezierTimingFunctionClass,
117         StepsTimingFunctionClass,
118         UnicodeRangeClass,
119         ValueListClass,
120         WebKitCSSTransformClass,
121         LineBoxContainClass,
122 #if ENABLE(CSS3_FLEXBOX)
123         FlexClass,
124 #endif
125 #if ENABLE(CSS_FILTERS)
126         WebKitCSSFilterClass,
127 #endif
128 #if ENABLE(SVG)
129         SVGColorClass,
130         SVGPaintClass,
131 #endif
132     };
133
134     ClassType classType() const { return static_cast<ClassType>(m_classType); }
135
136     CSSValue(ClassType classType)
137         : m_classType(classType)
138         , m_isPrimitive(isPrimitiveType(classType))
139         , m_isMutable(isMutableType(classType))
140         , m_isList(isListType(classType))
141         , m_isInitial(isInitialType(classType))
142         , m_isInherited(isInheritedType(classType))
143     {
144     }
145
146     // NOTE: This class is non-virtual for memory and performance reasons.
147     // Don't go making it virtual again unless you know exactly what you're doing!
148
149     ~CSSValue() { }
150
151 private:
152     static bool isPrimitiveType(ClassType type)
153     {
154         return type == PrimitiveClass
155             || type == ImageClass
156             || type == CursorImageClass
157             || type == FontFamilyClass;
158     }
159
160     static bool isListType(ClassType type)
161     {
162         return type == ValueListClass
163 #if ENABLE(CSS_FILTERS)
164             || type == WebKitCSSFilterClass
165 #endif
166             || type == WebKitCSSTransformClass;
167     }
168
169     static bool isMutableType(ClassType type)
170     {
171 #if ENABLE(SVG)
172         return type == SVGColorClass
173             || type == SVGPaintClass;
174 #else
175         UNUSED_PARAM(type);
176         return false;
177 #endif
178     }
179
180     static bool isInheritedType(ClassType type)
181     {
182         return type == InheritedClass;
183     }
184
185     static bool isInitialType(ClassType type)
186     {
187         return type == InitialClass || type == ImplicitInitialClass;
188     }
189
190     void destroy();
191
192     // FIXME: This class is currently a little bloated, but that will change.
193     //        See <http://webkit.org/b/71666> for more information.
194     unsigned m_classType : 5; // ClassType
195     bool m_isPrimitive : 1;
196     bool m_isMutable : 1;
197     bool m_isList : 1;
198     bool m_isInitial : 1;
199     bool m_isInherited : 1;
200 };
201
202 } // namespace WebCore
203
204 #endif // CSSValue_h