webkit-image-set() function not showing up when computing background property
[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 "KURLHash.h"
26 #include <wtf/ListHashSet.h>
27 #include <wtf/RefCounted.h>
28 #include <wtf/RefPtr.h>
29
30 namespace WebCore {
31
32 class MemoryObjectInfo;
33 class StyleSheetContents;
34     
35 // FIXME: The current CSSValue and subclasses should be turned into internal types (StyleValue).
36 // The few subtypes that are actually exposed in CSSOM can be seen in the cloneForCSSOM() function.
37 // They should be handled by separate wrapper classes.
38
39 // Please don't expose more CSSValue types to the web.
40 class CSSValue : public RefCounted<CSSValue> {
41 public:
42     enum Type {
43         CSS_INHERIT = 0,
44         CSS_PRIMITIVE_VALUE = 1,
45         CSS_VALUE_LIST = 2,
46         CSS_CUSTOM = 3,
47         CSS_INITIAL = 4
48
49     };
50
51     // Override RefCounted's deref() to ensure operator delete is called on
52     // the appropriate subclass type.
53     void deref()
54     {
55         if (derefBase())
56             destroy();
57     }
58
59     Type cssValueType() const;
60
61     String cssText() const;
62     void setCssText(const String&, ExceptionCode&) { } // FIXME: Not implemented.
63 #if ENABLE(CSS_VARIABLES)
64     String serializeResolvingVariables(const HashMap<AtomicString, String>&) const;
65 #endif
66
67     bool isPrimitiveValue() const { return m_classType == PrimitiveClass; }
68     bool isValueList() const { return m_classType >= ValueListClass; }
69     
70     bool isBaseValueList() const { return m_classType == ValueListClass; }
71         
72
73     bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
74     bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
75     bool isCursorImageValue() const { return m_classType == CursorImageClass; }
76     bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
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 || m_classType == CursorImageClass; }
84     bool isImplicitInitialValue() const;
85     bool isInheritedValue() const { return m_classType == InheritedClass; }
86     bool isInitialValue() const { return m_classType == InitialClass; }
87     bool isReflectValue() const { return m_classType == ReflectClass; }
88     bool isShadowValue() const { return m_classType == ShadowClass; }
89     bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
90     bool isLinearTimingFunctionValue() const { return m_classType == LinearTimingFunctionClass; }
91     bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
92     bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; }
93     bool isCSSLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
94     bool isCalculationValue() const {return m_classType == CalculationClass; }
95 #if ENABLE(CSS_FILTERS)
96     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
97 #if ENABLE(CSS_SHADERS)
98     bool isWebKitCSSMixFunctionValue() const { return m_classType == WebKitCSSMixFunctionValueClass; }
99     bool isWebKitCSSShaderValue() const { return m_classType == WebKitCSSShaderClass; }
100 #endif
101 #endif // ENABLE(CSS_FILTERS)
102 #if ENABLE(CSS_VARIABLES)
103     bool isVariableValue() const { return m_classType == VariableClass; }
104 #endif
105 #if ENABLE(SVG)
106     bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
107     bool isSVGPaint() const { return m_classType == SVGPaintClass; }
108     bool isWebKitCSSSVGDocumentValue() const { return m_classType == WebKitCSSSVGDocumentClass; }
109 #endif
110     
111     bool isCSSOMSafe() const { return m_isCSSOMSafe; }
112     bool isSubtypeExposedToCSSOM() const
113     { 
114         return isPrimitiveValue() 
115 #if ENABLE(SVG)
116             || isSVGColor()
117 #endif
118             || isValueList();
119     }
120
121     PassRefPtr<CSSValue> cloneForCSSOM() const;
122
123     void addSubresourceStyleURLs(ListHashSet<KURL>&, const StyleSheetContents*) const;
124
125     bool hasFailedOrCanceledSubresources() const;
126
127     void reportMemoryUsage(MemoryObjectInfo*) const;
128
129 protected:
130
131     static const size_t ClassTypeBits = 6;
132     enum ClassType {
133         PrimitiveClass,
134
135         // Image classes.
136         ImageClass,
137         CursorImageClass,
138
139         // Image generator classes.
140         CanvasClass,
141         CrossfadeClass,
142         LinearGradientClass,
143         RadialGradientClass,
144
145         // Timing function classes.
146         CubicBezierTimingFunctionClass,
147         LinearTimingFunctionClass,
148         StepsTimingFunctionClass,
149
150         // Other class types.
151         AspectRatioClass,
152         BorderImageSliceClass,
153         FontFeatureClass,
154         FontClass,
155         FontFaceSrcClass,
156         FunctionClass,
157
158         InheritedClass,
159         InitialClass,
160
161         ReflectClass,
162         ShadowClass,
163         UnicodeRangeClass,
164         LineBoxContainClass,
165         CalculationClass,
166 #if ENABLE(CSS_FILTERS) && ENABLE(CSS_SHADERS)
167         WebKitCSSShaderClass,
168 #endif
169 #if ENABLE(CSS_VARIABLES)
170         VariableClass,
171 #endif
172 #if ENABLE(SVG)
173         SVGColorClass,
174         SVGPaintClass,
175         WebKitCSSSVGDocumentClass,
176 #endif
177
178         // List class types must appear after ValueListClass.
179         ValueListClass,
180 #if ENABLE(CSS_IMAGE_SET)
181         ImageSetClass,
182 #endif
183 #if ENABLE(CSS_FILTERS)
184         WebKitCSSFilterClass,
185 #if ENABLE(CSS_SHADERS)
186         WebKitCSSMixFunctionValueClass,
187 #endif
188 #endif
189         WebKitCSSTransformClass,
190         // Do not append non-list class types here.
191     };
192
193     static const size_t ValueListSeparatorBits = 2;
194     enum ValueListSeparator {
195         SpaceSeparator,
196         CommaSeparator,
197         SlashSeparator
198     };
199
200     ClassType classType() const { return static_cast<ClassType>(m_classType); }
201
202     explicit CSSValue(ClassType classType, bool isCSSOMSafe = false)
203         : m_isCSSOMSafe(isCSSOMSafe)
204         , m_isTextClone(false)
205         , m_primitiveUnitType(0)
206         , m_hasCachedCSSText(false)
207         , m_isQuirkValue(false)
208         , m_valueListSeparator(SpaceSeparator)
209         , m_classType(classType)
210     {
211     }
212
213     // NOTE: This class is non-virtual for memory and performance reasons.
214     // Don't go making it virtual again unless you know exactly what you're doing!
215
216     ~CSSValue() { }
217
218 private:
219     void destroy();
220
221 protected:
222     unsigned m_isCSSOMSafe : 1;
223     unsigned m_isTextClone : 1;
224     // The bits in this section are only used by specific subclasses but kept here
225     // to maximize struct packing.
226
227     // CSSPrimitiveValue bits:
228     unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes
229     mutable unsigned m_hasCachedCSSText : 1;
230     unsigned m_isQuirkValue : 1;
231
232     unsigned m_valueListSeparator : ValueListSeparatorBits;
233
234 private:
235     unsigned m_classType : ClassTypeBits; // ClassType
236 };
237
238 } // namespace WebCore
239
240 #endif // CSSValue_h