cda43b9cf643524573dbf3ce31497cf278051719
[WebKit-https.git] / Source / WebCore / css / CSSValue.cpp
1 /*
2  * Copyright (C) 2011 Andreas Kling (kling@webkit.org)
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  */
26
27 #include "config.h"
28 #include "CSSValue.h"
29
30 #include "CSSAspectRatioValue.h"
31 #include "CSSBorderImageSliceValue.h"
32 #include "CSSCalculationValue.h"
33 #include "CSSCanvasValue.h"
34 #include "CSSCrossfadeValue.h"
35 #include "CSSCursorImageValue.h"
36 #include "CSSFontFaceSrcValue.h"
37 #include "CSSFunctionValue.h"
38 #include "CSSGradientValue.h"
39 #include "CSSImageGeneratorValue.h"
40 #include "CSSImageSetValue.h"
41 #include "CSSImageValue.h"
42 #include "CSSInheritedValue.h"
43 #include "CSSInitialValue.h"
44 #include "CSSLineBoxContainValue.h"
45 #include "CSSPrimitiveValue.h"
46 #include "CSSReflectValue.h"
47 #include "CSSTimingFunctionValue.h"
48 #include "CSSUnicodeRangeValue.h"
49 #include "CSSValueList.h"
50 #if ENABLE(CSS_VARIABLES)
51 #include "CSSVariableValue.h"
52 #endif
53 #include "FontValue.h"
54 #include "FontFeatureValue.h"
55 #include "ShadowValue.h"
56 #include "SVGColor.h"
57 #include "SVGPaint.h"
58 #include "WebKitCSSFilterValue.h"
59 #include "WebKitCSSShaderValue.h"
60 #include "WebKitCSSTransformValue.h"
61
62 #if ENABLE(SVG)
63 #include "WebKitCSSSVGDocumentValue.h"
64 #endif
65
66 namespace WebCore {
67
68 struct SameSizeAsCSSValue : public RefCounted<SameSizeAsCSSValue> {
69     uint32_t bitfields;
70 };
71
72 COMPILE_ASSERT(sizeof(CSSValue) == sizeof(SameSizeAsCSSValue), CSS_value_should_stay_small);
73     
74 class TextCloneCSSValue : public CSSValue {
75 public:
76     static PassRefPtr<TextCloneCSSValue> create(ClassType classType, const String& text) { return adoptRef(new TextCloneCSSValue(classType, text)); }
77
78     String cssText() const { return m_cssText; }
79
80 private:
81     TextCloneCSSValue(ClassType classType, const String& text) 
82         : CSSValue(classType, /*isCSSOMSafe*/ true)
83         , m_cssText(text)
84     {
85         m_isTextClone = true;
86     }
87
88     String m_cssText;
89 };
90
91 bool CSSValue::isImplicitInitialValue() const
92 {
93     return m_classType == InitialClass && static_cast<const CSSInitialValue*>(this)->isImplicit();
94 }
95
96 CSSValue::Type CSSValue::cssValueType() const
97 {
98     if (isInheritedValue())
99         return CSS_INHERIT;
100     if (isPrimitiveValue())
101         return CSS_PRIMITIVE_VALUE;
102     if (isValueList())
103         return CSS_VALUE_LIST;
104     if (isInitialValue())
105         return CSS_INITIAL;
106     return CSS_CUSTOM;
107 }
108
109 void CSSValue::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const StyleSheetContents* styleSheet) const
110 {
111     // This should get called for internal instances only.
112     ASSERT(!isCSSOMSafe());
113
114     if (isPrimitiveValue())
115         static_cast<const CSSPrimitiveValue*>(this)->addSubresourceStyleURLs(urls, styleSheet);
116     else if (isValueList())
117         static_cast<const CSSValueList*>(this)->addSubresourceStyleURLs(urls, styleSheet);
118     else if (classType() == FontFaceSrcClass)
119         static_cast<const CSSFontFaceSrcValue*>(this)->addSubresourceStyleURLs(urls, styleSheet);
120     else if (classType() == ReflectClass)
121         static_cast<const CSSReflectValue*>(this)->addSubresourceStyleURLs(urls, styleSheet);
122 }
123
124 String CSSValue::cssText() const
125 {
126     if (m_isTextClone) {
127          ASSERT(isCSSOMSafe());
128         return static_cast<const TextCloneCSSValue*>(this)->cssText();
129     }
130     ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
131
132     switch (classType()) {
133     case AspectRatioClass:
134         return static_cast<const CSSAspectRatioValue*>(this)->customCssText();
135     case BorderImageSliceClass:
136         return static_cast<const CSSBorderImageSliceValue*>(this)->customCssText();
137     case CanvasClass:
138         return static_cast<const CSSCanvasValue*>(this)->customCssText();
139     case CursorImageClass:
140         return static_cast<const CSSCursorImageValue*>(this)->customCssText();
141     case FontClass:
142         return static_cast<const FontValue*>(this)->customCssText();
143     case FontFaceSrcClass:
144         return static_cast<const CSSFontFaceSrcValue*>(this)->customCssText();
145     case FontFeatureClass:
146         return static_cast<const FontFeatureValue*>(this)->customCssText();
147     case FunctionClass:
148         return static_cast<const CSSFunctionValue*>(this)->customCssText();
149     case LinearGradientClass:
150         return static_cast<const CSSLinearGradientValue*>(this)->customCssText();
151     case RadialGradientClass:
152         return static_cast<const CSSRadialGradientValue*>(this)->customCssText();
153     case CrossfadeClass:
154         return static_cast<const CSSCrossfadeValue*>(this)->customCssText();
155     case ImageClass:
156         return static_cast<const CSSImageValue*>(this)->customCssText();
157     case InheritedClass:
158         return static_cast<const CSSInheritedValue*>(this)->customCssText();
159     case InitialClass:
160         return static_cast<const CSSInitialValue*>(this)->customCssText();
161     case PrimitiveClass:
162         return static_cast<const CSSPrimitiveValue*>(this)->customCssText();
163     case ReflectClass:
164         return static_cast<const CSSReflectValue*>(this)->customCssText();
165     case ShadowClass:
166         return static_cast<const ShadowValue*>(this)->customCssText();
167     case LinearTimingFunctionClass:
168         return static_cast<const CSSLinearTimingFunctionValue*>(this)->customCssText();
169     case CubicBezierTimingFunctionClass:
170         return static_cast<const CSSCubicBezierTimingFunctionValue*>(this)->customCssText();
171     case StepsTimingFunctionClass:
172         return static_cast<const CSSStepsTimingFunctionValue*>(this)->customCssText();
173     case UnicodeRangeClass:
174         return static_cast<const CSSUnicodeRangeValue*>(this)->customCssText();
175     case ValueListClass:
176         return static_cast<const CSSValueList*>(this)->customCssText();
177     case WebKitCSSTransformClass:
178         return static_cast<const WebKitCSSTransformValue*>(this)->customCssText();
179     case LineBoxContainClass:
180         return static_cast<const CSSLineBoxContainValue*>(this)->customCssText();
181     case CalculationClass:
182         return static_cast<const CSSCalcValue*>(this)->customCssText();
183 #if ENABLE(CSS_IMAGE_SET)
184     case ImageSetClass:
185         return static_cast<const CSSImageSetValue*>(this)->customCssText();
186 #endif
187 #if ENABLE(CSS_FILTERS)
188     case WebKitCSSFilterClass:
189         return static_cast<const WebKitCSSFilterValue*>(this)->customCssText();
190 #if ENABLE(CSS_SHADERS)
191     case WebKitCSSShaderClass:
192         return static_cast<const WebKitCSSShaderValue*>(this)->customCssText();
193 #endif
194 #endif
195 #if ENABLE(CSS_VARIABLES)
196     case VariableClass:
197         return static_cast<const CSSVariableValue*>(this)->value();
198 #endif
199 #if ENABLE(SVG)
200     case SVGColorClass:
201         return static_cast<const SVGColor*>(this)->customCssText();
202     case SVGPaintClass:
203         return static_cast<const SVGPaint*>(this)->customCssText();
204     case WebKitCSSSVGDocumentClass:
205         return static_cast<const WebKitCSSSVGDocumentValue*>(this)->customCssText();
206 #endif
207     }
208     ASSERT_NOT_REACHED();
209     return String();
210 }
211
212 #if ENABLE(CSS_VARIABLES)
213 String CSSValue::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
214 {
215     switch (classType()) {
216     case PrimitiveClass:
217         return static_cast<const CSSPrimitiveValue*>(this)->customSerializeResolvingVariables(variables);
218     case ValueListClass:
219         return static_cast<const CSSValueList*>(this)->customSerializeResolvingVariables(variables);
220     case WebKitCSSTransformClass:
221         return static_cast<const WebKitCSSTransformValue*>(this)->customSerializeResolvingVariables(variables);
222     default:
223         return cssText();
224     }
225 }
226 #endif
227
228 void CSSValue::destroy()
229 {
230     if (m_isTextClone) {
231         ASSERT(isCSSOMSafe());
232         delete static_cast<TextCloneCSSValue*>(this);
233         return;
234     }
235     ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
236
237     switch (classType()) {
238     case AspectRatioClass:
239         delete static_cast<CSSAspectRatioValue*>(this);
240         return;
241     case BorderImageSliceClass:
242         delete static_cast<CSSBorderImageSliceValue*>(this);
243         return;
244     case CanvasClass:
245         delete static_cast<CSSCanvasValue*>(this);
246         return;
247     case CursorImageClass:
248         delete static_cast<CSSCursorImageValue*>(this);
249         return;
250     case FontClass:
251         delete static_cast<FontValue*>(this);
252         return;
253     case FontFaceSrcClass:
254         delete static_cast<CSSFontFaceSrcValue*>(this);
255         return;
256     case FontFeatureClass:
257         delete static_cast<FontFeatureValue*>(this);
258         return;
259     case FunctionClass:
260         delete static_cast<CSSFunctionValue*>(this);
261         return;
262     case LinearGradientClass:
263         delete static_cast<CSSLinearGradientValue*>(this);
264         return;
265     case RadialGradientClass:
266         delete static_cast<CSSRadialGradientValue*>(this);
267         return;
268     case CrossfadeClass:
269         delete static_cast<CSSCrossfadeValue*>(this);
270         return;
271     case ImageClass:
272         delete static_cast<CSSImageValue*>(this);
273         return;
274     case InheritedClass:
275         delete static_cast<CSSInheritedValue*>(this);
276         return;
277     case InitialClass:
278         delete static_cast<CSSInitialValue*>(this);
279         return;
280     case PrimitiveClass:
281         delete static_cast<CSSPrimitiveValue*>(this);
282         return;
283     case ReflectClass:
284         delete static_cast<CSSReflectValue*>(this);
285         return;
286     case ShadowClass:
287         delete static_cast<ShadowValue*>(this);
288         return;
289     case LinearTimingFunctionClass:
290         delete static_cast<CSSLinearTimingFunctionValue*>(this);
291         return;
292     case CubicBezierTimingFunctionClass:
293         delete static_cast<CSSCubicBezierTimingFunctionValue*>(this);
294         return;
295     case StepsTimingFunctionClass:
296         delete static_cast<CSSStepsTimingFunctionValue*>(this);
297         return;
298     case UnicodeRangeClass:
299         delete static_cast<CSSUnicodeRangeValue*>(this);
300         return;
301     case ValueListClass:
302         delete static_cast<CSSValueList*>(this);
303         return;
304     case WebKitCSSTransformClass:
305         delete static_cast<WebKitCSSTransformValue*>(this);
306         return;
307     case LineBoxContainClass:
308         delete static_cast<CSSLineBoxContainValue*>(this);
309         return;
310     case CalculationClass:
311         delete static_cast<CSSCalcValue*>(this);
312         return;
313 #if ENABLE(CSS_IMAGE_SET)
314     case ImageSetClass:
315         delete static_cast<CSSImageSetValue*>(this);
316         return;
317 #endif
318 #if ENABLE(CSS_FILTERS)
319     case WebKitCSSFilterClass:
320         delete static_cast<WebKitCSSFilterValue*>(this);
321         return;
322 #if ENABLE(CSS_SHADERS)
323     case WebKitCSSShaderClass:
324         delete static_cast<WebKitCSSShaderValue*>(this);
325         return;
326 #endif
327 #endif
328 #if ENABLE(CSS_VARIABLES)
329     case VariableClass:
330         delete static_cast<CSSVariableValue*>(this);
331         return;
332 #endif
333 #if ENABLE(SVG)
334     case SVGColorClass:
335         delete static_cast<SVGColor*>(this);
336         return;
337     case SVGPaintClass:
338         delete static_cast<SVGPaint*>(this);
339         return;
340     case WebKitCSSSVGDocumentClass:
341         delete static_cast<WebKitCSSSVGDocumentValue*>(this);
342         return;
343 #endif
344     }
345     ASSERT_NOT_REACHED();
346 }
347
348 PassRefPtr<CSSValue> CSSValue::cloneForCSSOM() const
349 {
350     switch (classType()) {
351     case PrimitiveClass:
352         return static_cast<const CSSPrimitiveValue*>(this)->cloneForCSSOM();
353     case ValueListClass:
354         return static_cast<const CSSValueList*>(this)->cloneForCSSOM();
355     case ImageClass:
356     case CursorImageClass:
357         return static_cast<const CSSImageValue*>(this)->cloneForCSSOM();
358 #if ENABLE(CSS_FILTERS)
359     case WebKitCSSFilterClass:
360         return static_cast<const WebKitCSSFilterValue*>(this)->cloneForCSSOM();
361 #endif
362     case WebKitCSSTransformClass:
363         return static_cast<const WebKitCSSTransformValue*>(this)->cloneForCSSOM();
364 #if ENABLE(CSS_IMAGE_SET)
365     case ImageSetClass:
366         return static_cast<const CSSImageSetValue*>(this)->cloneForCSSOM();
367 #endif
368 #if ENABLE(SVG)
369     case SVGColorClass:
370         return static_cast<const SVGColor*>(this)->cloneForCSSOM();
371     case SVGPaintClass:
372         return static_cast<const SVGPaint*>(this)->cloneForCSSOM();
373 #endif
374     default:
375         ASSERT(!isSubtypeExposedToCSSOM());
376         return TextCloneCSSValue::create(classType(), cssText());
377     }
378 }
379
380 }