Remove CSS_FILTERS flag
[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 "ExceptionCode.h"
25 #include "URLHash.h"
26 #include <wtf/ListHashSet.h>
27 #include <wtf/RefCounted.h>
28 #include <wtf/RefPtr.h>
29
30 namespace WebCore {
31
32 class StyleSheetContents;
33     
34 // FIXME: The current CSSValue and subclasses should be turned into internal types (StyleValue).
35 // The few subtypes that are actually exposed in CSSOM can be seen in the cloneForCSSOM() function.
36 // They should be handled by separate wrapper classes.
37
38 // Please don't expose more CSSValue types to the web.
39 class CSSValue : public RefCounted<CSSValue> {
40 public:
41     enum Type {
42         CSS_INHERIT = 0,
43         CSS_PRIMITIVE_VALUE = 1,
44         CSS_VALUE_LIST = 2,
45         CSS_CUSTOM = 3,
46         CSS_INITIAL = 4
47
48     };
49
50     // Override RefCounted's deref() to ensure operator delete is called on
51     // the appropriate subclass type.
52     void deref()
53     {
54         if (derefBase())
55             destroy();
56     }
57
58     Type cssValueType() const;
59
60     String cssText() const;
61     void setCssText(const String&, ExceptionCode&) { } // FIXME: Not implemented.
62
63     bool isPrimitiveValue() const { return m_classType == PrimitiveClass; }
64     bool isValueList() const { return m_classType >= ValueListClass; }
65     
66     bool isBaseValueList() const { return m_classType == ValueListClass; }
67         
68
69     bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
70     bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
71     bool isCanvasValue() const { return m_classType == CanvasClass; }
72     bool isCrossfadeValue() const { return m_classType == CrossfadeClass; }
73     bool isCursorImageValue() const { return m_classType == CursorImageClass; }
74     bool isFunctionValue() const { return m_classType == FunctionClass; }
75     bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
76     bool isFontFaceSrcValue() const { return m_classType == FontFaceSrcClass; }
77     bool isFontValue() const { return m_classType == FontClass; }
78     bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; }
79     bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; }
80 #if ENABLE(CSS_IMAGE_SET)
81     bool isImageSetValue() const { return m_classType == ImageSetClass; }
82 #endif
83     bool isImageValue() const { return m_classType == ImageClass; }
84     bool isImplicitInitialValue() const;
85     bool isInheritedValue() const { return m_classType == InheritedClass; }
86     bool isInitialValue() const { return m_classType == InitialClass; }
87     bool isLinearGradientValue() const { return m_classType == LinearGradientClass; }
88     bool isRadialGradientValue() const { return m_classType == RadialGradientClass; }
89     bool isReflectValue() const { return m_classType == ReflectClass; }
90     bool isShadowValue() const { return m_classType == ShadowClass; }
91     bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
92     bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
93     bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; }
94     bool isLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
95     bool isCalcValue() const {return m_classType == CalculationClass; }
96     bool isFilterImageValue() const { return m_classType == FilterImageClass; }
97     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
98 #if ENABLE(CSS_GRID_LAYOUT)
99     bool isGridTemplateAreasValue() const { return m_classType == GridTemplateAreasClass; }
100     bool isGridLineNamesValue() const { return m_classType == GridLineNamesClass; }
101 #endif
102     bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
103     bool isSVGPaint() const { return m_classType == SVGPaintClass; }
104     bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; }
105
106     bool isCSSOMSafe() const { return m_isCSSOMSafe; }
107     bool isSubtypeExposedToCSSOM() const
108     { 
109         return isPrimitiveValue() 
110             || isSVGColor()
111             || isValueList();
112     }
113
114     PassRefPtr<CSSValue> cloneForCSSOM() const;
115
116     void addSubresourceStyleURLs(ListHashSet<URL>&, const StyleSheetContents*) const;
117
118     bool hasFailedOrCanceledSubresources() const;
119
120     bool equals(const CSSValue&) const;
121
122 protected:
123
124     static const size_t ClassTypeBits = 6;
125     enum ClassType {
126         PrimitiveClass,
127
128         // Image classes.
129         ImageClass,
130         CursorImageClass,
131
132         // Image generator classes.
133         CanvasClass,
134         CrossfadeClass,
135         FilterImageClass,
136         LinearGradientClass,
137         RadialGradientClass,
138
139         // Timing function classes.
140         CubicBezierTimingFunctionClass,
141         StepsTimingFunctionClass,
142
143         // Other class types.
144         AspectRatioClass,
145         BorderImageSliceClass,
146         FontFeatureClass,
147         FontClass,
148         FontFaceSrcClass,
149         FunctionClass,
150
151         InheritedClass,
152         InitialClass,
153
154         ReflectClass,
155         ShadowClass,
156         UnicodeRangeClass,
157         LineBoxContainClass,
158         CalculationClass,
159 #if ENABLE(CSS_GRID_LAYOUT)
160         GridTemplateAreasClass,
161 #endif
162         SVGColorClass,
163         SVGPaintClass,
164
165         // List class types must appear after ValueListClass.
166         ValueListClass,
167 #if ENABLE(CSS_IMAGE_SET)
168         ImageSetClass,
169 #endif
170         WebKitCSSFilterClass,
171         WebKitCSSTransformClass,
172 #if ENABLE(CSS_GRID_LAYOUT)
173         GridLineNamesClass,
174 #endif
175         // Do not append non-list class types here.
176     };
177
178     static const size_t ValueListSeparatorBits = 2;
179     enum ValueListSeparator {
180         SpaceSeparator,
181         CommaSeparator,
182         SlashSeparator
183     };
184
185     ClassType classType() const { return static_cast<ClassType>(m_classType); }
186
187     explicit CSSValue(ClassType classType, bool isCSSOMSafe = false)
188         : m_isCSSOMSafe(isCSSOMSafe)
189         , m_isTextClone(false)
190         , m_primitiveUnitType(0)
191         , m_hasCachedCSSText(false)
192         , m_isQuirkValue(false)
193         , m_valueListSeparator(SpaceSeparator)
194         , m_classType(classType)
195     {
196     }
197
198     // NOTE: This class is non-virtual for memory and performance reasons.
199     // Don't go making it virtual again unless you know exactly what you're doing!
200
201     ~CSSValue() { }
202
203 private:
204     WEBCORE_EXPORT void destroy();
205
206 protected:
207     unsigned m_isCSSOMSafe : 1;
208     unsigned m_isTextClone : 1;
209     // The bits in this section are only used by specific subclasses but kept here
210     // to maximize struct packing.
211
212     // CSSPrimitiveValue bits:
213     unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes
214     mutable unsigned m_hasCachedCSSText : 1;
215     unsigned m_isQuirkValue : 1;
216
217     unsigned m_valueListSeparator : ValueListSeparatorBits;
218
219 private:
220     unsigned m_classType : ClassTypeBits; // ClassType
221 };
222
223 template<typename CSSValueType>
224 inline bool compareCSSValueVector(const Vector<RefPtr<CSSValueType>>& firstVector, const Vector<RefPtr<CSSValueType>>& secondVector)
225 {
226     size_t size = firstVector.size();
227     if (size != secondVector.size())
228         return false;
229
230     for (size_t i = 0; i < size; i++) {
231         const RefPtr<CSSValueType>& firstPtr = firstVector[i];
232         const RefPtr<CSSValueType>& secondPtr = secondVector[i];
233         if (firstPtr == secondPtr || (firstPtr && secondPtr && firstPtr->equals(*secondPtr)))
234             continue;
235         return false;
236     }
237     return true;
238 }
239
240 template<typename CSSValueType>
241 inline bool compareCSSValuePtr(const RefPtr<CSSValueType>& first, const RefPtr<CSSValueType>& second)
242 {
243     return first ? second && first->equals(*second) : !second;
244 }
245
246 template<typename CSSValueType>
247 inline bool compareCSSValue(const Ref<CSSValueType>& first, const Ref<CSSValueType>& second)
248 {
249     return first.get().equals(second.get());
250 }
251
252 #define CSS_VALUE_TYPE_CASTS(ToValueTypeName, predicate) \
253     TYPE_CASTS_BASE(ToValueTypeName, CSSValue, value, value->predicate, value.predicate)
254
255 } // namespace WebCore
256
257 #endif // CSSValue_h