Home | History | Annotate | Download | only in css
      1 /*
      2  * Copyright (C) 2011 Andreas Kling (kling (at) 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/CSSArrayFunctionValue.h"
     31 #include "core/css/CSSAspectRatioValue.h"
     32 #include "core/css/CSSBorderImageSliceValue.h"
     33 #include "core/css/CSSCalculationValue.h"
     34 #include "core/css/CSSCanvasValue.h"
     35 #include "core/css/CSSCrossfadeValue.h"
     36 #include "core/css/CSSCursorImageValue.h"
     37 #include "core/css/CSSFilterValue.h"
     38 #include "core/css/CSSFontFaceSrcValue.h"
     39 #include "core/css/CSSFontFeatureValue.h"
     40 #include "core/css/CSSFontValue.h"
     41 #include "core/css/CSSFunctionValue.h"
     42 #include "core/css/CSSGradientValue.h"
     43 #include "core/css/CSSGridLineNamesValue.h"
     44 #include "core/css/CSSGridTemplateAreasValue.h"
     45 #include "core/css/CSSImageSetValue.h"
     46 #include "core/css/CSSImageValue.h"
     47 #include "core/css/CSSInheritedValue.h"
     48 #include "core/css/CSSInitialValue.h"
     49 #include "core/css/CSSLineBoxContainValue.h"
     50 #include "core/css/CSSPrimitiveValue.h"
     51 #include "core/css/CSSReflectValue.h"
     52 #include "core/css/CSSSVGDocumentValue.h"
     53 #include "core/css/CSSShadowValue.h"
     54 #include "core/css/CSSTimingFunctionValue.h"
     55 #include "core/css/CSSTransformValue.h"
     56 #include "core/css/CSSUnicodeRangeValue.h"
     57 #include "core/css/CSSValueList.h"
     58 #include "core/svg/SVGPaint.h"
     59 
     60 namespace WebCore {
     61 
     62 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<SameSizeAsCSSValue> {
     63     uint32_t bitfields;
     64 };
     65 
     66 COMPILE_ASSERT(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), CSS_value_should_stay_small);
     67 
     68 class TextCloneCSSValue : public CSSValue {
     69 public:
     70     static PassRefPtrWillBeRawPtr<TextCloneCSSValue> create(ClassType classType, const String& text)
     71     {
     72         return adoptRefWillBeNoop(new TextCloneCSSValue(classType, text));
     73     }
     74 
     75     String cssText() const { return m_cssText; }
     76 
     77     void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
     78 
     79 private:
     80     TextCloneCSSValue(ClassType classType, const String& text)
     81         : CSSValue(classType, /*isCSSOMSafe*/ true)
     82         , m_cssText(text)
     83     {
     84         m_isTextClone = true;
     85     }
     86 
     87     String m_cssText;
     88 };
     89 
     90 DEFINE_CSS_VALUE_TYPE_CASTS(TextCloneCSSValue, isTextCloneCSSValue());
     91 
     92 bool CSSValue::isImplicitInitialValue() const
     93 {
     94     return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit();
     95 }
     96 
     97 CSSValue::Type CSSValue::cssValueType() const
     98 {
     99     if (isInheritedValue())
    100         return CSS_INHERIT;
    101     if (isPrimitiveValue())
    102         return CSS_PRIMITIVE_VALUE;
    103     if (isValueList())
    104         return CSS_VALUE_LIST;
    105     if (isInitialValue())
    106         return CSS_INITIAL;
    107     return CSS_CUSTOM;
    108 }
    109 
    110 bool CSSValue::hasFailedOrCanceledSubresources() const
    111 {
    112     // This should get called for internal instances only.
    113     ASSERT(!isCSSOMSafe());
    114 
    115     if (isValueList())
    116         return toCSSValueList(this)->hasFailedOrCanceledSubresources();
    117     if (classType() == FontFaceSrcClass)
    118         return toCSSFontFaceSrcValue(this)->hasFailedOrCanceledSubresources();
    119     if (classType() == ImageClass)
    120         return toCSSImageValue(this)->hasFailedOrCanceledSubresources();
    121     if (classType() == CrossfadeClass)
    122         return toCSSCrossfadeValue(this)->hasFailedOrCanceledSubresources();
    123     if (classType() == ImageSetClass)
    124         return toCSSImageSetValue(this)->hasFailedOrCanceledSubresources();
    125 
    126     return false;
    127 }
    128 
    129 template<class ChildClassType>
    130 inline static bool compareCSSValues(const CSSValue& first, const CSSValue& second)
    131 {
    132     return static_cast<const ChildClassType&>(first).equals(static_cast<const ChildClassType&>(second));
    133 }
    134 
    135 bool CSSValue::equals(const CSSValue& other) const
    136 {
    137     if (m_isTextClone) {
    138         ASSERT(isCSSOMSafe());
    139         return toTextCloneCSSValue(this)->cssText() == other.cssText();
    140     }
    141 
    142     if (m_classType == other.m_classType) {
    143         switch (m_classType) {
    144         case AspectRatioClass:
    145             return compareCSSValues<CSSAspectRatioValue>(*this, other);
    146         case BorderImageSliceClass:
    147             return compareCSSValues<CSSBorderImageSliceValue>(*this, other);
    148         case CanvasClass:
    149             return compareCSSValues<CSSCanvasValue>(*this, other);
    150         case CursorImageClass:
    151             return compareCSSValues<CSSCursorImageValue>(*this, other);
    152         case FontClass:
    153             return compareCSSValues<CSSFontValue>(*this, other);
    154         case FontFaceSrcClass:
    155             return compareCSSValues<CSSFontFaceSrcValue>(*this, other);
    156         case FontFeatureClass:
    157             return compareCSSValues<CSSFontFeatureValue>(*this, other);
    158         case FunctionClass:
    159             return compareCSSValues<CSSFunctionValue>(*this, other);
    160         case LinearGradientClass:
    161             return compareCSSValues<CSSLinearGradientValue>(*this, other);
    162         case RadialGradientClass:
    163             return compareCSSValues<CSSRadialGradientValue>(*this, other);
    164         case CrossfadeClass:
    165             return compareCSSValues<CSSCrossfadeValue>(*this, other);
    166         case ImageClass:
    167             return compareCSSValues<CSSImageValue>(*this, other);
    168         case InheritedClass:
    169             return compareCSSValues<CSSInheritedValue>(*this, other);
    170         case InitialClass:
    171             return compareCSSValues<CSSInitialValue>(*this, other);
    172         case GridLineNamesClass:
    173             return compareCSSValues<CSSGridLineNamesValue>(*this, other);
    174         case GridTemplateAreasClass:
    175             return compareCSSValues<CSSGridTemplateAreasValue>(*this, other);
    176         case PrimitiveClass:
    177             return compareCSSValues<CSSPrimitiveValue>(*this, other);
    178         case ReflectClass:
    179             return compareCSSValues<CSSReflectValue>(*this, other);
    180         case ShadowClass:
    181             return compareCSSValues<CSSShadowValue>(*this, other);
    182         case CubicBezierTimingFunctionClass:
    183             return compareCSSValues<CSSCubicBezierTimingFunctionValue>(*this, other);
    184         case StepsTimingFunctionClass:
    185             return compareCSSValues<CSSStepsTimingFunctionValue>(*this, other);
    186         case UnicodeRangeClass:
    187             return compareCSSValues<CSSUnicodeRangeValue>(*this, other);
    188         case ValueListClass:
    189             return compareCSSValues<CSSValueList>(*this, other);
    190         case CSSTransformClass:
    191             return compareCSSValues<CSSTransformValue>(*this, other);
    192         case LineBoxContainClass:
    193             return compareCSSValues<CSSLineBoxContainValue>(*this, other);
    194         case CalculationClass:
    195             return compareCSSValues<CSSCalcValue>(*this, other);
    196         case ImageSetClass:
    197             return compareCSSValues<CSSImageSetValue>(*this, other);
    198         case CSSFilterClass:
    199             return compareCSSValues<CSSFilterValue>(*this, other);
    200         case CSSArrayFunctionValueClass:
    201             return compareCSSValues<CSSArrayFunctionValue>(*this, other);
    202         case SVGPaintClass:
    203             return compareCSSValues<SVGPaint>(*this, other);
    204         case CSSSVGDocumentClass:
    205             return compareCSSValues<CSSSVGDocumentValue>(*this, other);
    206         default:
    207             ASSERT_NOT_REACHED();
    208             return false;
    209         }
    210     } else if (m_classType == ValueListClass && other.m_classType != ValueListClass)
    211         return toCSSValueList(this)->equals(other);
    212     else if (m_classType != ValueListClass && other.m_classType == ValueListClass)
    213         return static_cast<const CSSValueList&>(other).equals(*this);
    214     return false;
    215 }
    216 
    217 String CSSValue::cssText() const
    218 {
    219     if (m_isTextClone) {
    220          ASSERT(isCSSOMSafe());
    221         return toTextCloneCSSValue(this)->cssText();
    222     }
    223     ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
    224 
    225     switch (classType()) {
    226     case AspectRatioClass:
    227         return toCSSAspectRatioValue(this)->customCSSText();
    228     case BorderImageSliceClass:
    229         return toCSSBorderImageSliceValue(this)->customCSSText();
    230     case CanvasClass:
    231         return toCSSCanvasValue(this)->customCSSText();
    232     case CursorImageClass:
    233         return toCSSCursorImageValue(this)->customCSSText();
    234     case FontClass:
    235         return toCSSFontValue(this)->customCSSText();
    236     case FontFaceSrcClass:
    237         return toCSSFontFaceSrcValue(this)->customCSSText();
    238     case FontFeatureClass:
    239         return toCSSFontFeatureValue(this)->customCSSText();
    240     case FunctionClass:
    241         return toCSSFunctionValue(this)->customCSSText();
    242     case LinearGradientClass:
    243         return toCSSLinearGradientValue(this)->customCSSText();
    244     case RadialGradientClass:
    245         return toCSSRadialGradientValue(this)->customCSSText();
    246     case CrossfadeClass:
    247         return toCSSCrossfadeValue(this)->customCSSText();
    248     case ImageClass:
    249         return toCSSImageValue(this)->customCSSText();
    250     case InheritedClass:
    251         return toCSSInheritedValue(this)->customCSSText();
    252     case InitialClass:
    253         return toCSSInitialValue(this)->customCSSText();
    254     case GridLineNamesClass:
    255         return toCSSGridLineNamesValue(this)->customCSSText();
    256     case GridTemplateAreasClass:
    257         return toCSSGridTemplateAreasValue(this)->customCSSText();
    258     case PrimitiveClass:
    259         return toCSSPrimitiveValue(this)->customCSSText();
    260     case ReflectClass:
    261         return toCSSReflectValue(this)->customCSSText();
    262     case ShadowClass:
    263         return toCSSShadowValue(this)->customCSSText();
    264     case CubicBezierTimingFunctionClass:
    265         return toCSSCubicBezierTimingFunctionValue(this)->customCSSText();
    266     case StepsTimingFunctionClass:
    267         return toCSSStepsTimingFunctionValue(this)->customCSSText();
    268     case UnicodeRangeClass:
    269         return toCSSUnicodeRangeValue(this)->customCSSText();
    270     case ValueListClass:
    271         return toCSSValueList(this)->customCSSText();
    272     case CSSTransformClass:
    273         return toCSSTransformValue(this)->customCSSText();
    274     case LineBoxContainClass:
    275         return toCSSLineBoxContainValue(this)->customCSSText();
    276     case CalculationClass:
    277         return toCSSCalcValue(this)->customCSSText();
    278     case ImageSetClass:
    279         return toCSSImageSetValue(this)->customCSSText();
    280     case CSSFilterClass:
    281         return toCSSFilterValue(this)->customCSSText();
    282     case CSSArrayFunctionValueClass:
    283         return toCSSArrayFunctionValue(this)->customCSSText();
    284     case SVGPaintClass:
    285         return toSVGPaint(this)->customCSSText();
    286     case CSSSVGDocumentClass:
    287         return toCSSSVGDocumentValue(this)->customCSSText();
    288     }
    289     ASSERT_NOT_REACHED();
    290     return String();
    291 }
    292 
    293 void CSSValue::destroy()
    294 {
    295     if (m_isTextClone) {
    296         ASSERT(isCSSOMSafe());
    297         delete toTextCloneCSSValue(this);
    298         return;
    299     }
    300     ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
    301 
    302     switch (classType()) {
    303     case AspectRatioClass:
    304         delete toCSSAspectRatioValue(this);
    305         return;
    306     case BorderImageSliceClass:
    307         delete toCSSBorderImageSliceValue(this);
    308         return;
    309     case CanvasClass:
    310         delete toCSSCanvasValue(this);
    311         return;
    312     case CursorImageClass:
    313         delete toCSSCursorImageValue(this);
    314         return;
    315     case FontClass:
    316         delete toCSSFontValue(this);
    317         return;
    318     case FontFaceSrcClass:
    319         delete toCSSFontFaceSrcValue(this);
    320         return;
    321     case FontFeatureClass:
    322         delete toCSSFontFeatureValue(this);
    323         return;
    324     case FunctionClass:
    325         delete toCSSFunctionValue(this);
    326         return;
    327     case LinearGradientClass:
    328         delete toCSSLinearGradientValue(this);
    329         return;
    330     case RadialGradientClass:
    331         delete toCSSRadialGradientValue(this);
    332         return;
    333     case CrossfadeClass:
    334         delete toCSSCrossfadeValue(this);
    335         return;
    336     case ImageClass:
    337         delete toCSSImageValue(this);
    338         return;
    339     case InheritedClass:
    340         delete toCSSInheritedValue(this);
    341         return;
    342     case InitialClass:
    343         delete toCSSInitialValue(this);
    344         return;
    345     case GridLineNamesClass:
    346         delete toCSSGridLineNamesValue(this);
    347         return;
    348     case GridTemplateAreasClass:
    349         delete toCSSGridTemplateAreasValue(this);
    350         return;
    351     case PrimitiveClass:
    352         delete toCSSPrimitiveValue(this);
    353         return;
    354     case ReflectClass:
    355         delete toCSSReflectValue(this);
    356         return;
    357     case ShadowClass:
    358         delete toCSSShadowValue(this);
    359         return;
    360     case CubicBezierTimingFunctionClass:
    361         delete toCSSCubicBezierTimingFunctionValue(this);
    362         return;
    363     case StepsTimingFunctionClass:
    364         delete toCSSStepsTimingFunctionValue(this);
    365         return;
    366     case UnicodeRangeClass:
    367         delete toCSSUnicodeRangeValue(this);
    368         return;
    369     case ValueListClass:
    370         delete toCSSValueList(this);
    371         return;
    372     case CSSTransformClass:
    373         delete toCSSTransformValue(this);
    374         return;
    375     case LineBoxContainClass:
    376         delete toCSSLineBoxContainValue(this);
    377         return;
    378     case CalculationClass:
    379         delete toCSSCalcValue(this);
    380         return;
    381     case ImageSetClass:
    382         delete toCSSImageSetValue(this);
    383         return;
    384     case CSSFilterClass:
    385         delete toCSSFilterValue(this);
    386         return;
    387     case CSSArrayFunctionValueClass:
    388         delete toCSSArrayFunctionValue(this);
    389         return;
    390     case SVGPaintClass:
    391         delete toSVGPaint(this);
    392         return;
    393     case CSSSVGDocumentClass:
    394         delete toCSSSVGDocumentValue(this);
    395         return;
    396     }
    397     ASSERT_NOT_REACHED();
    398 }
    399 
    400 void CSSValue::finalizeGarbageCollectedObject()
    401 {
    402     if (m_isTextClone) {
    403         ASSERT(isCSSOMSafe());
    404         static_cast<TextCloneCSSValue*>(this)->~TextCloneCSSValue();
    405         return;
    406     }
    407     ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
    408 
    409     switch (classType()) {
    410     case AspectRatioClass:
    411         toCSSAspectRatioValue(this)->~CSSAspectRatioValue();
    412         return;
    413     case BorderImageSliceClass:
    414         toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue();
    415         return;
    416     case CanvasClass:
    417         toCSSCanvasValue(this)->~CSSCanvasValue();
    418         return;
    419     case CursorImageClass:
    420         toCSSCursorImageValue(this)->~CSSCursorImageValue();
    421         return;
    422     case FontClass:
    423         toCSSFontValue(this)->~CSSFontValue();
    424         return;
    425     case FontFaceSrcClass:
    426         toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue();
    427         return;
    428     case FontFeatureClass:
    429         toCSSFontFeatureValue(this)->~CSSFontFeatureValue();
    430         return;
    431     case FunctionClass:
    432         toCSSFunctionValue(this)->~CSSFunctionValue();
    433         return;
    434     case LinearGradientClass:
    435         toCSSLinearGradientValue(this)->~CSSLinearGradientValue();
    436         return;
    437     case RadialGradientClass:
    438         toCSSRadialGradientValue(this)->~CSSRadialGradientValue();
    439         return;
    440     case CrossfadeClass:
    441         toCSSCrossfadeValue(this)->~CSSCrossfadeValue();
    442         return;
    443     case ImageClass:
    444         toCSSImageValue(this)->~CSSImageValue();
    445         return;
    446     case InheritedClass:
    447         toCSSInheritedValue(this)->~CSSInheritedValue();
    448         return;
    449     case InitialClass:
    450         toCSSInitialValue(this)->~CSSInitialValue();
    451         return;
    452     case GridLineNamesClass:
    453         toCSSGridLineNamesValue(this)->~CSSGridLineNamesValue();
    454         return;
    455     case GridTemplateAreasClass:
    456         toCSSGridTemplateAreasValue(this)->~CSSGridTemplateAreasValue();
    457         return;
    458     case PrimitiveClass:
    459         toCSSPrimitiveValue(this)->~CSSPrimitiveValue();
    460         return;
    461     case ReflectClass:
    462         toCSSReflectValue(this)->~CSSReflectValue();
    463         return;
    464     case ShadowClass:
    465         toCSSShadowValue(this)->~CSSShadowValue();
    466         return;
    467     case CubicBezierTimingFunctionClass:
    468         toCSSCubicBezierTimingFunctionValue(this)->~CSSCubicBezierTimingFunctionValue();
    469         return;
    470     case StepsTimingFunctionClass:
    471         toCSSStepsTimingFunctionValue(this)->~CSSStepsTimingFunctionValue();
    472         return;
    473     case UnicodeRangeClass:
    474         toCSSUnicodeRangeValue(this)->~CSSUnicodeRangeValue();
    475         return;
    476     case ValueListClass:
    477         toCSSValueList(this)->~CSSValueList();
    478         return;
    479     case CSSTransformClass:
    480         toCSSTransformValue(this)->~CSSTransformValue();
    481         return;
    482     case LineBoxContainClass:
    483         toCSSLineBoxContainValue(this)->~CSSLineBoxContainValue();
    484         return;
    485     case CalculationClass:
    486         toCSSCalcValue(this)->~CSSCalcValue();
    487         return;
    488     case ImageSetClass:
    489         toCSSImageSetValue(this)->~CSSImageSetValue();
    490         return;
    491     case CSSFilterClass:
    492         toCSSFilterValue(this)->~CSSFilterValue();
    493         return;
    494     case CSSArrayFunctionValueClass:
    495         toCSSArrayFunctionValue(this)->~CSSArrayFunctionValue();
    496         return;
    497     case SVGPaintClass:
    498         toSVGPaint(this)->~SVGPaint();
    499         return;
    500     case CSSSVGDocumentClass:
    501         toCSSSVGDocumentValue(this)->~CSSSVGDocumentValue();
    502         return;
    503     }
    504     ASSERT_NOT_REACHED();
    505 }
    506 
    507 void CSSValue::trace(Visitor* visitor)
    508 {
    509     if (m_isTextClone) {
    510         ASSERT(isCSSOMSafe());
    511         static_cast<TextCloneCSSValue*>(this)->traceAfterDispatch(visitor);
    512         return;
    513     }
    514     ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
    515 
    516     switch (classType()) {
    517     case AspectRatioClass:
    518         toCSSAspectRatioValue(this)->traceAfterDispatch(visitor);
    519         return;
    520     case BorderImageSliceClass:
    521         toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor);
    522         return;
    523     case CanvasClass:
    524         toCSSCanvasValue(this)->traceAfterDispatch(visitor);
    525         return;
    526     case CursorImageClass:
    527         toCSSCursorImageValue(this)->traceAfterDispatch(visitor);
    528         return;
    529     case FontClass:
    530         toCSSFontValue(this)->traceAfterDispatch(visitor);
    531         return;
    532     case FontFaceSrcClass:
    533         toCSSFontFaceSrcValue(this)->traceAfterDispatch(visitor);
    534         return;
    535     case FontFeatureClass:
    536         toCSSFontFeatureValue(this)->traceAfterDispatch(visitor);
    537         return;
    538     case FunctionClass:
    539         toCSSFunctionValue(this)->traceAfterDispatch(visitor);
    540         return;
    541     case LinearGradientClass:
    542         toCSSLinearGradientValue(this)->traceAfterDispatch(visitor);
    543         return;
    544     case RadialGradientClass:
    545         toCSSRadialGradientValue(this)->traceAfterDispatch(visitor);
    546         return;
    547     case CrossfadeClass:
    548         toCSSCrossfadeValue(this)->traceAfterDispatch(visitor);
    549         return;
    550     case ImageClass:
    551         toCSSImageValue(this)->traceAfterDispatch(visitor);
    552         return;
    553     case InheritedClass:
    554         toCSSInheritedValue(this)->traceAfterDispatch(visitor);
    555         return;
    556     case InitialClass:
    557         toCSSInitialValue(this)->traceAfterDispatch(visitor);
    558         return;
    559     case GridLineNamesClass:
    560         toCSSGridLineNamesValue(this)->traceAfterDispatch(visitor);
    561         return;
    562     case GridTemplateAreasClass:
    563         toCSSGridTemplateAreasValue(this)->traceAfterDispatch(visitor);
    564         return;
    565     case PrimitiveClass:
    566         toCSSPrimitiveValue(this)->traceAfterDispatch(visitor);
    567         return;
    568     case ReflectClass:
    569         toCSSReflectValue(this)->traceAfterDispatch(visitor);
    570         return;
    571     case ShadowClass:
    572         toCSSShadowValue(this)->traceAfterDispatch(visitor);
    573         return;
    574     case CubicBezierTimingFunctionClass:
    575         toCSSCubicBezierTimingFunctionValue(this)->traceAfterDispatch(visitor);
    576         return;
    577     case StepsTimingFunctionClass:
    578         toCSSStepsTimingFunctionValue(this)->traceAfterDispatch(visitor);
    579         return;
    580     case UnicodeRangeClass:
    581         toCSSUnicodeRangeValue(this)->traceAfterDispatch(visitor);
    582         return;
    583     case ValueListClass:
    584         toCSSValueList(this)->traceAfterDispatch(visitor);
    585         return;
    586     case CSSTransformClass:
    587         toCSSTransformValue(this)->traceAfterDispatch(visitor);
    588         return;
    589     case LineBoxContainClass:
    590         toCSSLineBoxContainValue(this)->traceAfterDispatch(visitor);
    591         return;
    592     case CalculationClass:
    593         toCSSCalcValue(this)->traceAfterDispatch(visitor);
    594         return;
    595     case ImageSetClass:
    596         toCSSImageSetValue(this)->traceAfterDispatch(visitor);
    597         return;
    598     case CSSFilterClass:
    599         toCSSFilterValue(this)->traceAfterDispatch(visitor);
    600         return;
    601     case CSSArrayFunctionValueClass:
    602         toCSSArrayFunctionValue(this)->traceAfterDispatch(visitor);
    603         return;
    604     case SVGPaintClass:
    605         toSVGPaint(this)->traceAfterDispatch(visitor);
    606         return;
    607     case CSSSVGDocumentClass:
    608         toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor);
    609         return;
    610     }
    611     ASSERT_NOT_REACHED();
    612 }
    613 
    614 PassRefPtrWillBeRawPtr<CSSValue> CSSValue::cloneForCSSOM() const
    615 {
    616     switch (classType()) {
    617     case PrimitiveClass:
    618         return toCSSPrimitiveValue(this)->cloneForCSSOM();
    619     case ValueListClass:
    620         return toCSSValueList(this)->cloneForCSSOM();
    621     case ImageClass:
    622     case CursorImageClass:
    623         return toCSSImageValue(this)->cloneForCSSOM();
    624     case CSSFilterClass:
    625         return toCSSFilterValue(this)->cloneForCSSOM();
    626     case CSSArrayFunctionValueClass:
    627         return toCSSArrayFunctionValue(this)->cloneForCSSOM();
    628     case CSSTransformClass:
    629         return toCSSTransformValue(this)->cloneForCSSOM();
    630     case ImageSetClass:
    631         return toCSSImageSetValue(this)->cloneForCSSOM();
    632     case SVGPaintClass:
    633         return toSVGPaint(this)->cloneForCSSOM();
    634     default:
    635         ASSERT(!isSubtypeExposedToCSSOM());
    636         return TextCloneCSSValue::create(classType(), cssText());
    637     }
    638 }
    639 
    640 }
    641