OLD | NEW |
| (Empty) |
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 "core/css/CSSValue.h" | |
29 | |
30 #include "core/css/CSSBorderImageSliceValue.h" | |
31 #include "core/css/CSSCalculationValue.h" | |
32 #include "core/css/CSSCanvasValue.h" | |
33 #include "core/css/CSSContentDistributionValue.h" | |
34 #include "core/css/CSSCrossfadeValue.h" | |
35 #include "core/css/CSSCursorImageValue.h" | |
36 #include "core/css/CSSFontFaceSrcValue.h" | |
37 #include "core/css/CSSFontFeatureValue.h" | |
38 #include "core/css/CSSFunctionValue.h" | |
39 #include "core/css/CSSGradientValue.h" | |
40 #include "core/css/CSSGridLineNamesValue.h" | |
41 #include "core/css/CSSGridTemplateAreasValue.h" | |
42 #include "core/css/CSSImageSetValue.h" | |
43 #include "core/css/CSSImageValue.h" | |
44 #include "core/css/CSSInheritedValue.h" | |
45 #include "core/css/CSSInitialValue.h" | |
46 #include "core/css/CSSLineBoxContainValue.h" | |
47 #include "core/css/CSSPathValue.h" | |
48 #include "core/css/CSSPrimitiveValue.h" | |
49 #include "core/css/CSSReflectValue.h" | |
50 #include "core/css/CSSSVGDocumentValue.h" | |
51 #include "core/css/CSSShadowValue.h" | |
52 #include "core/css/CSSTimingFunctionValue.h" | |
53 #include "core/css/CSSUnicodeRangeValue.h" | |
54 #include "core/css/CSSUnsetValue.h" | |
55 #include "core/css/CSSValueList.h" | |
56 | |
57 namespace blink { | |
58 | |
59 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<Sam
eSizeAsCSSValue> | |
60 { | |
61 uint32_t bitfields; | |
62 }; | |
63 | |
64 static_assert(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), "CSSValue should s
tay small"); | |
65 | |
66 bool CSSValue::isImplicitInitialValue() const | |
67 { | |
68 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit(); | |
69 } | |
70 | |
71 bool CSSValue::hasFailedOrCanceledSubresources() const | |
72 { | |
73 if (isValueList()) | |
74 return toCSSValueList(this)->hasFailedOrCanceledSubresources(); | |
75 if (classType() == FontFaceSrcClass) | |
76 return toCSSFontFaceSrcValue(this)->hasFailedOrCanceledSubresources(); | |
77 if (classType() == ImageClass) | |
78 return toCSSImageValue(this)->hasFailedOrCanceledSubresources(); | |
79 if (classType() == CrossfadeClass) | |
80 return toCSSCrossfadeValue(this)->hasFailedOrCanceledSubresources(); | |
81 if (classType() == ImageSetClass) | |
82 return toCSSImageSetValue(this)->hasFailedOrCanceledSubresources(); | |
83 | |
84 return false; | |
85 } | |
86 | |
87 template<class ChildClassType> | |
88 inline static bool compareCSSValues(const CSSValue& first, const CSSValue& secon
d) | |
89 { | |
90 return static_cast<const ChildClassType&>(first).equals(static_cast<const Ch
ildClassType&>(second)); | |
91 } | |
92 | |
93 bool CSSValue::equals(const CSSValue& other) const | |
94 { | |
95 if (m_classType == other.m_classType) { | |
96 switch (m_classType) { | |
97 case BorderImageSliceClass: | |
98 return compareCSSValues<CSSBorderImageSliceValue>(*this, other); | |
99 case CanvasClass: | |
100 return compareCSSValues<CSSCanvasValue>(*this, other); | |
101 case CursorImageClass: | |
102 return compareCSSValues<CSSCursorImageValue>(*this, other); | |
103 case FontFaceSrcClass: | |
104 return compareCSSValues<CSSFontFaceSrcValue>(*this, other); | |
105 case FontFeatureClass: | |
106 return compareCSSValues<CSSFontFeatureValue>(*this, other); | |
107 case FunctionClass: | |
108 return compareCSSValues<CSSFunctionValue>(*this, other); | |
109 case LinearGradientClass: | |
110 return compareCSSValues<CSSLinearGradientValue>(*this, other); | |
111 case RadialGradientClass: | |
112 return compareCSSValues<CSSRadialGradientValue>(*this, other); | |
113 case CrossfadeClass: | |
114 return compareCSSValues<CSSCrossfadeValue>(*this, other); | |
115 case ImageClass: | |
116 return compareCSSValues<CSSImageValue>(*this, other); | |
117 case InheritedClass: | |
118 return compareCSSValues<CSSInheritedValue>(*this, other); | |
119 case InitialClass: | |
120 return compareCSSValues<CSSInitialValue>(*this, other); | |
121 case UnsetClass: | |
122 return compareCSSValues<CSSUnsetValue>(*this, other); | |
123 case GridLineNamesClass: | |
124 return compareCSSValues<CSSGridLineNamesValue>(*this, other); | |
125 case GridTemplateAreasClass: | |
126 return compareCSSValues<CSSGridTemplateAreasValue>(*this, other); | |
127 case PathClass: | |
128 return compareCSSValues<CSSPathValue>(*this, other); | |
129 case PrimitiveClass: | |
130 return compareCSSValues<CSSPrimitiveValue>(*this, other); | |
131 case ReflectClass: | |
132 return compareCSSValues<CSSReflectValue>(*this, other); | |
133 case ShadowClass: | |
134 return compareCSSValues<CSSShadowValue>(*this, other); | |
135 case CubicBezierTimingFunctionClass: | |
136 return compareCSSValues<CSSCubicBezierTimingFunctionValue>(*this, ot
her); | |
137 case StepsTimingFunctionClass: | |
138 return compareCSSValues<CSSStepsTimingFunctionValue>(*this, other); | |
139 case UnicodeRangeClass: | |
140 return compareCSSValues<CSSUnicodeRangeValue>(*this, other); | |
141 case ValueListClass: | |
142 return compareCSSValues<CSSValueList>(*this, other); | |
143 case LineBoxContainClass: | |
144 return compareCSSValues<CSSLineBoxContainValue>(*this, other); | |
145 case CalculationClass: | |
146 return compareCSSValues<CSSCalcValue>(*this, other); | |
147 case ImageSetClass: | |
148 return compareCSSValues<CSSImageSetValue>(*this, other); | |
149 case CSSSVGDocumentClass: | |
150 return compareCSSValues<CSSSVGDocumentValue>(*this, other); | |
151 case CSSContentDistributionClass: | |
152 return compareCSSValues<CSSContentDistributionValue>(*this, other); | |
153 default: | |
154 ASSERT_NOT_REACHED(); | |
155 return false; | |
156 } | |
157 } | |
158 return false; | |
159 } | |
160 | |
161 String CSSValue::cssText() const | |
162 { | |
163 switch (classType()) { | |
164 case BorderImageSliceClass: | |
165 return toCSSBorderImageSliceValue(this)->customCSSText(); | |
166 case CanvasClass: | |
167 return toCSSCanvasValue(this)->customCSSText(); | |
168 case CursorImageClass: | |
169 return toCSSCursorImageValue(this)->customCSSText(); | |
170 case FontFaceSrcClass: | |
171 return toCSSFontFaceSrcValue(this)->customCSSText(); | |
172 case FontFeatureClass: | |
173 return toCSSFontFeatureValue(this)->customCSSText(); | |
174 case FunctionClass: | |
175 return toCSSFunctionValue(this)->customCSSText(); | |
176 case LinearGradientClass: | |
177 return toCSSLinearGradientValue(this)->customCSSText(); | |
178 case RadialGradientClass: | |
179 return toCSSRadialGradientValue(this)->customCSSText(); | |
180 case CrossfadeClass: | |
181 return toCSSCrossfadeValue(this)->customCSSText(); | |
182 case ImageClass: | |
183 return toCSSImageValue(this)->customCSSText(); | |
184 case InheritedClass: | |
185 return toCSSInheritedValue(this)->customCSSText(); | |
186 case UnsetClass: | |
187 return toCSSUnsetValue(this)->customCSSText(); | |
188 case InitialClass: | |
189 return toCSSInitialValue(this)->customCSSText(); | |
190 case GridLineNamesClass: | |
191 return toCSSGridLineNamesValue(this)->customCSSText(); | |
192 case GridTemplateAreasClass: | |
193 return toCSSGridTemplateAreasValue(this)->customCSSText(); | |
194 case PathClass: | |
195 return toCSSPathValue(this)->customCSSText(); | |
196 case PrimitiveClass: | |
197 return toCSSPrimitiveValue(this)->customCSSText(); | |
198 case ReflectClass: | |
199 return toCSSReflectValue(this)->customCSSText(); | |
200 case ShadowClass: | |
201 return toCSSShadowValue(this)->customCSSText(); | |
202 case CubicBezierTimingFunctionClass: | |
203 return toCSSCubicBezierTimingFunctionValue(this)->customCSSText(); | |
204 case StepsTimingFunctionClass: | |
205 return toCSSStepsTimingFunctionValue(this)->customCSSText(); | |
206 case UnicodeRangeClass: | |
207 return toCSSUnicodeRangeValue(this)->customCSSText(); | |
208 case ValueListClass: | |
209 return toCSSValueList(this)->customCSSText(); | |
210 case LineBoxContainClass: | |
211 return toCSSLineBoxContainValue(this)->customCSSText(); | |
212 case CalculationClass: | |
213 return toCSSCalcValue(this)->customCSSText(); | |
214 case ImageSetClass: | |
215 return toCSSImageSetValue(this)->customCSSText(); | |
216 case CSSSVGDocumentClass: | |
217 return toCSSSVGDocumentValue(this)->customCSSText(); | |
218 case CSSContentDistributionClass: | |
219 return toCSSContentDistributionValue(this)->customCSSText(); | |
220 } | |
221 ASSERT_NOT_REACHED(); | |
222 return String(); | |
223 } | |
224 | |
225 void CSSValue::destroy() | |
226 { | |
227 switch (classType()) { | |
228 case BorderImageSliceClass: | |
229 delete toCSSBorderImageSliceValue(this); | |
230 return; | |
231 case CanvasClass: | |
232 delete toCSSCanvasValue(this); | |
233 return; | |
234 case CursorImageClass: | |
235 delete toCSSCursorImageValue(this); | |
236 return; | |
237 case FontFaceSrcClass: | |
238 delete toCSSFontFaceSrcValue(this); | |
239 return; | |
240 case FontFeatureClass: | |
241 delete toCSSFontFeatureValue(this); | |
242 return; | |
243 case FunctionClass: | |
244 delete toCSSFunctionValue(this); | |
245 return; | |
246 case LinearGradientClass: | |
247 delete toCSSLinearGradientValue(this); | |
248 return; | |
249 case RadialGradientClass: | |
250 delete toCSSRadialGradientValue(this); | |
251 return; | |
252 case CrossfadeClass: | |
253 delete toCSSCrossfadeValue(this); | |
254 return; | |
255 case ImageClass: | |
256 delete toCSSImageValue(this); | |
257 return; | |
258 case InheritedClass: | |
259 delete toCSSInheritedValue(this); | |
260 return; | |
261 case InitialClass: | |
262 delete toCSSInitialValue(this); | |
263 return; | |
264 case UnsetClass: | |
265 delete toCSSUnsetValue(this); | |
266 return; | |
267 case GridLineNamesClass: | |
268 delete toCSSGridLineNamesValue(this); | |
269 return; | |
270 case GridTemplateAreasClass: | |
271 delete toCSSGridTemplateAreasValue(this); | |
272 return; | |
273 case PathClass: | |
274 delete toCSSPathValue(this); | |
275 return; | |
276 case PrimitiveClass: | |
277 delete toCSSPrimitiveValue(this); | |
278 return; | |
279 case ReflectClass: | |
280 delete toCSSReflectValue(this); | |
281 return; | |
282 case ShadowClass: | |
283 delete toCSSShadowValue(this); | |
284 return; | |
285 case CubicBezierTimingFunctionClass: | |
286 delete toCSSCubicBezierTimingFunctionValue(this); | |
287 return; | |
288 case StepsTimingFunctionClass: | |
289 delete toCSSStepsTimingFunctionValue(this); | |
290 return; | |
291 case UnicodeRangeClass: | |
292 delete toCSSUnicodeRangeValue(this); | |
293 return; | |
294 case ValueListClass: | |
295 delete toCSSValueList(this); | |
296 return; | |
297 case LineBoxContainClass: | |
298 delete toCSSLineBoxContainValue(this); | |
299 return; | |
300 case CalculationClass: | |
301 delete toCSSCalcValue(this); | |
302 return; | |
303 case ImageSetClass: | |
304 delete toCSSImageSetValue(this); | |
305 return; | |
306 case CSSSVGDocumentClass: | |
307 delete toCSSSVGDocumentValue(this); | |
308 return; | |
309 case CSSContentDistributionClass: | |
310 delete toCSSContentDistributionValue(this); | |
311 return; | |
312 } | |
313 ASSERT_NOT_REACHED(); | |
314 } | |
315 | |
316 void CSSValue::finalizeGarbageCollectedObject() | |
317 { | |
318 switch (classType()) { | |
319 case BorderImageSliceClass: | |
320 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue(); | |
321 return; | |
322 case CanvasClass: | |
323 toCSSCanvasValue(this)->~CSSCanvasValue(); | |
324 return; | |
325 case CursorImageClass: | |
326 toCSSCursorImageValue(this)->~CSSCursorImageValue(); | |
327 return; | |
328 case FontFaceSrcClass: | |
329 toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue(); | |
330 return; | |
331 case FontFeatureClass: | |
332 toCSSFontFeatureValue(this)->~CSSFontFeatureValue(); | |
333 return; | |
334 case FunctionClass: | |
335 toCSSFunctionValue(this)->~CSSFunctionValue(); | |
336 return; | |
337 case LinearGradientClass: | |
338 toCSSLinearGradientValue(this)->~CSSLinearGradientValue(); | |
339 return; | |
340 case RadialGradientClass: | |
341 toCSSRadialGradientValue(this)->~CSSRadialGradientValue(); | |
342 return; | |
343 case CrossfadeClass: | |
344 toCSSCrossfadeValue(this)->~CSSCrossfadeValue(); | |
345 return; | |
346 case ImageClass: | |
347 toCSSImageValue(this)->~CSSImageValue(); | |
348 return; | |
349 case InheritedClass: | |
350 toCSSInheritedValue(this)->~CSSInheritedValue(); | |
351 return; | |
352 case InitialClass: | |
353 toCSSInitialValue(this)->~CSSInitialValue(); | |
354 return; | |
355 case UnsetClass: | |
356 toCSSUnsetValue(this)->~CSSUnsetValue(); | |
357 return; | |
358 case GridLineNamesClass: | |
359 toCSSGridLineNamesValue(this)->~CSSGridLineNamesValue(); | |
360 return; | |
361 case GridTemplateAreasClass: | |
362 toCSSGridTemplateAreasValue(this)->~CSSGridTemplateAreasValue(); | |
363 return; | |
364 case PathClass: | |
365 toCSSPathValue(this)->~CSSPathValue(); | |
366 return; | |
367 case PrimitiveClass: | |
368 toCSSPrimitiveValue(this)->~CSSPrimitiveValue(); | |
369 return; | |
370 case ReflectClass: | |
371 toCSSReflectValue(this)->~CSSReflectValue(); | |
372 return; | |
373 case ShadowClass: | |
374 toCSSShadowValue(this)->~CSSShadowValue(); | |
375 return; | |
376 case CubicBezierTimingFunctionClass: | |
377 toCSSCubicBezierTimingFunctionValue(this)->~CSSCubicBezierTimingFunction
Value(); | |
378 return; | |
379 case StepsTimingFunctionClass: | |
380 toCSSStepsTimingFunctionValue(this)->~CSSStepsTimingFunctionValue(); | |
381 return; | |
382 case UnicodeRangeClass: | |
383 toCSSUnicodeRangeValue(this)->~CSSUnicodeRangeValue(); | |
384 return; | |
385 case ValueListClass: | |
386 toCSSValueList(this)->~CSSValueList(); | |
387 return; | |
388 case LineBoxContainClass: | |
389 toCSSLineBoxContainValue(this)->~CSSLineBoxContainValue(); | |
390 return; | |
391 case CalculationClass: | |
392 toCSSCalcValue(this)->~CSSCalcValue(); | |
393 return; | |
394 case ImageSetClass: | |
395 toCSSImageSetValue(this)->~CSSImageSetValue(); | |
396 return; | |
397 case CSSSVGDocumentClass: | |
398 toCSSSVGDocumentValue(this)->~CSSSVGDocumentValue(); | |
399 return; | |
400 case CSSContentDistributionClass: | |
401 toCSSContentDistributionValue(this)->~CSSContentDistributionValue(); | |
402 return; | |
403 } | |
404 ASSERT_NOT_REACHED(); | |
405 } | |
406 | |
407 DEFINE_TRACE(CSSValue) | |
408 { | |
409 switch (classType()) { | |
410 case BorderImageSliceClass: | |
411 toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor); | |
412 return; | |
413 case CanvasClass: | |
414 toCSSCanvasValue(this)->traceAfterDispatch(visitor); | |
415 return; | |
416 case CursorImageClass: | |
417 toCSSCursorImageValue(this)->traceAfterDispatch(visitor); | |
418 return; | |
419 case FontFaceSrcClass: | |
420 toCSSFontFaceSrcValue(this)->traceAfterDispatch(visitor); | |
421 return; | |
422 case FontFeatureClass: | |
423 toCSSFontFeatureValue(this)->traceAfterDispatch(visitor); | |
424 return; | |
425 case FunctionClass: | |
426 toCSSFunctionValue(this)->traceAfterDispatch(visitor); | |
427 return; | |
428 case LinearGradientClass: | |
429 toCSSLinearGradientValue(this)->traceAfterDispatch(visitor); | |
430 return; | |
431 case RadialGradientClass: | |
432 toCSSRadialGradientValue(this)->traceAfterDispatch(visitor); | |
433 return; | |
434 case CrossfadeClass: | |
435 toCSSCrossfadeValue(this)->traceAfterDispatch(visitor); | |
436 return; | |
437 case ImageClass: | |
438 toCSSImageValue(this)->traceAfterDispatch(visitor); | |
439 return; | |
440 case InheritedClass: | |
441 toCSSInheritedValue(this)->traceAfterDispatch(visitor); | |
442 return; | |
443 case InitialClass: | |
444 toCSSInitialValue(this)->traceAfterDispatch(visitor); | |
445 return; | |
446 case UnsetClass: | |
447 toCSSUnsetValue(this)->traceAfterDispatch(visitor); | |
448 return; | |
449 case GridLineNamesClass: | |
450 toCSSGridLineNamesValue(this)->traceAfterDispatch(visitor); | |
451 return; | |
452 case GridTemplateAreasClass: | |
453 toCSSGridTemplateAreasValue(this)->traceAfterDispatch(visitor); | |
454 return; | |
455 case PathClass: | |
456 toCSSPathValue(this)->traceAfterDispatch(visitor); | |
457 return; | |
458 case PrimitiveClass: | |
459 toCSSPrimitiveValue(this)->traceAfterDispatch(visitor); | |
460 return; | |
461 case ReflectClass: | |
462 toCSSReflectValue(this)->traceAfterDispatch(visitor); | |
463 return; | |
464 case ShadowClass: | |
465 toCSSShadowValue(this)->traceAfterDispatch(visitor); | |
466 return; | |
467 case CubicBezierTimingFunctionClass: | |
468 toCSSCubicBezierTimingFunctionValue(this)->traceAfterDispatch(visitor); | |
469 return; | |
470 case StepsTimingFunctionClass: | |
471 toCSSStepsTimingFunctionValue(this)->traceAfterDispatch(visitor); | |
472 return; | |
473 case UnicodeRangeClass: | |
474 toCSSUnicodeRangeValue(this)->traceAfterDispatch(visitor); | |
475 return; | |
476 case ValueListClass: | |
477 toCSSValueList(this)->traceAfterDispatch(visitor); | |
478 return; | |
479 case LineBoxContainClass: | |
480 toCSSLineBoxContainValue(this)->traceAfterDispatch(visitor); | |
481 return; | |
482 case CalculationClass: | |
483 toCSSCalcValue(this)->traceAfterDispatch(visitor); | |
484 return; | |
485 case ImageSetClass: | |
486 toCSSImageSetValue(this)->traceAfterDispatch(visitor); | |
487 return; | |
488 case CSSSVGDocumentClass: | |
489 toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor); | |
490 return; | |
491 case CSSContentDistributionClass: | |
492 toCSSContentDistributionValue(this)->traceAfterDispatch(visitor); | |
493 return; | |
494 } | |
495 ASSERT_NOT_REACHED(); | |
496 } | |
497 | |
498 } | |
OLD | NEW |