Home | History | Annotate | Download | only in css
      1 /*
      2  * Copyright (C) 2007 Alexey Proskuryakov <ap (at) nypop.com>.
      3  * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
      4  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
      5  * Copyright (C) 2009 Jeff Schiller <codedread (at) gmail.com>
      6  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  *
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 #ifndef CSSPrimitiveValueMappings_h
     31 #define CSSPrimitiveValueMappings_h
     32 
     33 #include "core/CSSValueKeywords.h"
     34 #include "core/css/CSSCalculationValue.h"
     35 #include "core/css/CSSPrimitiveValue.h"
     36 #include "core/css/CSSReflectionDirection.h"
     37 #include "core/css/CSSToLengthConversionData.h"
     38 #include "core/rendering/style/LineClampValue.h"
     39 #include "core/rendering/style/RenderStyleConstants.h"
     40 #include "core/rendering/style/SVGRenderStyleDefs.h"
     41 #include "platform/Length.h"
     42 #include "platform/ThemeTypes.h"
     43 #include "platform/fonts/FontDescription.h"
     44 #include "platform/fonts/FontSmoothingMode.h"
     45 #include "platform/fonts/TextRenderingMode.h"
     46 #include "platform/graphics/GraphicsTypes.h"
     47 #include "platform/graphics/Path.h"
     48 #include "platform/scroll/ScrollableArea.h"
     49 #include "platform/text/TextDirection.h"
     50 #include "platform/text/UnicodeBidi.h"
     51 #include "platform/text/WritingMode.h"
     52 #include "wtf/MathExtras.h"
     53 
     54 namespace blink {
     55 
     56 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(short i)
     57     : CSSValue(PrimitiveClass)
     58 {
     59     m_primitiveUnitType = CSS_NUMBER;
     60     m_value.num = static_cast<double>(i);
     61 }
     62 
     63 template<> inline CSSPrimitiveValue::operator short() const
     64 {
     65     ASSERT(isNumber());
     66     return clampTo<short>(getDoubleValue());
     67 }
     68 
     69 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(unsigned short i)
     70     : CSSValue(PrimitiveClass)
     71 {
     72     m_primitiveUnitType = CSS_NUMBER;
     73     m_value.num = static_cast<double>(i);
     74 }
     75 
     76 template<> inline CSSPrimitiveValue::operator unsigned short() const
     77 {
     78     ASSERT(isNumber());
     79     return clampTo<unsigned short>(getDoubleValue());
     80 }
     81 
     82 template<> inline CSSPrimitiveValue::operator int() const
     83 {
     84     ASSERT(isNumber());
     85     return clampTo<int>(getDoubleValue());
     86 }
     87 
     88 template<> inline CSSPrimitiveValue::operator unsigned() const
     89 {
     90     ASSERT(isNumber());
     91     return clampTo<unsigned>(getDoubleValue());
     92 }
     93 
     94 
     95 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(float i)
     96     : CSSValue(PrimitiveClass)
     97 {
     98     m_primitiveUnitType = CSS_NUMBER;
     99     m_value.num = static_cast<double>(i);
    100 }
    101 
    102 template<> inline CSSPrimitiveValue::operator float() const
    103 {
    104     ASSERT(isNumber());
    105     return clampTo<float>(getDoubleValue());
    106 }
    107 
    108 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineClampValue i)
    109     : CSSValue(PrimitiveClass)
    110 {
    111     m_primitiveUnitType = i.isPercentage() ? CSS_PERCENTAGE : CSS_NUMBER;
    112     m_value.num = static_cast<double>(i.value());
    113 }
    114 
    115 template<> inline CSSPrimitiveValue::operator LineClampValue() const
    116 {
    117     if (m_primitiveUnitType == CSS_NUMBER)
    118         return LineClampValue(clampTo<int>(m_value.num), LineClampLineCount);
    119 
    120     if (m_primitiveUnitType == CSS_PERCENTAGE)
    121         return LineClampValue(clampTo<int>(m_value.num), LineClampPercentage);
    122 
    123     ASSERT_NOT_REACHED();
    124     return LineClampValue();
    125 }
    126 
    127 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(CSSReflectionDirection e)
    128     : CSSValue(PrimitiveClass)
    129 {
    130     m_primitiveUnitType = CSS_VALUE_ID;
    131     switch (e) {
    132     case ReflectionAbove:
    133         m_value.valueID = CSSValueAbove;
    134         break;
    135     case ReflectionBelow:
    136         m_value.valueID = CSSValueBelow;
    137         break;
    138     case ReflectionLeft:
    139         m_value.valueID = CSSValueLeft;
    140         break;
    141     case ReflectionRight:
    142         m_value.valueID = CSSValueRight;
    143     }
    144 }
    145 
    146 template<> inline CSSPrimitiveValue::operator CSSReflectionDirection() const
    147 {
    148     ASSERT(isValueID());
    149     switch (m_value.valueID) {
    150     case CSSValueAbove:
    151         return ReflectionAbove;
    152     case CSSValueBelow:
    153         return ReflectionBelow;
    154     case CSSValueLeft:
    155         return ReflectionLeft;
    156     case CSSValueRight:
    157         return ReflectionRight;
    158     default:
    159         break;
    160     }
    161 
    162     ASSERT_NOT_REACHED();
    163     return ReflectionBelow;
    164 }
    165 
    166 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ColumnFill columnFill)
    167     : CSSValue(PrimitiveClass)
    168 {
    169     m_primitiveUnitType = CSS_VALUE_ID;
    170     switch (columnFill) {
    171     case ColumnFillAuto:
    172         m_value.valueID = CSSValueAuto;
    173         break;
    174     case ColumnFillBalance:
    175         m_value.valueID = CSSValueBalance;
    176         break;
    177     }
    178 }
    179 
    180 template<> inline CSSPrimitiveValue::operator ColumnFill() const
    181 {
    182     if (m_primitiveUnitType == CSS_VALUE_ID) {
    183         if (m_value.valueID == CSSValueBalance)
    184             return ColumnFillBalance;
    185         if (m_value.valueID == CSSValueAuto)
    186             return ColumnFillAuto;
    187     }
    188     ASSERT_NOT_REACHED();
    189     return ColumnFillBalance;
    190 }
    191 
    192 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ColumnSpan columnSpan)
    193     : CSSValue(PrimitiveClass)
    194 {
    195     m_primitiveUnitType = CSS_VALUE_ID;
    196     switch (columnSpan) {
    197     case ColumnSpanAll:
    198         m_value.valueID = CSSValueAll;
    199         break;
    200     case ColumnSpanNone:
    201         m_value.valueID = CSSValueNone;
    202         break;
    203     }
    204 }
    205 
    206 template<> inline CSSPrimitiveValue::operator ColumnSpan() const
    207 {
    208     // Map 1 to none for compatibility reasons.
    209     if (m_primitiveUnitType == CSS_NUMBER && m_value.num == 1)
    210         return ColumnSpanNone;
    211 
    212     ASSERT(isValueID());
    213     switch (m_value.valueID) {
    214     case CSSValueAll:
    215         return ColumnSpanAll;
    216     case CSSValueNone:
    217         return ColumnSpanNone;
    218     default:
    219         break;
    220     }
    221 
    222     ASSERT_NOT_REACHED();
    223     return ColumnSpanNone;
    224 }
    225 
    226 
    227 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(PrintColorAdjust value)
    228     : CSSValue(PrimitiveClass)
    229 {
    230     m_primitiveUnitType = CSS_VALUE_ID;
    231     switch (value) {
    232     case PrintColorAdjustExact:
    233         m_value.valueID = CSSValueExact;
    234         break;
    235     case PrintColorAdjustEconomy:
    236         m_value.valueID = CSSValueEconomy;
    237         break;
    238     }
    239 }
    240 
    241 template<> inline CSSPrimitiveValue::operator PrintColorAdjust() const
    242 {
    243     ASSERT(isValueID());
    244     switch (m_value.valueID) {
    245     case CSSValueEconomy:
    246         return PrintColorAdjustEconomy;
    247     case CSSValueExact:
    248         return PrintColorAdjustExact;
    249     default:
    250         break;
    251     }
    252 
    253     ASSERT_NOT_REACHED();
    254     return PrintColorAdjustEconomy;
    255 }
    256 
    257 
    258 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBorderStyle e)
    259     : CSSValue(PrimitiveClass)
    260 {
    261     m_primitiveUnitType = CSS_VALUE_ID;
    262     switch (e) {
    263     case BNONE:
    264         m_value.valueID = CSSValueNone;
    265         break;
    266     case BHIDDEN:
    267         m_value.valueID = CSSValueHidden;
    268         break;
    269     case INSET:
    270         m_value.valueID = CSSValueInset;
    271         break;
    272     case GROOVE:
    273         m_value.valueID = CSSValueGroove;
    274         break;
    275     case RIDGE:
    276         m_value.valueID = CSSValueRidge;
    277         break;
    278     case OUTSET:
    279         m_value.valueID = CSSValueOutset;
    280         break;
    281     case DOTTED:
    282         m_value.valueID = CSSValueDotted;
    283         break;
    284     case DASHED:
    285         m_value.valueID = CSSValueDashed;
    286         break;
    287     case SOLID:
    288         m_value.valueID = CSSValueSolid;
    289         break;
    290     case DOUBLE:
    291         m_value.valueID = CSSValueDouble;
    292         break;
    293     }
    294 }
    295 
    296 template<> inline CSSPrimitiveValue::operator EBorderStyle() const
    297 {
    298     ASSERT(isValueID());
    299     if (m_value.valueID == CSSValueAuto) // Valid for CSS outline-style
    300         return DOTTED;
    301     return (EBorderStyle)(m_value.valueID - CSSValueNone);
    302 }
    303 
    304 template<> inline CSSPrimitiveValue::operator OutlineIsAuto() const
    305 {
    306     if (m_value.valueID == CSSValueAuto)
    307         return AUTO_ON;
    308     return AUTO_OFF;
    309 }
    310 
    311 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(CompositeOperator e)
    312     : CSSValue(PrimitiveClass)
    313 {
    314     m_primitiveUnitType = CSS_VALUE_ID;
    315     switch (e) {
    316     case CompositeClear:
    317         m_value.valueID = CSSValueClear;
    318         break;
    319     case CompositeCopy:
    320         m_value.valueID = CSSValueCopy;
    321         break;
    322     case CompositeSourceOver:
    323         m_value.valueID = CSSValueSourceOver;
    324         break;
    325     case CompositeSourceIn:
    326         m_value.valueID = CSSValueSourceIn;
    327         break;
    328     case CompositeSourceOut:
    329         m_value.valueID = CSSValueSourceOut;
    330         break;
    331     case CompositeSourceAtop:
    332         m_value.valueID = CSSValueSourceAtop;
    333         break;
    334     case CompositeDestinationOver:
    335         m_value.valueID = CSSValueDestinationOver;
    336         break;
    337     case CompositeDestinationIn:
    338         m_value.valueID = CSSValueDestinationIn;
    339         break;
    340     case CompositeDestinationOut:
    341         m_value.valueID = CSSValueDestinationOut;
    342         break;
    343     case CompositeDestinationAtop:
    344         m_value.valueID = CSSValueDestinationAtop;
    345         break;
    346     case CompositeXOR:
    347         m_value.valueID = CSSValueXor;
    348         break;
    349     case CompositePlusDarker:
    350         m_value.valueID = CSSValuePlusDarker;
    351         break;
    352     case CompositePlusLighter:
    353         m_value.valueID = CSSValuePlusLighter;
    354         break;
    355     case CompositeDifference:
    356         ASSERT_NOT_REACHED();
    357         break;
    358     }
    359 }
    360 
    361 template<> inline CSSPrimitiveValue::operator CompositeOperator() const
    362 {
    363     ASSERT(isValueID());
    364     switch (m_value.valueID) {
    365     case CSSValueClear:
    366         return CompositeClear;
    367     case CSSValueCopy:
    368         return CompositeCopy;
    369     case CSSValueSourceOver:
    370         return CompositeSourceOver;
    371     case CSSValueSourceIn:
    372         return CompositeSourceIn;
    373     case CSSValueSourceOut:
    374         return CompositeSourceOut;
    375     case CSSValueSourceAtop:
    376         return CompositeSourceAtop;
    377     case CSSValueDestinationOver:
    378         return CompositeDestinationOver;
    379     case CSSValueDestinationIn:
    380         return CompositeDestinationIn;
    381     case CSSValueDestinationOut:
    382         return CompositeDestinationOut;
    383     case CSSValueDestinationAtop:
    384         return CompositeDestinationAtop;
    385     case CSSValueXor:
    386         return CompositeXOR;
    387     case CSSValuePlusDarker:
    388         return CompositePlusDarker;
    389     case CSSValuePlusLighter:
    390         return CompositePlusLighter;
    391     default:
    392         break;
    393     }
    394 
    395     ASSERT_NOT_REACHED();
    396     return CompositeClear;
    397 }
    398 
    399 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ControlPart e)
    400     : CSSValue(PrimitiveClass)
    401 {
    402     m_primitiveUnitType = CSS_VALUE_ID;
    403     switch (e) {
    404     case NoControlPart:
    405         m_value.valueID = CSSValueNone;
    406         break;
    407     case CheckboxPart:
    408         m_value.valueID = CSSValueCheckbox;
    409         break;
    410     case RadioPart:
    411         m_value.valueID = CSSValueRadio;
    412         break;
    413     case PushButtonPart:
    414         m_value.valueID = CSSValuePushButton;
    415         break;
    416     case SquareButtonPart:
    417         m_value.valueID = CSSValueSquareButton;
    418         break;
    419     case ButtonPart:
    420         m_value.valueID = CSSValueButton;
    421         break;
    422     case ButtonBevelPart:
    423         m_value.valueID = CSSValueButtonBevel;
    424         break;
    425     case InnerSpinButtonPart:
    426         m_value.valueID = CSSValueInnerSpinButton;
    427         break;
    428     case ListboxPart:
    429         m_value.valueID = CSSValueListbox;
    430         break;
    431     case ListItemPart:
    432         m_value.valueID = CSSValueListitem;
    433         break;
    434     case MediaEnterFullscreenButtonPart:
    435         m_value.valueID = CSSValueMediaEnterFullscreenButton;
    436         break;
    437     case MediaExitFullscreenButtonPart:
    438         m_value.valueID = CSSValueMediaExitFullscreenButton;
    439         break;
    440     case MediaPlayButtonPart:
    441         m_value.valueID = CSSValueMediaPlayButton;
    442         break;
    443     case MediaOverlayPlayButtonPart:
    444         m_value.valueID = CSSValueMediaOverlayPlayButton;
    445         break;
    446     case MediaMuteButtonPart:
    447         m_value.valueID = CSSValueMediaMuteButton;
    448         break;
    449     case MediaToggleClosedCaptionsButtonPart:
    450         m_value.valueID = CSSValueMediaToggleClosedCaptionsButton;
    451         break;
    452     case MediaCastOffButtonPart:
    453         m_value.valueID = CSSValueInternalMediaCastOffButton;
    454         break;
    455     case MediaOverlayCastOffButtonPart:
    456         m_value.valueID = CSSValueInternalMediaOverlayCastOffButton;
    457         break;
    458     case MediaSliderPart:
    459         m_value.valueID = CSSValueMediaSlider;
    460         break;
    461     case MediaSliderThumbPart:
    462         m_value.valueID = CSSValueMediaSliderthumb;
    463         break;
    464     case MediaVolumeSliderContainerPart:
    465         m_value.valueID = CSSValueMediaVolumeSliderContainer;
    466         break;
    467     case MediaVolumeSliderPart:
    468         m_value.valueID = CSSValueMediaVolumeSlider;
    469         break;
    470     case MediaVolumeSliderThumbPart:
    471         m_value.valueID = CSSValueMediaVolumeSliderthumb;
    472         break;
    473     case MediaControlsBackgroundPart:
    474         m_value.valueID = CSSValueMediaControlsBackground;
    475         break;
    476     case MediaControlsFullscreenBackgroundPart:
    477         m_value.valueID = CSSValueMediaControlsFullscreenBackground;
    478         break;
    479     case MediaFullScreenVolumeSliderPart:
    480         m_value.valueID = CSSValueMediaFullscreenVolumeSlider;
    481         break;
    482     case MediaFullScreenVolumeSliderThumbPart:
    483         m_value.valueID = CSSValueMediaFullscreenVolumeSliderThumb;
    484         break;
    485     case MediaCurrentTimePart:
    486         m_value.valueID = CSSValueMediaCurrentTimeDisplay;
    487         break;
    488     case MediaTimeRemainingPart:
    489         m_value.valueID = CSSValueMediaTimeRemainingDisplay;
    490         break;
    491     case MenulistPart:
    492         m_value.valueID = CSSValueMenulist;
    493         break;
    494     case MenulistButtonPart:
    495         m_value.valueID = CSSValueMenulistButton;
    496         break;
    497     case MenulistTextPart:
    498         m_value.valueID = CSSValueMenulistText;
    499         break;
    500     case MenulistTextFieldPart:
    501         m_value.valueID = CSSValueMenulistTextfield;
    502         break;
    503     case MeterPart:
    504         m_value.valueID = CSSValueMeter;
    505         break;
    506     case RelevancyLevelIndicatorPart:
    507         m_value.valueID = CSSValueRelevancyLevelIndicator;
    508         break;
    509     case ContinuousCapacityLevelIndicatorPart:
    510         m_value.valueID = CSSValueContinuousCapacityLevelIndicator;
    511         break;
    512     case DiscreteCapacityLevelIndicatorPart:
    513         m_value.valueID = CSSValueDiscreteCapacityLevelIndicator;
    514         break;
    515     case RatingLevelIndicatorPart:
    516         m_value.valueID = CSSValueRatingLevelIndicator;
    517         break;
    518     case ProgressBarPart:
    519         m_value.valueID = CSSValueProgressBar;
    520         break;
    521     case ProgressBarValuePart:
    522         m_value.valueID = CSSValueProgressBarValue;
    523         break;
    524     case SliderHorizontalPart:
    525         m_value.valueID = CSSValueSliderHorizontal;
    526         break;
    527     case SliderVerticalPart:
    528         m_value.valueID = CSSValueSliderVertical;
    529         break;
    530     case SliderThumbHorizontalPart:
    531         m_value.valueID = CSSValueSliderthumbHorizontal;
    532         break;
    533     case SliderThumbVerticalPart:
    534         m_value.valueID = CSSValueSliderthumbVertical;
    535         break;
    536     case CaretPart:
    537         m_value.valueID = CSSValueCaret;
    538         break;
    539     case SearchFieldPart:
    540         m_value.valueID = CSSValueSearchfield;
    541         break;
    542     case SearchFieldDecorationPart:
    543         m_value.valueID = CSSValueSearchfieldDecoration;
    544         break;
    545     case SearchFieldResultsDecorationPart:
    546         m_value.valueID = CSSValueSearchfieldResultsDecoration;
    547         break;
    548     case SearchFieldCancelButtonPart:
    549         m_value.valueID = CSSValueSearchfieldCancelButton;
    550         break;
    551     case TextFieldPart:
    552         m_value.valueID = CSSValueTextfield;
    553         break;
    554     case TextAreaPart:
    555         m_value.valueID = CSSValueTextarea;
    556         break;
    557     case CapsLockIndicatorPart:
    558         m_value.valueID = CSSValueCapsLockIndicator;
    559         break;
    560     }
    561 }
    562 
    563 template<> inline CSSPrimitiveValue::operator ControlPart() const
    564 {
    565     ASSERT(isValueID());
    566     if (m_value.valueID == CSSValueNone)
    567         return NoControlPart;
    568     return ControlPart(m_value.valueID - CSSValueCheckbox + 1);
    569 }
    570 
    571 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBackfaceVisibility e)
    572     : CSSValue(PrimitiveClass)
    573 {
    574     m_primitiveUnitType = CSS_VALUE_ID;
    575     switch (e) {
    576     case BackfaceVisibilityVisible:
    577         m_value.valueID = CSSValueVisible;
    578         break;
    579     case BackfaceVisibilityHidden:
    580         m_value.valueID = CSSValueHidden;
    581         break;
    582     }
    583 }
    584 
    585 template<> inline CSSPrimitiveValue::operator EBackfaceVisibility() const
    586 {
    587     ASSERT(isValueID());
    588     switch (m_value.valueID) {
    589     case CSSValueVisible:
    590         return BackfaceVisibilityVisible;
    591     case CSSValueHidden:
    592         return BackfaceVisibilityHidden;
    593     default:
    594         break;
    595     }
    596 
    597     ASSERT_NOT_REACHED();
    598     return BackfaceVisibilityHidden;
    599 }
    600 
    601 
    602 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillAttachment e)
    603     : CSSValue(PrimitiveClass)
    604 {
    605     m_primitiveUnitType = CSS_VALUE_ID;
    606     switch (e) {
    607     case ScrollBackgroundAttachment:
    608         m_value.valueID = CSSValueScroll;
    609         break;
    610     case LocalBackgroundAttachment:
    611         m_value.valueID = CSSValueLocal;
    612         break;
    613     case FixedBackgroundAttachment:
    614         m_value.valueID = CSSValueFixed;
    615         break;
    616     }
    617 }
    618 
    619 template<> inline CSSPrimitiveValue::operator EFillAttachment() const
    620 {
    621     ASSERT(isValueID());
    622     switch (m_value.valueID) {
    623     case CSSValueScroll:
    624         return ScrollBackgroundAttachment;
    625     case CSSValueLocal:
    626         return LocalBackgroundAttachment;
    627     case CSSValueFixed:
    628         return FixedBackgroundAttachment;
    629     default:
    630         break;
    631     }
    632 
    633     ASSERT_NOT_REACHED();
    634     return ScrollBackgroundAttachment;
    635 }
    636 
    637 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillBox e)
    638     : CSSValue(PrimitiveClass)
    639 {
    640     m_primitiveUnitType = CSS_VALUE_ID;
    641     switch (e) {
    642     case BorderFillBox:
    643         m_value.valueID = CSSValueBorderBox;
    644         break;
    645     case PaddingFillBox:
    646         m_value.valueID = CSSValuePaddingBox;
    647         break;
    648     case ContentFillBox:
    649         m_value.valueID = CSSValueContentBox;
    650         break;
    651     case TextFillBox:
    652         m_value.valueID = CSSValueText;
    653         break;
    654     }
    655 }
    656 
    657 template<> inline CSSPrimitiveValue::operator EFillBox() const
    658 {
    659     ASSERT(isValueID());
    660     switch (m_value.valueID) {
    661     case CSSValueBorder:
    662     case CSSValueBorderBox:
    663         return BorderFillBox;
    664     case CSSValuePadding:
    665     case CSSValuePaddingBox:
    666         return PaddingFillBox;
    667     case CSSValueContent:
    668     case CSSValueContentBox:
    669         return ContentFillBox;
    670     case CSSValueText:
    671     case CSSValueWebkitText:
    672         return TextFillBox;
    673     default:
    674         break;
    675     }
    676 
    677     ASSERT_NOT_REACHED();
    678     return BorderFillBox;
    679 }
    680 
    681 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillRepeat e)
    682     : CSSValue(PrimitiveClass)
    683 {
    684     m_primitiveUnitType = CSS_VALUE_ID;
    685     switch (e) {
    686     case RepeatFill:
    687         m_value.valueID = CSSValueRepeat;
    688         break;
    689     case NoRepeatFill:
    690         m_value.valueID = CSSValueNoRepeat;
    691         break;
    692     case RoundFill:
    693         m_value.valueID = CSSValueRound;
    694         break;
    695     case SpaceFill:
    696         m_value.valueID = CSSValueSpace;
    697         break;
    698     }
    699 }
    700 
    701 template<> inline CSSPrimitiveValue::operator EFillRepeat() const
    702 {
    703     ASSERT(isValueID());
    704     switch (m_value.valueID) {
    705     case CSSValueRepeat:
    706         return RepeatFill;
    707     case CSSValueNoRepeat:
    708         return NoRepeatFill;
    709     case CSSValueRound:
    710         return RoundFill;
    711     case CSSValueSpace:
    712         return SpaceFill;
    713     default:
    714         break;
    715     }
    716 
    717     ASSERT_NOT_REACHED();
    718     return RepeatFill;
    719 }
    720 
    721 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxPack e)
    722     : CSSValue(PrimitiveClass)
    723 {
    724     m_primitiveUnitType = CSS_VALUE_ID;
    725     switch (e) {
    726     case Start:
    727         m_value.valueID = CSSValueStart;
    728         break;
    729     case Center:
    730         m_value.valueID = CSSValueCenter;
    731         break;
    732     case End:
    733         m_value.valueID = CSSValueEnd;
    734         break;
    735     case Justify:
    736         m_value.valueID = CSSValueJustify;
    737         break;
    738     }
    739 }
    740 
    741 template<> inline CSSPrimitiveValue::operator EBoxPack() const
    742 {
    743     ASSERT(isValueID());
    744     switch (m_value.valueID) {
    745     case CSSValueStart:
    746         return Start;
    747     case CSSValueEnd:
    748         return End;
    749     case CSSValueCenter:
    750         return Center;
    751     case CSSValueJustify:
    752         return Justify;
    753     default:
    754         break;
    755     }
    756 
    757     ASSERT_NOT_REACHED();
    758     return Justify;
    759 }
    760 
    761 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxAlignment e)
    762     : CSSValue(PrimitiveClass)
    763 {
    764     m_primitiveUnitType = CSS_VALUE_ID;
    765     switch (e) {
    766     case BSTRETCH:
    767         m_value.valueID = CSSValueStretch;
    768         break;
    769     case BSTART:
    770         m_value.valueID = CSSValueStart;
    771         break;
    772     case BCENTER:
    773         m_value.valueID = CSSValueCenter;
    774         break;
    775     case BEND:
    776         m_value.valueID = CSSValueEnd;
    777         break;
    778     case BBASELINE:
    779         m_value.valueID = CSSValueBaseline;
    780         break;
    781     }
    782 }
    783 
    784 template<> inline CSSPrimitiveValue::operator EBoxAlignment() const
    785 {
    786     ASSERT(isValueID());
    787     switch (m_value.valueID) {
    788     case CSSValueStretch:
    789         return BSTRETCH;
    790     case CSSValueStart:
    791         return BSTART;
    792     case CSSValueEnd:
    793         return BEND;
    794     case CSSValueCenter:
    795         return BCENTER;
    796     case CSSValueBaseline:
    797         return BBASELINE;
    798     default:
    799         break;
    800     }
    801 
    802     ASSERT_NOT_REACHED();
    803     return BSTRETCH;
    804 }
    805 
    806 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxDecorationBreak e)
    807     : CSSValue(PrimitiveClass)
    808 {
    809     m_primitiveUnitType = CSS_VALUE_ID;
    810     switch (e) {
    811     case DSLICE:
    812         m_value.valueID = CSSValueSlice;
    813         break;
    814     case DCLONE:
    815         m_value.valueID = CSSValueClone;
    816         break;
    817     }
    818 }
    819 
    820 template<> inline CSSPrimitiveValue::operator EBoxDecorationBreak() const
    821 {
    822     ASSERT(isValueID());
    823     switch (m_value.valueID) {
    824     case CSSValueSlice:
    825         return DSLICE;
    826     case CSSValueClone:
    827         return DCLONE;
    828     default:
    829         break;
    830     }
    831 
    832     ASSERT_NOT_REACHED();
    833     return DSLICE;
    834 }
    835 
    836 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(BackgroundEdgeOrigin e)
    837     : CSSValue(PrimitiveClass)
    838 {
    839     m_primitiveUnitType = CSS_VALUE_ID;
    840     switch (e) {
    841     case TopEdge:
    842         m_value.valueID = CSSValueTop;
    843         break;
    844     case RightEdge:
    845         m_value.valueID = CSSValueRight;
    846         break;
    847     case BottomEdge:
    848         m_value.valueID = CSSValueBottom;
    849         break;
    850     case LeftEdge:
    851         m_value.valueID = CSSValueLeft;
    852         break;
    853     }
    854 }
    855 
    856 template<> inline CSSPrimitiveValue::operator BackgroundEdgeOrigin() const
    857 {
    858     ASSERT(isValueID());
    859     switch (m_value.valueID) {
    860     case CSSValueTop:
    861         return TopEdge;
    862     case CSSValueRight:
    863         return RightEdge;
    864     case CSSValueBottom:
    865         return BottomEdge;
    866     case CSSValueLeft:
    867         return LeftEdge;
    868     default:
    869         break;
    870     }
    871 
    872     ASSERT_NOT_REACHED();
    873     return TopEdge;
    874 }
    875 
    876 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxSizing e)
    877     : CSSValue(PrimitiveClass)
    878 {
    879     m_primitiveUnitType = CSS_VALUE_ID;
    880     switch (e) {
    881     case BORDER_BOX:
    882         m_value.valueID = CSSValueBorderBox;
    883         break;
    884     case CONTENT_BOX:
    885         m_value.valueID = CSSValueContentBox;
    886         break;
    887     }
    888 }
    889 
    890 template<> inline CSSPrimitiveValue::operator EBoxSizing() const
    891 {
    892     ASSERT(isValueID());
    893     switch (m_value.valueID) {
    894     case CSSValueBorderBox:
    895         return BORDER_BOX;
    896     case CSSValueContentBox:
    897         return CONTENT_BOX;
    898     default:
    899         break;
    900     }
    901 
    902     ASSERT_NOT_REACHED();
    903     return BORDER_BOX;
    904 }
    905 
    906 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxDirection e)
    907     : CSSValue(PrimitiveClass)
    908 {
    909     m_primitiveUnitType = CSS_VALUE_ID;
    910     switch (e) {
    911     case BNORMAL:
    912         m_value.valueID = CSSValueNormal;
    913         break;
    914     case BREVERSE:
    915         m_value.valueID = CSSValueReverse;
    916         break;
    917     }
    918 }
    919 
    920 template<> inline CSSPrimitiveValue::operator EBoxDirection() const
    921 {
    922     ASSERT(isValueID());
    923     switch (m_value.valueID) {
    924     case CSSValueNormal:
    925         return BNORMAL;
    926     case CSSValueReverse:
    927         return BREVERSE;
    928     default:
    929         break;
    930     }
    931 
    932     ASSERT_NOT_REACHED();
    933     return BNORMAL;
    934 }
    935 
    936 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxLines e)
    937     : CSSValue(PrimitiveClass)
    938 {
    939     m_primitiveUnitType = CSS_VALUE_ID;
    940     switch (e) {
    941     case SINGLE:
    942         m_value.valueID = CSSValueSingle;
    943         break;
    944     case MULTIPLE:
    945         m_value.valueID = CSSValueMultiple;
    946         break;
    947     }
    948 }
    949 
    950 template<> inline CSSPrimitiveValue::operator EBoxLines() const
    951 {
    952     ASSERT(isValueID());
    953     switch (m_value.valueID) {
    954     case CSSValueSingle:
    955         return SINGLE;
    956     case CSSValueMultiple:
    957         return MULTIPLE;
    958     default:
    959         break;
    960     }
    961 
    962     ASSERT_NOT_REACHED();
    963     return SINGLE;
    964 }
    965 
    966 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxOrient e)
    967     : CSSValue(PrimitiveClass)
    968 {
    969     m_primitiveUnitType = CSS_VALUE_ID;
    970     switch (e) {
    971     case HORIZONTAL:
    972         m_value.valueID = CSSValueHorizontal;
    973         break;
    974     case VERTICAL:
    975         m_value.valueID = CSSValueVertical;
    976         break;
    977     }
    978 }
    979 
    980 template<> inline CSSPrimitiveValue::operator EBoxOrient() const
    981 {
    982     ASSERT(isValueID());
    983     switch (m_value.valueID) {
    984     case CSSValueHorizontal:
    985     case CSSValueInlineAxis:
    986         return HORIZONTAL;
    987     case CSSValueVertical:
    988     case CSSValueBlockAxis:
    989         return VERTICAL;
    990     default:
    991         break;
    992     }
    993 
    994     ASSERT_NOT_REACHED();
    995     return HORIZONTAL;
    996 }
    997 
    998 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECaptionSide e)
    999     : CSSValue(PrimitiveClass)
   1000 {
   1001     m_primitiveUnitType = CSS_VALUE_ID;
   1002     switch (e) {
   1003     case CAPLEFT:
   1004         m_value.valueID = CSSValueLeft;
   1005         break;
   1006     case CAPRIGHT:
   1007         m_value.valueID = CSSValueRight;
   1008         break;
   1009     case CAPTOP:
   1010         m_value.valueID = CSSValueTop;
   1011         break;
   1012     case CAPBOTTOM:
   1013         m_value.valueID = CSSValueBottom;
   1014         break;
   1015     }
   1016 }
   1017 
   1018 template<> inline CSSPrimitiveValue::operator ECaptionSide() const
   1019 {
   1020     ASSERT(isValueID());
   1021     switch (m_value.valueID) {
   1022     case CSSValueLeft:
   1023         return CAPLEFT;
   1024     case CSSValueRight:
   1025         return CAPRIGHT;
   1026     case CSSValueTop:
   1027         return CAPTOP;
   1028     case CSSValueBottom:
   1029         return CAPBOTTOM;
   1030     default:
   1031         break;
   1032     }
   1033 
   1034     ASSERT_NOT_REACHED();
   1035     return CAPTOP;
   1036 }
   1037 
   1038 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EClear e)
   1039     : CSSValue(PrimitiveClass)
   1040 {
   1041     m_primitiveUnitType = CSS_VALUE_ID;
   1042     switch (e) {
   1043     case CNONE:
   1044         m_value.valueID = CSSValueNone;
   1045         break;
   1046     case CLEFT:
   1047         m_value.valueID = CSSValueLeft;
   1048         break;
   1049     case CRIGHT:
   1050         m_value.valueID = CSSValueRight;
   1051         break;
   1052     case CBOTH:
   1053         m_value.valueID = CSSValueBoth;
   1054         break;
   1055     }
   1056 }
   1057 
   1058 template<> inline CSSPrimitiveValue::operator EClear() const
   1059 {
   1060     ASSERT(isValueID());
   1061     switch (m_value.valueID) {
   1062     case CSSValueNone:
   1063         return CNONE;
   1064     case CSSValueLeft:
   1065         return CLEFT;
   1066     case CSSValueRight:
   1067         return CRIGHT;
   1068     case CSSValueBoth:
   1069         return CBOTH;
   1070     default:
   1071         break;
   1072     }
   1073 
   1074     ASSERT_NOT_REACHED();
   1075     return CNONE;
   1076 }
   1077 
   1078 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECursor e)
   1079     : CSSValue(PrimitiveClass)
   1080 {
   1081     m_primitiveUnitType = CSS_VALUE_ID;
   1082     switch (e) {
   1083     case CURSOR_AUTO:
   1084         m_value.valueID = CSSValueAuto;
   1085         break;
   1086     case CURSOR_CROSS:
   1087         m_value.valueID = CSSValueCrosshair;
   1088         break;
   1089     case CURSOR_DEFAULT:
   1090         m_value.valueID = CSSValueDefault;
   1091         break;
   1092     case CURSOR_POINTER:
   1093         m_value.valueID = CSSValuePointer;
   1094         break;
   1095     case CURSOR_MOVE:
   1096         m_value.valueID = CSSValueMove;
   1097         break;
   1098     case CURSOR_CELL:
   1099         m_value.valueID = CSSValueCell;
   1100         break;
   1101     case CURSOR_VERTICAL_TEXT:
   1102         m_value.valueID = CSSValueVerticalText;
   1103         break;
   1104     case CURSOR_CONTEXT_MENU:
   1105         m_value.valueID = CSSValueContextMenu;
   1106         break;
   1107     case CURSOR_ALIAS:
   1108         m_value.valueID = CSSValueAlias;
   1109         break;
   1110     case CURSOR_COPY:
   1111         m_value.valueID = CSSValueCopy;
   1112         break;
   1113     case CURSOR_NONE:
   1114         m_value.valueID = CSSValueNone;
   1115         break;
   1116     case CURSOR_PROGRESS:
   1117         m_value.valueID = CSSValueProgress;
   1118         break;
   1119     case CURSOR_NO_DROP:
   1120         m_value.valueID = CSSValueNoDrop;
   1121         break;
   1122     case CURSOR_NOT_ALLOWED:
   1123         m_value.valueID = CSSValueNotAllowed;
   1124         break;
   1125     case CURSOR_ZOOM_IN:
   1126         m_value.valueID = CSSValueZoomIn;
   1127         break;
   1128     case CURSOR_ZOOM_OUT:
   1129         m_value.valueID = CSSValueZoomOut;
   1130         break;
   1131     case CURSOR_E_RESIZE:
   1132         m_value.valueID = CSSValueEResize;
   1133         break;
   1134     case CURSOR_NE_RESIZE:
   1135         m_value.valueID = CSSValueNeResize;
   1136         break;
   1137     case CURSOR_NW_RESIZE:
   1138         m_value.valueID = CSSValueNwResize;
   1139         break;
   1140     case CURSOR_N_RESIZE:
   1141         m_value.valueID = CSSValueNResize;
   1142         break;
   1143     case CURSOR_SE_RESIZE:
   1144         m_value.valueID = CSSValueSeResize;
   1145         break;
   1146     case CURSOR_SW_RESIZE:
   1147         m_value.valueID = CSSValueSwResize;
   1148         break;
   1149     case CURSOR_S_RESIZE:
   1150         m_value.valueID = CSSValueSResize;
   1151         break;
   1152     case CURSOR_W_RESIZE:
   1153         m_value.valueID = CSSValueWResize;
   1154         break;
   1155     case CURSOR_EW_RESIZE:
   1156         m_value.valueID = CSSValueEwResize;
   1157         break;
   1158     case CURSOR_NS_RESIZE:
   1159         m_value.valueID = CSSValueNsResize;
   1160         break;
   1161     case CURSOR_NESW_RESIZE:
   1162         m_value.valueID = CSSValueNeswResize;
   1163         break;
   1164     case CURSOR_NWSE_RESIZE:
   1165         m_value.valueID = CSSValueNwseResize;
   1166         break;
   1167     case CURSOR_COL_RESIZE:
   1168         m_value.valueID = CSSValueColResize;
   1169         break;
   1170     case CURSOR_ROW_RESIZE:
   1171         m_value.valueID = CSSValueRowResize;
   1172         break;
   1173     case CURSOR_TEXT:
   1174         m_value.valueID = CSSValueText;
   1175         break;
   1176     case CURSOR_WAIT:
   1177         m_value.valueID = CSSValueWait;
   1178         break;
   1179     case CURSOR_HELP:
   1180         m_value.valueID = CSSValueHelp;
   1181         break;
   1182     case CURSOR_ALL_SCROLL:
   1183         m_value.valueID = CSSValueAllScroll;
   1184         break;
   1185     case CURSOR_WEBKIT_GRAB:
   1186         m_value.valueID = CSSValueWebkitGrab;
   1187         break;
   1188     case CURSOR_WEBKIT_GRABBING:
   1189         m_value.valueID = CSSValueWebkitGrabbing;
   1190         break;
   1191     }
   1192 }
   1193 
   1194 template<> inline CSSPrimitiveValue::operator ECursor() const
   1195 {
   1196     ASSERT(isValueID());
   1197     switch (m_value.valueID) {
   1198     case CSSValueCopy:
   1199         return CURSOR_COPY;
   1200     case CSSValueWebkitZoomIn:
   1201         return CURSOR_ZOOM_IN;
   1202     case CSSValueWebkitZoomOut:
   1203         return CURSOR_ZOOM_OUT;
   1204     case CSSValueNone:
   1205         return CURSOR_NONE;
   1206     default:
   1207         return static_cast<ECursor>(m_value.valueID - CSSValueAuto);
   1208     }
   1209 }
   1210 
   1211 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDisplay e)
   1212     : CSSValue(PrimitiveClass)
   1213 {
   1214     m_primitiveUnitType = CSS_VALUE_ID;
   1215     switch (e) {
   1216     case INLINE:
   1217         m_value.valueID = CSSValueInline;
   1218         break;
   1219     case BLOCK:
   1220         m_value.valueID = CSSValueBlock;
   1221         break;
   1222     case LIST_ITEM:
   1223         m_value.valueID = CSSValueListItem;
   1224         break;
   1225     case INLINE_BLOCK:
   1226         m_value.valueID = CSSValueInlineBlock;
   1227         break;
   1228     case TABLE:
   1229         m_value.valueID = CSSValueTable;
   1230         break;
   1231     case INLINE_TABLE:
   1232         m_value.valueID = CSSValueInlineTable;
   1233         break;
   1234     case TABLE_ROW_GROUP:
   1235         m_value.valueID = CSSValueTableRowGroup;
   1236         break;
   1237     case TABLE_HEADER_GROUP:
   1238         m_value.valueID = CSSValueTableHeaderGroup;
   1239         break;
   1240     case TABLE_FOOTER_GROUP:
   1241         m_value.valueID = CSSValueTableFooterGroup;
   1242         break;
   1243     case TABLE_ROW:
   1244         m_value.valueID = CSSValueTableRow;
   1245         break;
   1246     case TABLE_COLUMN_GROUP:
   1247         m_value.valueID = CSSValueTableColumnGroup;
   1248         break;
   1249     case TABLE_COLUMN:
   1250         m_value.valueID = CSSValueTableColumn;
   1251         break;
   1252     case TABLE_CELL:
   1253         m_value.valueID = CSSValueTableCell;
   1254         break;
   1255     case TABLE_CAPTION:
   1256         m_value.valueID = CSSValueTableCaption;
   1257         break;
   1258     case BOX:
   1259         m_value.valueID = CSSValueWebkitBox;
   1260         break;
   1261     case INLINE_BOX:
   1262         m_value.valueID = CSSValueWebkitInlineBox;
   1263         break;
   1264     case FLEX:
   1265         m_value.valueID = CSSValueFlex;
   1266         break;
   1267     case INLINE_FLEX:
   1268         m_value.valueID = CSSValueInlineFlex;
   1269         break;
   1270     case GRID:
   1271         m_value.valueID = CSSValueGrid;
   1272         break;
   1273     case INLINE_GRID:
   1274         m_value.valueID = CSSValueInlineGrid;
   1275         break;
   1276     case NONE:
   1277         m_value.valueID = CSSValueNone;
   1278         break;
   1279     }
   1280 }
   1281 
   1282 template<> inline CSSPrimitiveValue::operator EDisplay() const
   1283 {
   1284     ASSERT(isValueID());
   1285     if (m_value.valueID == CSSValueNone)
   1286         return NONE;
   1287 
   1288     if (m_value.valueID == CSSValueWebkitFlex)
   1289         return FLEX;
   1290     if (m_value.valueID == CSSValueWebkitInlineFlex)
   1291         return INLINE_FLEX;
   1292 
   1293     EDisplay display = static_cast<EDisplay>(m_value.valueID - CSSValueInline);
   1294     ASSERT(display >= INLINE && display <= NONE);
   1295     return display;
   1296 }
   1297 
   1298 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EEmptyCell e)
   1299     : CSSValue(PrimitiveClass)
   1300 {
   1301     m_primitiveUnitType = CSS_VALUE_ID;
   1302     switch (e) {
   1303     case SHOW:
   1304         m_value.valueID = CSSValueShow;
   1305         break;
   1306     case HIDE:
   1307         m_value.valueID = CSSValueHide;
   1308         break;
   1309     }
   1310 }
   1311 
   1312 template<> inline CSSPrimitiveValue::operator EEmptyCell() const
   1313 {
   1314     ASSERT(isValueID());
   1315     switch (m_value.valueID) {
   1316     case CSSValueShow:
   1317         return SHOW;
   1318     case CSSValueHide:
   1319         return HIDE;
   1320     default:
   1321         break;
   1322     }
   1323 
   1324     ASSERT_NOT_REACHED();
   1325     return SHOW;
   1326 }
   1327 
   1328 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EJustifyContent e)
   1329     : CSSValue(PrimitiveClass)
   1330 {
   1331     m_primitiveUnitType = CSS_VALUE_ID;
   1332     switch (e) {
   1333     case JustifyFlexStart:
   1334         m_value.valueID = CSSValueFlexStart;
   1335         break;
   1336     case JustifyFlexEnd:
   1337         m_value.valueID = CSSValueFlexEnd;
   1338         break;
   1339     case JustifyCenter:
   1340         m_value.valueID = CSSValueCenter;
   1341         break;
   1342     case JustifySpaceBetween:
   1343         m_value.valueID = CSSValueSpaceBetween;
   1344         break;
   1345     case JustifySpaceAround:
   1346         m_value.valueID = CSSValueSpaceAround;
   1347         break;
   1348     }
   1349 }
   1350 
   1351 template<> inline CSSPrimitiveValue::operator EJustifyContent() const
   1352 {
   1353     ASSERT(isValueID());
   1354     switch (m_value.valueID) {
   1355     case CSSValueFlexStart:
   1356         return JustifyFlexStart;
   1357     case CSSValueFlexEnd:
   1358         return JustifyFlexEnd;
   1359     case CSSValueCenter:
   1360         return JustifyCenter;
   1361     case CSSValueSpaceBetween:
   1362         return JustifySpaceBetween;
   1363     case CSSValueSpaceAround:
   1364         return JustifySpaceAround;
   1365     default:
   1366         break;
   1367     }
   1368 
   1369     ASSERT_NOT_REACHED();
   1370     return JustifyFlexStart;
   1371 }
   1372 
   1373 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFlexDirection e)
   1374     : CSSValue(PrimitiveClass)
   1375 {
   1376     m_primitiveUnitType = CSS_VALUE_ID;
   1377     switch (e) {
   1378     case FlowRow:
   1379         m_value.valueID = CSSValueRow;
   1380         break;
   1381     case FlowRowReverse:
   1382         m_value.valueID = CSSValueRowReverse;
   1383         break;
   1384     case FlowColumn:
   1385         m_value.valueID = CSSValueColumn;
   1386         break;
   1387     case FlowColumnReverse:
   1388         m_value.valueID = CSSValueColumnReverse;
   1389         break;
   1390     }
   1391 }
   1392 
   1393 template<> inline CSSPrimitiveValue::operator EFlexDirection() const
   1394 {
   1395     ASSERT(isValueID());
   1396     switch (m_value.valueID) {
   1397     case CSSValueRow:
   1398         return FlowRow;
   1399     case CSSValueRowReverse:
   1400         return FlowRowReverse;
   1401     case CSSValueColumn:
   1402         return FlowColumn;
   1403     case CSSValueColumnReverse:
   1404         return FlowColumnReverse;
   1405     default:
   1406         break;
   1407     }
   1408 
   1409     ASSERT_NOT_REACHED();
   1410     return FlowRow;
   1411 }
   1412 
   1413 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EAlignContent e)
   1414     : CSSValue(PrimitiveClass)
   1415 {
   1416     m_primitiveUnitType = CSS_VALUE_ID;
   1417     switch (e) {
   1418     case AlignContentFlexStart:
   1419         m_value.valueID = CSSValueFlexStart;
   1420         break;
   1421     case AlignContentFlexEnd:
   1422         m_value.valueID = CSSValueFlexEnd;
   1423         break;
   1424     case AlignContentCenter:
   1425         m_value.valueID = CSSValueCenter;
   1426         break;
   1427     case AlignContentSpaceBetween:
   1428         m_value.valueID = CSSValueSpaceBetween;
   1429         break;
   1430     case AlignContentSpaceAround:
   1431         m_value.valueID = CSSValueSpaceAround;
   1432         break;
   1433     case AlignContentStretch:
   1434         m_value.valueID = CSSValueStretch;
   1435         break;
   1436     }
   1437 }
   1438 
   1439 template<> inline CSSPrimitiveValue::operator EAlignContent() const
   1440 {
   1441     ASSERT(isValueID());
   1442     switch (m_value.valueID) {
   1443     case CSSValueFlexStart:
   1444         return AlignContentFlexStart;
   1445     case CSSValueFlexEnd:
   1446         return AlignContentFlexEnd;
   1447     case CSSValueCenter:
   1448         return AlignContentCenter;
   1449     case CSSValueSpaceBetween:
   1450         return AlignContentSpaceBetween;
   1451     case CSSValueSpaceAround:
   1452         return AlignContentSpaceAround;
   1453     case CSSValueStretch:
   1454         return AlignContentStretch;
   1455     default:
   1456         break;
   1457     }
   1458 
   1459     ASSERT_NOT_REACHED();
   1460     return AlignContentStretch;
   1461 }
   1462 
   1463 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFlexWrap e)
   1464     : CSSValue(PrimitiveClass)
   1465 {
   1466     m_primitiveUnitType = CSS_VALUE_ID;
   1467     switch (e) {
   1468     case FlexNoWrap:
   1469         m_value.valueID = CSSValueNowrap;
   1470         break;
   1471     case FlexWrap:
   1472         m_value.valueID = CSSValueWrap;
   1473         break;
   1474     case FlexWrapReverse:
   1475         m_value.valueID = CSSValueWrapReverse;
   1476         break;
   1477     }
   1478 }
   1479 
   1480 template<> inline CSSPrimitiveValue::operator EFlexWrap() const
   1481 {
   1482     ASSERT(isValueID());
   1483     switch (m_value.valueID) {
   1484     case CSSValueNowrap:
   1485         return FlexNoWrap;
   1486     case CSSValueWrap:
   1487         return FlexWrap;
   1488     case CSSValueWrapReverse:
   1489         return FlexWrapReverse;
   1490     default:
   1491         break;
   1492     }
   1493 
   1494     ASSERT_NOT_REACHED();
   1495     return FlexNoWrap;
   1496 }
   1497 
   1498 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFloat e)
   1499     : CSSValue(PrimitiveClass)
   1500 {
   1501     m_primitiveUnitType = CSS_VALUE_ID;
   1502     switch (e) {
   1503     case NoFloat:
   1504         m_value.valueID = CSSValueNone;
   1505         break;
   1506     case LeftFloat:
   1507         m_value.valueID = CSSValueLeft;
   1508         break;
   1509     case RightFloat:
   1510         m_value.valueID = CSSValueRight;
   1511         break;
   1512     }
   1513 }
   1514 
   1515 template<> inline CSSPrimitiveValue::operator EFloat() const
   1516 {
   1517     ASSERT(isValueID());
   1518     switch (m_value.valueID) {
   1519     case CSSValueLeft:
   1520         return LeftFloat;
   1521     case CSSValueRight:
   1522         return RightFloat;
   1523     case CSSValueNone:
   1524     case CSSValueCenter: // Non-standard CSS value.
   1525         return NoFloat;
   1526     default:
   1527         break;
   1528     }
   1529 
   1530     ASSERT_NOT_REACHED();
   1531     return NoFloat;
   1532 }
   1533 
   1534 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineBreak e)
   1535     : CSSValue(PrimitiveClass)
   1536 {
   1537     m_primitiveUnitType = CSS_VALUE_ID;
   1538     switch (e) {
   1539     case LineBreakAuto:
   1540         m_value.valueID = CSSValueAuto;
   1541         break;
   1542     case LineBreakLoose:
   1543         m_value.valueID = CSSValueLoose;
   1544         break;
   1545     case LineBreakNormal:
   1546         m_value.valueID = CSSValueNormal;
   1547         break;
   1548     case LineBreakStrict:
   1549         m_value.valueID = CSSValueStrict;
   1550         break;
   1551     case LineBreakAfterWhiteSpace:
   1552         m_value.valueID = CSSValueAfterWhiteSpace;
   1553         break;
   1554     }
   1555 }
   1556 
   1557 template<> inline CSSPrimitiveValue::operator LineBreak() const
   1558 {
   1559     ASSERT(isValueID());
   1560     switch (m_value.valueID) {
   1561     case CSSValueAuto:
   1562         return LineBreakAuto;
   1563     case CSSValueLoose:
   1564         return LineBreakLoose;
   1565     case CSSValueNormal:
   1566         return LineBreakNormal;
   1567     case CSSValueStrict:
   1568         return LineBreakStrict;
   1569     case CSSValueAfterWhiteSpace:
   1570         return LineBreakAfterWhiteSpace;
   1571     default:
   1572         break;
   1573     }
   1574 
   1575     ASSERT_NOT_REACHED();
   1576     return LineBreakAuto;
   1577 }
   1578 
   1579 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStylePosition e)
   1580     : CSSValue(PrimitiveClass)
   1581 {
   1582     m_primitiveUnitType = CSS_VALUE_ID;
   1583     switch (e) {
   1584     case OUTSIDE:
   1585         m_value.valueID = CSSValueOutside;
   1586         break;
   1587     case INSIDE:
   1588         m_value.valueID = CSSValueInside;
   1589         break;
   1590     }
   1591 }
   1592 
   1593 template<> inline CSSPrimitiveValue::operator EListStylePosition() const
   1594 {
   1595     ASSERT(isValueID());
   1596     switch (m_value.valueID) {
   1597     case CSSValueOutside:
   1598         return OUTSIDE;
   1599     case CSSValueInside:
   1600         return INSIDE;
   1601     default:
   1602         break;
   1603     }
   1604 
   1605     ASSERT_NOT_REACHED();
   1606     return OUTSIDE;
   1607 }
   1608 
   1609 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStyleType e)
   1610     : CSSValue(PrimitiveClass)
   1611 {
   1612     m_primitiveUnitType = CSS_VALUE_ID;
   1613     switch (e) {
   1614     case Afar:
   1615         m_value.valueID = CSSValueAfar;
   1616         break;
   1617     case Amharic:
   1618         m_value.valueID = CSSValueAmharic;
   1619         break;
   1620     case AmharicAbegede:
   1621         m_value.valueID = CSSValueAmharicAbegede;
   1622         break;
   1623     case ArabicIndic:
   1624         m_value.valueID = CSSValueArabicIndic;
   1625         break;
   1626     case Armenian:
   1627         m_value.valueID = CSSValueArmenian;
   1628         break;
   1629     case Asterisks:
   1630         m_value.valueID = CSSValueAsterisks;
   1631         break;
   1632     case BinaryListStyle:
   1633         m_value.valueID = CSSValueBinary;
   1634         break;
   1635     case Bengali:
   1636         m_value.valueID = CSSValueBengali;
   1637         break;
   1638     case Cambodian:
   1639         m_value.valueID = CSSValueCambodian;
   1640         break;
   1641     case Circle:
   1642         m_value.valueID = CSSValueCircle;
   1643         break;
   1644     case CjkEarthlyBranch:
   1645         m_value.valueID = CSSValueCjkEarthlyBranch;
   1646         break;
   1647     case CjkHeavenlyStem:
   1648         m_value.valueID = CSSValueCjkHeavenlyStem;
   1649         break;
   1650     case CJKIdeographic:
   1651         m_value.valueID = CSSValueCjkIdeographic;
   1652         break;
   1653     case DecimalLeadingZero:
   1654         m_value.valueID = CSSValueDecimalLeadingZero;
   1655         break;
   1656     case DecimalListStyle:
   1657         m_value.valueID = CSSValueDecimal;
   1658         break;
   1659     case Devanagari:
   1660         m_value.valueID = CSSValueDevanagari;
   1661         break;
   1662     case Disc:
   1663         m_value.valueID = CSSValueDisc;
   1664         break;
   1665     case Ethiopic:
   1666         m_value.valueID = CSSValueEthiopic;
   1667         break;
   1668     case EthiopicAbegede:
   1669         m_value.valueID = CSSValueEthiopicAbegede;
   1670         break;
   1671     case EthiopicAbegedeAmEt:
   1672         m_value.valueID = CSSValueEthiopicAbegedeAmEt;
   1673         break;
   1674     case EthiopicAbegedeGez:
   1675         m_value.valueID = CSSValueEthiopicAbegedeGez;
   1676         break;
   1677     case EthiopicAbegedeTiEr:
   1678         m_value.valueID = CSSValueEthiopicAbegedeTiEr;
   1679         break;
   1680     case EthiopicAbegedeTiEt:
   1681         m_value.valueID = CSSValueEthiopicAbegedeTiEt;
   1682         break;
   1683     case EthiopicHalehameAaEr:
   1684         m_value.valueID = CSSValueEthiopicHalehameAaEr;
   1685         break;
   1686     case EthiopicHalehameAaEt:
   1687         m_value.valueID = CSSValueEthiopicHalehameAaEt;
   1688         break;
   1689     case EthiopicHalehameAmEt:
   1690         m_value.valueID = CSSValueEthiopicHalehameAmEt;
   1691         break;
   1692     case EthiopicHalehameGez:
   1693         m_value.valueID = CSSValueEthiopicHalehameGez;
   1694         break;
   1695     case EthiopicHalehameOmEt:
   1696         m_value.valueID = CSSValueEthiopicHalehameOmEt;
   1697         break;
   1698     case EthiopicHalehameSidEt:
   1699         m_value.valueID = CSSValueEthiopicHalehameSidEt;
   1700         break;
   1701     case EthiopicHalehameSoEt:
   1702         m_value.valueID = CSSValueEthiopicHalehameSoEt;
   1703         break;
   1704     case EthiopicHalehameTiEr:
   1705         m_value.valueID = CSSValueEthiopicHalehameTiEr;
   1706         break;
   1707     case EthiopicHalehameTiEt:
   1708         m_value.valueID = CSSValueEthiopicHalehameTiEt;
   1709         break;
   1710     case EthiopicHalehameTig:
   1711         m_value.valueID = CSSValueEthiopicHalehameTig;
   1712         break;
   1713     case Footnotes:
   1714         m_value.valueID = CSSValueFootnotes;
   1715         break;
   1716     case Georgian:
   1717         m_value.valueID = CSSValueGeorgian;
   1718         break;
   1719     case Gujarati:
   1720         m_value.valueID = CSSValueGujarati;
   1721         break;
   1722     case Gurmukhi:
   1723         m_value.valueID = CSSValueGurmukhi;
   1724         break;
   1725     case Hangul:
   1726         m_value.valueID = CSSValueHangul;
   1727         break;
   1728     case HangulConsonant:
   1729         m_value.valueID = CSSValueHangulConsonant;
   1730         break;
   1731     case Hebrew:
   1732         m_value.valueID = CSSValueHebrew;
   1733         break;
   1734     case Hiragana:
   1735         m_value.valueID = CSSValueHiragana;
   1736         break;
   1737     case HiraganaIroha:
   1738         m_value.valueID = CSSValueHiraganaIroha;
   1739         break;
   1740     case Kannada:
   1741         m_value.valueID = CSSValueKannada;
   1742         break;
   1743     case Katakana:
   1744         m_value.valueID = CSSValueKatakana;
   1745         break;
   1746     case KatakanaIroha:
   1747         m_value.valueID = CSSValueKatakanaIroha;
   1748         break;
   1749     case Khmer:
   1750         m_value.valueID = CSSValueKhmer;
   1751         break;
   1752     case Lao:
   1753         m_value.valueID = CSSValueLao;
   1754         break;
   1755     case LowerAlpha:
   1756         m_value.valueID = CSSValueLowerAlpha;
   1757         break;
   1758     case LowerArmenian:
   1759         m_value.valueID = CSSValueLowerArmenian;
   1760         break;
   1761     case LowerGreek:
   1762         m_value.valueID = CSSValueLowerGreek;
   1763         break;
   1764     case LowerHexadecimal:
   1765         m_value.valueID = CSSValueLowerHexadecimal;
   1766         break;
   1767     case LowerLatin:
   1768         m_value.valueID = CSSValueLowerLatin;
   1769         break;
   1770     case LowerNorwegian:
   1771         m_value.valueID = CSSValueLowerNorwegian;
   1772         break;
   1773     case LowerRoman:
   1774         m_value.valueID = CSSValueLowerRoman;
   1775         break;
   1776     case Malayalam:
   1777         m_value.valueID = CSSValueMalayalam;
   1778         break;
   1779     case Mongolian:
   1780         m_value.valueID = CSSValueMongolian;
   1781         break;
   1782     case Myanmar:
   1783         m_value.valueID = CSSValueMyanmar;
   1784         break;
   1785     case NoneListStyle:
   1786         m_value.valueID = CSSValueNone;
   1787         break;
   1788     case Octal:
   1789         m_value.valueID = CSSValueOctal;
   1790         break;
   1791     case Oriya:
   1792         m_value.valueID = CSSValueOriya;
   1793         break;
   1794     case Oromo:
   1795         m_value.valueID = CSSValueOromo;
   1796         break;
   1797     case Persian:
   1798         m_value.valueID = CSSValuePersian;
   1799         break;
   1800     case Sidama:
   1801         m_value.valueID = CSSValueSidama;
   1802         break;
   1803     case Somali:
   1804         m_value.valueID = CSSValueSomali;
   1805         break;
   1806     case Square:
   1807         m_value.valueID = CSSValueSquare;
   1808         break;
   1809     case Telugu:
   1810         m_value.valueID = CSSValueTelugu;
   1811         break;
   1812     case Thai:
   1813         m_value.valueID = CSSValueThai;
   1814         break;
   1815     case Tibetan:
   1816         m_value.valueID = CSSValueTibetan;
   1817         break;
   1818     case Tigre:
   1819         m_value.valueID = CSSValueTigre;
   1820         break;
   1821     case TigrinyaEr:
   1822         m_value.valueID = CSSValueTigrinyaEr;
   1823         break;
   1824     case TigrinyaErAbegede:
   1825         m_value.valueID = CSSValueTigrinyaErAbegede;
   1826         break;
   1827     case TigrinyaEt:
   1828         m_value.valueID = CSSValueTigrinyaEt;
   1829         break;
   1830     case TigrinyaEtAbegede:
   1831         m_value.valueID = CSSValueTigrinyaEtAbegede;
   1832         break;
   1833     case UpperAlpha:
   1834         m_value.valueID = CSSValueUpperAlpha;
   1835         break;
   1836     case UpperArmenian:
   1837         m_value.valueID = CSSValueUpperArmenian;
   1838         break;
   1839     case UpperGreek:
   1840         m_value.valueID = CSSValueUpperGreek;
   1841         break;
   1842     case UpperHexadecimal:
   1843         m_value.valueID = CSSValueUpperHexadecimal;
   1844         break;
   1845     case UpperLatin:
   1846         m_value.valueID = CSSValueUpperLatin;
   1847         break;
   1848     case UpperNorwegian:
   1849         m_value.valueID = CSSValueUpperNorwegian;
   1850         break;
   1851     case UpperRoman:
   1852         m_value.valueID = CSSValueUpperRoman;
   1853         break;
   1854     case Urdu:
   1855         m_value.valueID = CSSValueUrdu;
   1856         break;
   1857     }
   1858 }
   1859 
   1860 template<> inline CSSPrimitiveValue::operator EListStyleType() const
   1861 {
   1862     ASSERT(isValueID());
   1863     switch (m_value.valueID) {
   1864     case CSSValueNone:
   1865         return NoneListStyle;
   1866     default:
   1867         return static_cast<EListStyleType>(m_value.valueID - CSSValueDisc);
   1868     }
   1869 }
   1870 
   1871 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarginCollapse e)
   1872     : CSSValue(PrimitiveClass)
   1873 {
   1874     m_primitiveUnitType = CSS_VALUE_ID;
   1875     switch (e) {
   1876     case MCOLLAPSE:
   1877         m_value.valueID = CSSValueCollapse;
   1878         break;
   1879     case MSEPARATE:
   1880         m_value.valueID = CSSValueSeparate;
   1881         break;
   1882     case MDISCARD:
   1883         m_value.valueID = CSSValueDiscard;
   1884         break;
   1885     }
   1886 }
   1887 
   1888 template<> inline CSSPrimitiveValue::operator EMarginCollapse() const
   1889 {
   1890     ASSERT(isValueID());
   1891     switch (m_value.valueID) {
   1892     case CSSValueCollapse:
   1893         return MCOLLAPSE;
   1894     case CSSValueSeparate:
   1895         return MSEPARATE;
   1896     case CSSValueDiscard:
   1897         return MDISCARD;
   1898     default:
   1899         break;
   1900     }
   1901 
   1902     ASSERT_NOT_REACHED();
   1903     return MCOLLAPSE;
   1904 }
   1905 
   1906 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeBehavior e)
   1907     : CSSValue(PrimitiveClass)
   1908 {
   1909     m_primitiveUnitType = CSS_VALUE_ID;
   1910     switch (e) {
   1911     case MNONE:
   1912         m_value.valueID = CSSValueNone;
   1913         break;
   1914     case MSCROLL:
   1915         m_value.valueID = CSSValueScroll;
   1916         break;
   1917     case MSLIDE:
   1918         m_value.valueID = CSSValueSlide;
   1919         break;
   1920     case MALTERNATE:
   1921         m_value.valueID = CSSValueAlternate;
   1922         break;
   1923     }
   1924 }
   1925 
   1926 template<> inline CSSPrimitiveValue::operator EMarqueeBehavior() const
   1927 {
   1928     ASSERT(isValueID());
   1929     switch (m_value.valueID) {
   1930     case CSSValueNone:
   1931         return MNONE;
   1932     case CSSValueScroll:
   1933         return MSCROLL;
   1934     case CSSValueSlide:
   1935         return MSLIDE;
   1936     case CSSValueAlternate:
   1937         return MALTERNATE;
   1938     default:
   1939         break;
   1940     }
   1941 
   1942     ASSERT_NOT_REACHED();
   1943     return MNONE;
   1944 }
   1945 
   1946 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeDirection e)
   1947     : CSSValue(PrimitiveClass)
   1948 {
   1949     m_primitiveUnitType = CSS_VALUE_ID;
   1950     switch (e) {
   1951     case MFORWARD:
   1952         m_value.valueID = CSSValueForwards;
   1953         break;
   1954     case MBACKWARD:
   1955         m_value.valueID = CSSValueBackwards;
   1956         break;
   1957     case MAUTO:
   1958         m_value.valueID = CSSValueAuto;
   1959         break;
   1960     case MUP:
   1961         m_value.valueID = CSSValueUp;
   1962         break;
   1963     case MDOWN:
   1964         m_value.valueID = CSSValueDown;
   1965         break;
   1966     case MLEFT:
   1967         m_value.valueID = CSSValueLeft;
   1968         break;
   1969     case MRIGHT:
   1970         m_value.valueID = CSSValueRight;
   1971         break;
   1972     }
   1973 }
   1974 
   1975 template<> inline CSSPrimitiveValue::operator EMarqueeDirection() const
   1976 {
   1977     ASSERT(isValueID());
   1978     switch (m_value.valueID) {
   1979     case CSSValueForwards:
   1980         return MFORWARD;
   1981     case CSSValueBackwards:
   1982         return MBACKWARD;
   1983     case CSSValueAuto:
   1984         return MAUTO;
   1985     case CSSValueAhead:
   1986     case CSSValueUp: // We don't support vertical languages, so AHEAD just maps to UP.
   1987         return MUP;
   1988     case CSSValueReverse:
   1989     case CSSValueDown: // REVERSE just maps to DOWN, since we don't do vertical text.
   1990         return MDOWN;
   1991     case CSSValueLeft:
   1992         return MLEFT;
   1993     case CSSValueRight:
   1994         return MRIGHT;
   1995     default:
   1996         break;
   1997     }
   1998 
   1999     ASSERT_NOT_REACHED();
   2000     return MAUTO;
   2001 }
   2002 
   2003 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EOverflow e)
   2004     : CSSValue(PrimitiveClass)
   2005 {
   2006     m_primitiveUnitType = CSS_VALUE_ID;
   2007     switch (e) {
   2008     case OVISIBLE:
   2009         m_value.valueID = CSSValueVisible;
   2010         break;
   2011     case OHIDDEN:
   2012         m_value.valueID = CSSValueHidden;
   2013         break;
   2014     case OSCROLL:
   2015         m_value.valueID = CSSValueScroll;
   2016         break;
   2017     case OAUTO:
   2018         m_value.valueID = CSSValueAuto;
   2019         break;
   2020     case OOVERLAY:
   2021         m_value.valueID = CSSValueOverlay;
   2022         break;
   2023     case OPAGEDX:
   2024         m_value.valueID = CSSValueWebkitPagedX;
   2025         break;
   2026     case OPAGEDY:
   2027         m_value.valueID = CSSValueWebkitPagedY;
   2028         break;
   2029     }
   2030 }
   2031 
   2032 template<> inline CSSPrimitiveValue::operator EOverflow() const
   2033 {
   2034     ASSERT(isValueID());
   2035     switch (m_value.valueID) {
   2036     case CSSValueVisible:
   2037         return OVISIBLE;
   2038     case CSSValueHidden:
   2039         return OHIDDEN;
   2040     case CSSValueScroll:
   2041         return OSCROLL;
   2042     case CSSValueAuto:
   2043         return OAUTO;
   2044     case CSSValueOverlay:
   2045         return OOVERLAY;
   2046     case CSSValueWebkitPagedX:
   2047         return OPAGEDX;
   2048     case CSSValueWebkitPagedY:
   2049         return OPAGEDY;
   2050     default:
   2051         break;
   2052     }
   2053 
   2054     ASSERT_NOT_REACHED();
   2055     return OVISIBLE;
   2056 }
   2057 
   2058 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPageBreak e)
   2059     : CSSValue(PrimitiveClass)
   2060 {
   2061     m_primitiveUnitType = CSS_VALUE_ID;
   2062     switch (e) {
   2063     case PBAUTO:
   2064         m_value.valueID = CSSValueAuto;
   2065         break;
   2066     case PBALWAYS:
   2067         m_value.valueID = CSSValueAlways;
   2068         break;
   2069     case PBAVOID:
   2070         m_value.valueID = CSSValueAvoid;
   2071         break;
   2072     }
   2073 }
   2074 
   2075 template<> inline CSSPrimitiveValue::operator EPageBreak() const
   2076 {
   2077     ASSERT(isValueID());
   2078     switch (m_value.valueID) {
   2079     case CSSValueAuto:
   2080         return PBAUTO;
   2081     case CSSValueLeft:
   2082     case CSSValueRight:
   2083     case CSSValueAlways:
   2084         return PBALWAYS; // CSS2.1: "Conforming user agents may map left/right to always."
   2085     case CSSValueAvoid:
   2086         return PBAVOID;
   2087     default:
   2088         break;
   2089     }
   2090 
   2091     ASSERT_NOT_REACHED();
   2092     return PBAUTO;
   2093 }
   2094 
   2095 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPosition e)
   2096     : CSSValue(PrimitiveClass)
   2097 {
   2098     m_primitiveUnitType = CSS_VALUE_ID;
   2099     switch (e) {
   2100     case StaticPosition:
   2101         m_value.valueID = CSSValueStatic;
   2102         break;
   2103     case RelativePosition:
   2104         m_value.valueID = CSSValueRelative;
   2105         break;
   2106     case AbsolutePosition:
   2107         m_value.valueID = CSSValueAbsolute;
   2108         break;
   2109     case FixedPosition:
   2110         m_value.valueID = CSSValueFixed;
   2111         break;
   2112     }
   2113 }
   2114 
   2115 template<> inline CSSPrimitiveValue::operator EPosition() const
   2116 {
   2117     ASSERT(isValueID());
   2118     switch (m_value.valueID) {
   2119     case CSSValueStatic:
   2120         return StaticPosition;
   2121     case CSSValueRelative:
   2122         return RelativePosition;
   2123     case CSSValueAbsolute:
   2124         return AbsolutePosition;
   2125     case CSSValueFixed:
   2126         return FixedPosition;
   2127     default:
   2128         break;
   2129     }
   2130 
   2131     ASSERT_NOT_REACHED();
   2132     return StaticPosition;
   2133 }
   2134 
   2135 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EResize e)
   2136     : CSSValue(PrimitiveClass)
   2137 {
   2138     m_primitiveUnitType = CSS_VALUE_ID;
   2139     switch (e) {
   2140     case RESIZE_BOTH:
   2141         m_value.valueID = CSSValueBoth;
   2142         break;
   2143     case RESIZE_HORIZONTAL:
   2144         m_value.valueID = CSSValueHorizontal;
   2145         break;
   2146     case RESIZE_VERTICAL:
   2147         m_value.valueID = CSSValueVertical;
   2148         break;
   2149     case RESIZE_NONE:
   2150         m_value.valueID = CSSValueNone;
   2151         break;
   2152     }
   2153 }
   2154 
   2155 template<> inline CSSPrimitiveValue::operator EResize() const
   2156 {
   2157     ASSERT(isValueID());
   2158     switch (m_value.valueID) {
   2159     case CSSValueBoth:
   2160         return RESIZE_BOTH;
   2161     case CSSValueHorizontal:
   2162         return RESIZE_HORIZONTAL;
   2163     case CSSValueVertical:
   2164         return RESIZE_VERTICAL;
   2165     case CSSValueAuto:
   2166         ASSERT_NOT_REACHED(); // Depends on settings, thus should be handled by the caller.
   2167         return RESIZE_NONE;
   2168     case CSSValueNone:
   2169         return RESIZE_NONE;
   2170     default:
   2171         break;
   2172     }
   2173 
   2174     ASSERT_NOT_REACHED();
   2175     return RESIZE_NONE;
   2176 }
   2177 
   2178 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETableLayout e)
   2179     : CSSValue(PrimitiveClass)
   2180 {
   2181     m_primitiveUnitType = CSS_VALUE_ID;
   2182     switch (e) {
   2183     case TAUTO:
   2184         m_value.valueID = CSSValueAuto;
   2185         break;
   2186     case TFIXED:
   2187         m_value.valueID = CSSValueFixed;
   2188         break;
   2189     }
   2190 }
   2191 
   2192 template<> inline CSSPrimitiveValue::operator ETableLayout() const
   2193 {
   2194     ASSERT(isValueID());
   2195     switch (m_value.valueID) {
   2196     case CSSValueFixed:
   2197         return TFIXED;
   2198     case CSSValueAuto:
   2199         return TAUTO;
   2200     default:
   2201         break;
   2202     }
   2203 
   2204     ASSERT_NOT_REACHED();
   2205     return TAUTO;
   2206 }
   2207 
   2208 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAlign e)
   2209     : CSSValue(PrimitiveClass)
   2210 {
   2211     m_primitiveUnitType = CSS_VALUE_ID;
   2212     switch (e) {
   2213     case TASTART:
   2214         m_value.valueID = CSSValueStart;
   2215         break;
   2216     case TAEND:
   2217         m_value.valueID = CSSValueEnd;
   2218         break;
   2219     case LEFT:
   2220         m_value.valueID = CSSValueLeft;
   2221         break;
   2222     case RIGHT:
   2223         m_value.valueID = CSSValueRight;
   2224         break;
   2225     case CENTER:
   2226         m_value.valueID = CSSValueCenter;
   2227         break;
   2228     case JUSTIFY:
   2229         m_value.valueID = CSSValueJustify;
   2230         break;
   2231     case WEBKIT_LEFT:
   2232         m_value.valueID = CSSValueWebkitLeft;
   2233         break;
   2234     case WEBKIT_RIGHT:
   2235         m_value.valueID = CSSValueWebkitRight;
   2236         break;
   2237     case WEBKIT_CENTER:
   2238         m_value.valueID = CSSValueWebkitCenter;
   2239         break;
   2240     }
   2241 }
   2242 
   2243 template<> inline CSSPrimitiveValue::operator ETextAlign() const
   2244 {
   2245     ASSERT(isValueID());
   2246     switch (m_value.valueID) {
   2247     case CSSValueWebkitAuto: // Legacy -webkit-auto. Eqiuvalent to start.
   2248     case CSSValueStart:
   2249         return TASTART;
   2250     case CSSValueEnd:
   2251         return TAEND;
   2252     default:
   2253         return static_cast<ETextAlign>(m_value.valueID - CSSValueLeft);
   2254     }
   2255 }
   2256 
   2257 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextAlignLast e)
   2258     : CSSValue(PrimitiveClass)
   2259 {
   2260     m_primitiveUnitType = CSS_VALUE_ID;
   2261     switch (e) {
   2262     case TextAlignLastStart:
   2263         m_value.valueID = CSSValueStart;
   2264         break;
   2265     case TextAlignLastEnd:
   2266         m_value.valueID = CSSValueEnd;
   2267         break;
   2268     case TextAlignLastLeft:
   2269         m_value.valueID = CSSValueLeft;
   2270         break;
   2271     case TextAlignLastRight:
   2272         m_value.valueID = CSSValueRight;
   2273         break;
   2274     case TextAlignLastCenter:
   2275         m_value.valueID = CSSValueCenter;
   2276         break;
   2277     case TextAlignLastJustify:
   2278         m_value.valueID = CSSValueJustify;
   2279         break;
   2280     case TextAlignLastAuto:
   2281         m_value.valueID = CSSValueAuto;
   2282         break;
   2283     }
   2284 }
   2285 
   2286 template<> inline CSSPrimitiveValue::operator TextAlignLast() const
   2287 {
   2288     ASSERT(isValueID());
   2289     switch (m_value.valueID) {
   2290     case CSSValueAuto:
   2291         return TextAlignLastAuto;
   2292     case CSSValueStart:
   2293         return TextAlignLastStart;
   2294     case CSSValueEnd:
   2295         return TextAlignLastEnd;
   2296     case CSSValueLeft:
   2297         return TextAlignLastLeft;
   2298     case CSSValueRight:
   2299         return TextAlignLastRight;
   2300     case CSSValueCenter:
   2301         return TextAlignLastCenter;
   2302     case CSSValueJustify:
   2303         return TextAlignLastJustify;
   2304     default:
   2305         break;
   2306     }
   2307 
   2308     ASSERT_NOT_REACHED();
   2309     return TextAlignLastAuto;
   2310 }
   2311 
   2312 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextJustify e)
   2313     : CSSValue(PrimitiveClass)
   2314 {
   2315     m_primitiveUnitType = CSS_VALUE_ID;
   2316     switch (e) {
   2317     case TextJustifyAuto:
   2318         m_value.valueID = CSSValueAuto;
   2319         break;
   2320     case TextJustifyNone:
   2321         m_value.valueID = CSSValueNone;
   2322         break;
   2323     case TextJustifyInterWord:
   2324         m_value.valueID = CSSValueInterWord;
   2325         break;
   2326     case TextJustifyDistribute:
   2327         m_value.valueID = CSSValueDistribute;
   2328         break;
   2329     }
   2330 }
   2331 
   2332 template<> inline CSSPrimitiveValue::operator TextJustify() const
   2333 {
   2334     switch (m_value.valueID) {
   2335     case CSSValueAuto:
   2336         return TextJustifyAuto;
   2337     case CSSValueNone:
   2338         return TextJustifyNone;
   2339     case CSSValueInterWord:
   2340         return TextJustifyInterWord;
   2341     case CSSValueDistribute:
   2342         return TextJustifyDistribute;
   2343     default:
   2344         break;
   2345     }
   2346 
   2347     ASSERT_NOT_REACHED();
   2348     return TextJustifyAuto;
   2349 }
   2350 
   2351 template<> inline CSSPrimitiveValue::operator TextDecoration() const
   2352 {
   2353     ASSERT(isValueID());
   2354     switch (m_value.valueID) {
   2355     case CSSValueNone:
   2356         return TextDecorationNone;
   2357     case CSSValueUnderline:
   2358         return TextDecorationUnderline;
   2359     case CSSValueOverline:
   2360         return TextDecorationOverline;
   2361     case CSSValueLineThrough:
   2362         return TextDecorationLineThrough;
   2363     case CSSValueBlink:
   2364         return TextDecorationBlink;
   2365     default:
   2366         break;
   2367     }
   2368 
   2369     ASSERT_NOT_REACHED();
   2370     return TextDecorationNone;
   2371 }
   2372 
   2373 template<> inline CSSPrimitiveValue::operator TextDecorationStyle() const
   2374 {
   2375     ASSERT(isValueID());
   2376     switch (m_value.valueID) {
   2377     case CSSValueSolid:
   2378         return TextDecorationStyleSolid;
   2379     case CSSValueDouble:
   2380         return TextDecorationStyleDouble;
   2381     case CSSValueDotted:
   2382         return TextDecorationStyleDotted;
   2383     case CSSValueDashed:
   2384         return TextDecorationStyleDashed;
   2385     case CSSValueWavy:
   2386         return TextDecorationStyleWavy;
   2387     default:
   2388         break;
   2389     }
   2390 
   2391     ASSERT_NOT_REACHED();
   2392     return TextDecorationStyleSolid;
   2393 }
   2394 
   2395 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextUnderlinePosition e)
   2396     : CSSValue(PrimitiveClass)
   2397 {
   2398     m_primitiveUnitType = CSS_VALUE_ID;
   2399     switch (e) {
   2400     case TextUnderlinePositionAuto:
   2401         m_value.valueID = CSSValueAuto;
   2402         break;
   2403     case TextUnderlinePositionUnder:
   2404         m_value.valueID = CSSValueUnder;
   2405         break;
   2406     }
   2407 
   2408     // FIXME: Implement support for 'under left' and 'under right' values.
   2409 }
   2410 
   2411 template<> inline CSSPrimitiveValue::operator TextUnderlinePosition() const
   2412 {
   2413     ASSERT(isValueID());
   2414     switch (m_value.valueID) {
   2415     case CSSValueAuto:
   2416         return TextUnderlinePositionAuto;
   2417     case CSSValueUnder:
   2418         return TextUnderlinePositionUnder;
   2419     default:
   2420         break;
   2421     }
   2422 
   2423     // FIXME: Implement support for 'under left' and 'under right' values.
   2424 
   2425     ASSERT_NOT_REACHED();
   2426     return TextUnderlinePositionAuto;
   2427 }
   2428 
   2429 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextSecurity e)
   2430     : CSSValue(PrimitiveClass)
   2431 {
   2432     m_primitiveUnitType = CSS_VALUE_ID;
   2433     switch (e) {
   2434     case TSNONE:
   2435         m_value.valueID = CSSValueNone;
   2436         break;
   2437     case TSDISC:
   2438         m_value.valueID = CSSValueDisc;
   2439         break;
   2440     case TSCIRCLE:
   2441         m_value.valueID = CSSValueCircle;
   2442         break;
   2443     case TSSQUARE:
   2444         m_value.valueID = CSSValueSquare;
   2445         break;
   2446     }
   2447 }
   2448 
   2449 template<> inline CSSPrimitiveValue::operator ETextSecurity() const
   2450 {
   2451     ASSERT(isValueID());
   2452     switch (m_value.valueID) {
   2453     case CSSValueNone:
   2454         return TSNONE;
   2455     case CSSValueDisc:
   2456         return TSDISC;
   2457     case CSSValueCircle:
   2458         return TSCIRCLE;
   2459     case CSSValueSquare:
   2460         return TSSQUARE;
   2461     default:
   2462         break;
   2463     }
   2464 
   2465     ASSERT_NOT_REACHED();
   2466     return TSNONE;
   2467 }
   2468 
   2469 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextTransform e)
   2470     : CSSValue(PrimitiveClass)
   2471 {
   2472     m_primitiveUnitType = CSS_VALUE_ID;
   2473     switch (e) {
   2474     case CAPITALIZE:
   2475         m_value.valueID = CSSValueCapitalize;
   2476         break;
   2477     case UPPERCASE:
   2478         m_value.valueID = CSSValueUppercase;
   2479         break;
   2480     case LOWERCASE:
   2481         m_value.valueID = CSSValueLowercase;
   2482         break;
   2483     case TTNONE:
   2484         m_value.valueID = CSSValueNone;
   2485         break;
   2486     }
   2487 }
   2488 
   2489 template<> inline CSSPrimitiveValue::operator ETextTransform() const
   2490 {
   2491     ASSERT(isValueID());
   2492     switch (m_value.valueID) {
   2493     case CSSValueCapitalize:
   2494         return CAPITALIZE;
   2495     case CSSValueUppercase:
   2496         return UPPERCASE;
   2497     case CSSValueLowercase:
   2498         return LOWERCASE;
   2499     case CSSValueNone:
   2500         return TTNONE;
   2501     default:
   2502         break;
   2503     }
   2504 
   2505     ASSERT_NOT_REACHED();
   2506     return TTNONE;
   2507 }
   2508 
   2509 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUnicodeBidi e)
   2510     : CSSValue(PrimitiveClass)
   2511 {
   2512     m_primitiveUnitType = CSS_VALUE_ID;
   2513     switch (e) {
   2514     case UBNormal:
   2515         m_value.valueID = CSSValueNormal;
   2516         break;
   2517     case Embed:
   2518         m_value.valueID = CSSValueEmbed;
   2519         break;
   2520     case Override:
   2521         m_value.valueID = CSSValueBidiOverride;
   2522         break;
   2523     case Isolate:
   2524         m_value.valueID = CSSValueWebkitIsolate;
   2525         break;
   2526     case IsolateOverride:
   2527         m_value.valueID = CSSValueWebkitIsolateOverride;
   2528         break;
   2529     case Plaintext:
   2530         m_value.valueID = CSSValueWebkitPlaintext;
   2531         break;
   2532     }
   2533 }
   2534 
   2535 template<> inline CSSPrimitiveValue::operator EUnicodeBidi() const
   2536 {
   2537     ASSERT(isValueID());
   2538     switch (m_value.valueID) {
   2539     case CSSValueNormal:
   2540         return UBNormal;
   2541     case CSSValueEmbed:
   2542         return Embed;
   2543     case CSSValueBidiOverride:
   2544         return Override;
   2545     case CSSValueWebkitIsolate:
   2546         return Isolate;
   2547     case CSSValueWebkitIsolateOverride:
   2548         return IsolateOverride;
   2549     case CSSValueWebkitPlaintext:
   2550         return Plaintext;
   2551     default:
   2552         break;
   2553     }
   2554 
   2555     ASSERT_NOT_REACHED();
   2556     return UBNormal;
   2557 }
   2558 
   2559 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserDrag e)
   2560     : CSSValue(PrimitiveClass)
   2561 {
   2562     m_primitiveUnitType = CSS_VALUE_ID;
   2563     switch (e) {
   2564     case DRAG_AUTO:
   2565         m_value.valueID = CSSValueAuto;
   2566         break;
   2567     case DRAG_NONE:
   2568         m_value.valueID = CSSValueNone;
   2569         break;
   2570     case DRAG_ELEMENT:
   2571         m_value.valueID = CSSValueElement;
   2572         break;
   2573     default:
   2574         break;
   2575     }
   2576 }
   2577 
   2578 template<> inline CSSPrimitiveValue::operator EUserDrag() const
   2579 {
   2580     ASSERT(isValueID());
   2581     switch (m_value.valueID) {
   2582     case CSSValueAuto:
   2583         return DRAG_AUTO;
   2584     case CSSValueNone:
   2585         return DRAG_NONE;
   2586     case CSSValueElement:
   2587         return DRAG_ELEMENT;
   2588     default:
   2589         break;
   2590     }
   2591 
   2592     ASSERT_NOT_REACHED();
   2593     return DRAG_AUTO;
   2594 }
   2595 
   2596 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserModify e)
   2597     : CSSValue(PrimitiveClass)
   2598 {
   2599     m_primitiveUnitType = CSS_VALUE_ID;
   2600     switch (e) {
   2601     case READ_ONLY:
   2602         m_value.valueID = CSSValueReadOnly;
   2603         break;
   2604     case READ_WRITE:
   2605         m_value.valueID = CSSValueReadWrite;
   2606         break;
   2607     case READ_WRITE_PLAINTEXT_ONLY:
   2608         m_value.valueID = CSSValueReadWritePlaintextOnly;
   2609         break;
   2610     }
   2611 }
   2612 
   2613 template<> inline CSSPrimitiveValue::operator EUserModify() const
   2614 {
   2615     ASSERT(isValueID());
   2616     switch (m_value.valueID) {
   2617     case CSSValueReadOnly:
   2618         return READ_ONLY;
   2619     case CSSValueReadWrite:
   2620         return READ_WRITE;
   2621     case CSSValueReadWritePlaintextOnly:
   2622         return READ_WRITE_PLAINTEXT_ONLY;
   2623     default:
   2624         break;
   2625     }
   2626 
   2627     ASSERT_NOT_REACHED();
   2628     return READ_ONLY;
   2629 }
   2630 
   2631 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserSelect e)
   2632     : CSSValue(PrimitiveClass)
   2633 {
   2634     m_primitiveUnitType = CSS_VALUE_ID;
   2635     switch (e) {
   2636     case SELECT_NONE:
   2637         m_value.valueID = CSSValueNone;
   2638         break;
   2639     case SELECT_TEXT:
   2640         m_value.valueID = CSSValueText;
   2641         break;
   2642     case SELECT_ALL:
   2643         m_value.valueID = CSSValueAll;
   2644         break;
   2645     }
   2646 }
   2647 
   2648 template<> inline CSSPrimitiveValue::operator EUserSelect() const
   2649 {
   2650     ASSERT(isValueID());
   2651     switch (m_value.valueID) {
   2652     case CSSValueAuto:
   2653         return SELECT_TEXT;
   2654     case CSSValueNone:
   2655         return SELECT_NONE;
   2656     case CSSValueText:
   2657         return SELECT_TEXT;
   2658     case CSSValueAll:
   2659         return SELECT_ALL;
   2660     default:
   2661         break;
   2662     }
   2663 
   2664     ASSERT_NOT_REACHED();
   2665     return SELECT_TEXT;
   2666 }
   2667 
   2668 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EVerticalAlign a)
   2669     : CSSValue(PrimitiveClass)
   2670 {
   2671     m_primitiveUnitType = CSS_VALUE_ID;
   2672     switch (a) {
   2673     case TOP:
   2674         m_value.valueID = CSSValueTop;
   2675         break;
   2676     case BOTTOM:
   2677         m_value.valueID = CSSValueBottom;
   2678         break;
   2679     case MIDDLE:
   2680         m_value.valueID = CSSValueMiddle;
   2681         break;
   2682     case BASELINE:
   2683         m_value.valueID = CSSValueBaseline;
   2684         break;
   2685     case TEXT_BOTTOM:
   2686         m_value.valueID = CSSValueTextBottom;
   2687         break;
   2688     case TEXT_TOP:
   2689         m_value.valueID = CSSValueTextTop;
   2690         break;
   2691     case SUB:
   2692         m_value.valueID = CSSValueSub;
   2693         break;
   2694     case SUPER:
   2695         m_value.valueID = CSSValueSuper;
   2696         break;
   2697     case BASELINE_MIDDLE:
   2698         m_value.valueID = CSSValueWebkitBaselineMiddle;
   2699         break;
   2700     case LENGTH:
   2701         m_value.valueID = CSSValueInvalid;
   2702     }
   2703 }
   2704 
   2705 template<> inline CSSPrimitiveValue::operator EVerticalAlign() const
   2706 {
   2707     ASSERT(isValueID());
   2708     switch (m_value.valueID) {
   2709     case CSSValueTop:
   2710         return TOP;
   2711     case CSSValueBottom:
   2712         return BOTTOM;
   2713     case CSSValueMiddle:
   2714         return MIDDLE;
   2715     case CSSValueBaseline:
   2716         return BASELINE;
   2717     case CSSValueTextBottom:
   2718         return TEXT_BOTTOM;
   2719     case CSSValueTextTop:
   2720         return TEXT_TOP;
   2721     case CSSValueSub:
   2722         return SUB;
   2723     case CSSValueSuper:
   2724         return SUPER;
   2725     case CSSValueWebkitBaselineMiddle:
   2726         return BASELINE_MIDDLE;
   2727     default:
   2728         break;
   2729     }
   2730 
   2731     ASSERT_NOT_REACHED();
   2732     return TOP;
   2733 }
   2734 
   2735 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EVisibility e)
   2736     : CSSValue(PrimitiveClass)
   2737 {
   2738     m_primitiveUnitType = CSS_VALUE_ID;
   2739     switch (e) {
   2740     case VISIBLE:
   2741         m_value.valueID = CSSValueVisible;
   2742         break;
   2743     case HIDDEN:
   2744         m_value.valueID = CSSValueHidden;
   2745         break;
   2746     case COLLAPSE:
   2747         m_value.valueID = CSSValueCollapse;
   2748         break;
   2749     }
   2750 }
   2751 
   2752 template<> inline CSSPrimitiveValue::operator EVisibility() const
   2753 {
   2754     ASSERT(isValueID());
   2755     switch (m_value.valueID) {
   2756     case CSSValueHidden:
   2757         return HIDDEN;
   2758     case CSSValueVisible:
   2759         return VISIBLE;
   2760     case CSSValueCollapse:
   2761         return COLLAPSE;
   2762     default:
   2763         break;
   2764     }
   2765 
   2766     ASSERT_NOT_REACHED();
   2767     return VISIBLE;
   2768 }
   2769 
   2770 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWhiteSpace e)
   2771     : CSSValue(PrimitiveClass)
   2772 {
   2773     m_primitiveUnitType = CSS_VALUE_ID;
   2774     switch (e) {
   2775     case NORMAL:
   2776         m_value.valueID = CSSValueNormal;
   2777         break;
   2778     case PRE:
   2779         m_value.valueID = CSSValuePre;
   2780         break;
   2781     case PRE_WRAP:
   2782         m_value.valueID = CSSValuePreWrap;
   2783         break;
   2784     case PRE_LINE:
   2785         m_value.valueID = CSSValuePreLine;
   2786         break;
   2787     case NOWRAP:
   2788         m_value.valueID = CSSValueNowrap;
   2789         break;
   2790     case KHTML_NOWRAP:
   2791         m_value.valueID = CSSValueWebkitNowrap;
   2792         break;
   2793     }
   2794 }
   2795 
   2796 template<> inline CSSPrimitiveValue::operator EWhiteSpace() const
   2797 {
   2798     ASSERT(isValueID());
   2799     switch (m_value.valueID) {
   2800     case CSSValueWebkitNowrap:
   2801         return KHTML_NOWRAP;
   2802     case CSSValueNowrap:
   2803         return NOWRAP;
   2804     case CSSValuePre:
   2805         return PRE;
   2806     case CSSValuePreWrap:
   2807         return PRE_WRAP;
   2808     case CSSValuePreLine:
   2809         return PRE_LINE;
   2810     case CSSValueNormal:
   2811         return NORMAL;
   2812     default:
   2813         break;
   2814     }
   2815 
   2816     ASSERT_NOT_REACHED();
   2817     return NORMAL;
   2818 }
   2819 
   2820 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWordBreak e)
   2821     : CSSValue(PrimitiveClass)
   2822 {
   2823     m_primitiveUnitType = CSS_VALUE_ID;
   2824     switch (e) {
   2825     case NormalWordBreak:
   2826         m_value.valueID = CSSValueNormal;
   2827         break;
   2828     case BreakAllWordBreak:
   2829         m_value.valueID = CSSValueBreakAll;
   2830         break;
   2831     case BreakWordBreak:
   2832         m_value.valueID = CSSValueBreakWord;
   2833         break;
   2834     }
   2835 }
   2836 
   2837 template<> inline CSSPrimitiveValue::operator EWordBreak() const
   2838 {
   2839     ASSERT(isValueID());
   2840     switch (m_value.valueID) {
   2841     case CSSValueBreakAll:
   2842         return BreakAllWordBreak;
   2843     case CSSValueBreakWord:
   2844         return BreakWordBreak;
   2845     case CSSValueNormal:
   2846         return NormalWordBreak;
   2847     default:
   2848         break;
   2849     }
   2850 
   2851     ASSERT_NOT_REACHED();
   2852     return NormalWordBreak;
   2853 }
   2854 
   2855 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EOverflowWrap e)
   2856     : CSSValue(PrimitiveClass)
   2857 {
   2858     m_primitiveUnitType = CSS_VALUE_ID;
   2859     switch (e) {
   2860     case NormalOverflowWrap:
   2861         m_value.valueID = CSSValueNormal;
   2862         break;
   2863     case BreakOverflowWrap:
   2864         m_value.valueID = CSSValueBreakWord;
   2865         break;
   2866     }
   2867 }
   2868 
   2869 template<> inline CSSPrimitiveValue::operator EOverflowWrap() const
   2870 {
   2871     ASSERT(isValueID());
   2872     switch (m_value.valueID) {
   2873     case CSSValueBreakWord:
   2874         return BreakOverflowWrap;
   2875     case CSSValueNormal:
   2876         return NormalOverflowWrap;
   2877     default:
   2878         break;
   2879     }
   2880 
   2881     ASSERT_NOT_REACHED();
   2882     return NormalOverflowWrap;
   2883 }
   2884 
   2885 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextDirection e)
   2886     : CSSValue(PrimitiveClass)
   2887 {
   2888     m_primitiveUnitType = CSS_VALUE_ID;
   2889     switch (e) {
   2890     case LTR:
   2891         m_value.valueID = CSSValueLtr;
   2892         break;
   2893     case RTL:
   2894         m_value.valueID = CSSValueRtl;
   2895         break;
   2896     }
   2897 }
   2898 
   2899 template<> inline CSSPrimitiveValue::operator TextDirection() const
   2900 {
   2901     ASSERT(isValueID());
   2902     switch (m_value.valueID) {
   2903     case CSSValueLtr:
   2904         return LTR;
   2905     case CSSValueRtl:
   2906         return RTL;
   2907     default:
   2908         break;
   2909     }
   2910 
   2911     ASSERT_NOT_REACHED();
   2912     return LTR;
   2913 }
   2914 
   2915 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(WritingMode e)
   2916     : CSSValue(PrimitiveClass)
   2917 {
   2918     m_primitiveUnitType = CSS_VALUE_ID;
   2919     switch (e) {
   2920     case TopToBottomWritingMode:
   2921         m_value.valueID = CSSValueHorizontalTb;
   2922         break;
   2923     case RightToLeftWritingMode:
   2924         m_value.valueID = CSSValueVerticalRl;
   2925         break;
   2926     case LeftToRightWritingMode:
   2927         m_value.valueID = CSSValueVerticalLr;
   2928         break;
   2929     case BottomToTopWritingMode:
   2930         m_value.valueID = CSSValueHorizontalBt;
   2931         break;
   2932     }
   2933 }
   2934 
   2935 template<> inline CSSPrimitiveValue::operator WritingMode() const
   2936 {
   2937     ASSERT(isValueID());
   2938     switch (m_value.valueID) {
   2939     case CSSValueHorizontalTb:
   2940         return TopToBottomWritingMode;
   2941     case CSSValueVerticalRl:
   2942         return RightToLeftWritingMode;
   2943     case CSSValueVerticalLr:
   2944         return LeftToRightWritingMode;
   2945     case CSSValueHorizontalBt:
   2946         return BottomToTopWritingMode;
   2947     default:
   2948         break;
   2949     }
   2950 
   2951     ASSERT_NOT_REACHED();
   2952     return TopToBottomWritingMode;
   2953 }
   2954 
   2955 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextCombine e)
   2956     : CSSValue(PrimitiveClass)
   2957 {
   2958     m_primitiveUnitType = CSS_VALUE_ID;
   2959     switch (e) {
   2960     case TextCombineNone:
   2961         m_value.valueID = CSSValueNone;
   2962         break;
   2963     case TextCombineHorizontal:
   2964         m_value.valueID = CSSValueHorizontal;
   2965         break;
   2966     }
   2967 }
   2968 
   2969 template<> inline CSSPrimitiveValue::operator TextCombine() const
   2970 {
   2971     ASSERT(isValueID());
   2972     switch (m_value.valueID) {
   2973     case CSSValueNone:
   2974         return TextCombineNone;
   2975     case CSSValueHorizontal:
   2976         return TextCombineHorizontal;
   2977     default:
   2978         break;
   2979     }
   2980 
   2981     ASSERT_NOT_REACHED();
   2982     return TextCombineNone;
   2983 }
   2984 
   2985 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(RubyPosition position)
   2986     : CSSValue(PrimitiveClass)
   2987 {
   2988     m_primitiveUnitType = CSS_VALUE_ID;
   2989     switch (position) {
   2990     case RubyPositionBefore:
   2991         m_value.valueID = CSSValueBefore;
   2992         break;
   2993     case RubyPositionAfter:
   2994         m_value.valueID = CSSValueAfter;
   2995         break;
   2996     }
   2997 }
   2998 
   2999 template<> inline CSSPrimitiveValue::operator RubyPosition() const
   3000 {
   3001     ASSERT(isValueID());
   3002     switch (m_value.valueID) {
   3003     case CSSValueBefore:
   3004         return RubyPositionBefore;
   3005     case CSSValueAfter:
   3006         return RubyPositionAfter;
   3007     default:
   3008         break;
   3009     }
   3010 
   3011     ASSERT_NOT_REACHED();
   3012     return RubyPositionBefore;
   3013 }
   3014 
   3015 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextEmphasisPosition position)
   3016     : CSSValue(PrimitiveClass)
   3017 {
   3018     m_primitiveUnitType = CSS_VALUE_ID;
   3019     switch (position) {
   3020     case TextEmphasisPositionOver:
   3021         m_value.valueID = CSSValueOver;
   3022         break;
   3023     case TextEmphasisPositionUnder:
   3024         m_value.valueID = CSSValueUnder;
   3025         break;
   3026     }
   3027 }
   3028 
   3029 template<> inline CSSPrimitiveValue::operator TextEmphasisPosition() const
   3030 {
   3031     ASSERT(isValueID());
   3032     switch (m_value.valueID) {
   3033     case CSSValueOver:
   3034         return TextEmphasisPositionOver;
   3035     case CSSValueUnder:
   3036         return TextEmphasisPositionUnder;
   3037     default:
   3038         break;
   3039     }
   3040 
   3041     ASSERT_NOT_REACHED();
   3042     return TextEmphasisPositionOver;
   3043 }
   3044 
   3045 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextOverflow overflow)
   3046     : CSSValue(PrimitiveClass)
   3047 {
   3048     m_primitiveUnitType = CSS_VALUE_ID;
   3049     switch (overflow) {
   3050     case TextOverflowClip:
   3051         m_value.valueID = CSSValueClip;
   3052         break;
   3053     case TextOverflowEllipsis:
   3054         m_value.valueID = CSSValueEllipsis;
   3055         break;
   3056     }
   3057 }
   3058 
   3059 template<> inline CSSPrimitiveValue::operator TextOverflow() const
   3060 {
   3061     ASSERT(isValueID());
   3062     switch (m_value.valueID) {
   3063     case CSSValueClip:
   3064         return TextOverflowClip;
   3065     case CSSValueEllipsis:
   3066         return TextOverflowEllipsis;
   3067     default:
   3068         break;
   3069     }
   3070 
   3071     ASSERT_NOT_REACHED();
   3072     return TextOverflowClip;
   3073 }
   3074 
   3075 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextEmphasisFill fill)
   3076     : CSSValue(PrimitiveClass)
   3077 {
   3078     m_primitiveUnitType = CSS_VALUE_ID;
   3079     switch (fill) {
   3080     case TextEmphasisFillFilled:
   3081         m_value.valueID = CSSValueFilled;
   3082         break;
   3083     case TextEmphasisFillOpen:
   3084         m_value.valueID = CSSValueOpen;
   3085         break;
   3086     }
   3087 }
   3088 
   3089 template<> inline CSSPrimitiveValue::operator TextEmphasisFill() const
   3090 {
   3091     ASSERT(isValueID());
   3092     switch (m_value.valueID) {
   3093     case CSSValueFilled:
   3094         return TextEmphasisFillFilled;
   3095     case CSSValueOpen:
   3096         return TextEmphasisFillOpen;
   3097     default:
   3098         break;
   3099     }
   3100 
   3101     ASSERT_NOT_REACHED();
   3102     return TextEmphasisFillFilled;
   3103 }
   3104 
   3105 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextEmphasisMark mark)
   3106     : CSSValue(PrimitiveClass)
   3107 {
   3108     m_primitiveUnitType = CSS_VALUE_ID;
   3109     switch (mark) {
   3110     case TextEmphasisMarkDot:
   3111         m_value.valueID = CSSValueDot;
   3112         break;
   3113     case TextEmphasisMarkCircle:
   3114         m_value.valueID = CSSValueCircle;
   3115         break;
   3116     case TextEmphasisMarkDoubleCircle:
   3117         m_value.valueID = CSSValueDoubleCircle;
   3118         break;
   3119     case TextEmphasisMarkTriangle:
   3120         m_value.valueID = CSSValueTriangle;
   3121         break;
   3122     case TextEmphasisMarkSesame:
   3123         m_value.valueID = CSSValueSesame;
   3124         break;
   3125     case TextEmphasisMarkNone:
   3126     case TextEmphasisMarkAuto:
   3127     case TextEmphasisMarkCustom:
   3128         ASSERT_NOT_REACHED();
   3129         m_value.valueID = CSSValueNone;
   3130         break;
   3131     }
   3132 }
   3133 
   3134 template<> inline CSSPrimitiveValue::operator TextEmphasisMark() const
   3135 {
   3136     ASSERT(isValueID());
   3137     switch (m_value.valueID) {
   3138     case CSSValueNone:
   3139         return TextEmphasisMarkNone;
   3140     case CSSValueDot:
   3141         return TextEmphasisMarkDot;
   3142     case CSSValueCircle:
   3143         return TextEmphasisMarkCircle;
   3144     case CSSValueDoubleCircle:
   3145         return TextEmphasisMarkDoubleCircle;
   3146     case CSSValueTriangle:
   3147         return TextEmphasisMarkTriangle;
   3148     case CSSValueSesame:
   3149         return TextEmphasisMarkSesame;
   3150     default:
   3151         break;
   3152     }
   3153 
   3154     ASSERT_NOT_REACHED();
   3155     return TextEmphasisMarkNone;
   3156 }
   3157 
   3158 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextOrientation e)
   3159     : CSSValue(PrimitiveClass)
   3160 {
   3161     m_primitiveUnitType = CSS_VALUE_ID;
   3162     switch (e) {
   3163     case TextOrientationSideways:
   3164         m_value.valueID = CSSValueSideways;
   3165         break;
   3166     case TextOrientationSidewaysRight:
   3167         m_value.valueID = CSSValueSidewaysRight;
   3168         break;
   3169     case TextOrientationVerticalRight:
   3170         m_value.valueID = CSSValueVerticalRight;
   3171         break;
   3172     case TextOrientationUpright:
   3173         m_value.valueID = CSSValueUpright;
   3174         break;
   3175     }
   3176 }
   3177 
   3178 template<> inline CSSPrimitiveValue::operator TextOrientation() const
   3179 {
   3180     ASSERT(isValueID());
   3181     switch (m_value.valueID) {
   3182     case CSSValueSideways:
   3183         return TextOrientationSideways;
   3184     case CSSValueSidewaysRight:
   3185         return TextOrientationSidewaysRight;
   3186     case CSSValueVerticalRight:
   3187         return TextOrientationVerticalRight;
   3188     case CSSValueUpright:
   3189         return TextOrientationUpright;
   3190     default:
   3191         break;
   3192     }
   3193 
   3194     ASSERT_NOT_REACHED();
   3195     return TextOrientationVerticalRight;
   3196 }
   3197 
   3198 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPointerEvents e)
   3199     : CSSValue(PrimitiveClass)
   3200 {
   3201     m_primitiveUnitType = CSS_VALUE_ID;
   3202     switch (e) {
   3203     case PE_NONE:
   3204         m_value.valueID = CSSValueNone;
   3205         break;
   3206     case PE_STROKE:
   3207         m_value.valueID = CSSValueStroke;
   3208         break;
   3209     case PE_FILL:
   3210         m_value.valueID = CSSValueFill;
   3211         break;
   3212     case PE_PAINTED:
   3213         m_value.valueID = CSSValuePainted;
   3214         break;
   3215     case PE_VISIBLE:
   3216         m_value.valueID = CSSValueVisible;
   3217         break;
   3218     case PE_VISIBLE_STROKE:
   3219         m_value.valueID = CSSValueVisiblestroke;
   3220         break;
   3221     case PE_VISIBLE_FILL:
   3222         m_value.valueID = CSSValueVisiblefill;
   3223         break;
   3224     case PE_VISIBLE_PAINTED:
   3225         m_value.valueID = CSSValueVisiblepainted;
   3226         break;
   3227     case PE_AUTO:
   3228         m_value.valueID = CSSValueAuto;
   3229         break;
   3230     case PE_ALL:
   3231         m_value.valueID = CSSValueAll;
   3232         break;
   3233     case PE_BOUNDINGBOX:
   3234         m_value.valueID = CSSValueBoundingBox;
   3235         break;
   3236     }
   3237 }
   3238 
   3239 template<> inline CSSPrimitiveValue::operator EPointerEvents() const
   3240 {
   3241     ASSERT(isValueID());
   3242     switch (m_value.valueID) {
   3243     case CSSValueAll:
   3244         return PE_ALL;
   3245     case CSSValueAuto:
   3246         return PE_AUTO;
   3247     case CSSValueNone:
   3248         return PE_NONE;
   3249     case CSSValueVisiblepainted:
   3250         return PE_VISIBLE_PAINTED;
   3251     case CSSValueVisiblefill:
   3252         return PE_VISIBLE_FILL;
   3253     case CSSValueVisiblestroke:
   3254         return PE_VISIBLE_STROKE;
   3255     case CSSValueVisible:
   3256         return PE_VISIBLE;
   3257     case CSSValuePainted:
   3258         return PE_PAINTED;
   3259     case CSSValueFill:
   3260         return PE_FILL;
   3261     case CSSValueStroke:
   3262         return PE_STROKE;
   3263     case CSSValueBoundingBox:
   3264         return PE_BOUNDINGBOX;
   3265     default:
   3266         break;
   3267     }
   3268 
   3269     ASSERT_NOT_REACHED();
   3270     return PE_ALL;
   3271 }
   3272 
   3273 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontDescription::Kerning kerning)
   3274     : CSSValue(PrimitiveClass)
   3275 {
   3276     m_primitiveUnitType = CSS_VALUE_ID;
   3277     switch (kerning) {
   3278     case FontDescription::AutoKerning:
   3279         m_value.valueID = CSSValueAuto;
   3280         return;
   3281     case FontDescription::NormalKerning:
   3282         m_value.valueID = CSSValueNormal;
   3283         return;
   3284     case FontDescription::NoneKerning:
   3285         m_value.valueID = CSSValueNone;
   3286         return;
   3287     }
   3288 
   3289     ASSERT_NOT_REACHED();
   3290     m_value.valueID = CSSValueAuto;
   3291 }
   3292 
   3293 template<> inline CSSPrimitiveValue::operator FontDescription::Kerning() const
   3294 {
   3295     ASSERT(isValueID());
   3296     switch (m_value.valueID) {
   3297     case CSSValueAuto:
   3298         return FontDescription::AutoKerning;
   3299     case CSSValueNormal:
   3300         return FontDescription::NormalKerning;
   3301     case CSSValueNone:
   3302         return FontDescription::NoneKerning;
   3303     default:
   3304         break;
   3305     }
   3306 
   3307     ASSERT_NOT_REACHED();
   3308     return FontDescription::AutoKerning;
   3309 }
   3310 
   3311 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ObjectFit fit)
   3312     : CSSValue(PrimitiveClass)
   3313 {
   3314     m_primitiveUnitType = CSS_VALUE_ID;
   3315     switch (fit) {
   3316     case ObjectFitFill:
   3317         m_value.valueID = CSSValueFill;
   3318         break;
   3319     case ObjectFitContain:
   3320         m_value.valueID = CSSValueContain;
   3321         break;
   3322     case ObjectFitCover:
   3323         m_value.valueID = CSSValueCover;
   3324         break;
   3325     case ObjectFitNone:
   3326         m_value.valueID = CSSValueNone;
   3327         break;
   3328     case ObjectFitScaleDown:
   3329         m_value.valueID = CSSValueScaleDown;
   3330         break;
   3331     }
   3332 }
   3333 
   3334 template<> inline CSSPrimitiveValue::operator ObjectFit() const
   3335 {
   3336     switch (m_value.valueID) {
   3337     case CSSValueFill:
   3338         return ObjectFitFill;
   3339     case CSSValueContain:
   3340         return ObjectFitContain;
   3341     case CSSValueCover:
   3342         return ObjectFitCover;
   3343     case CSSValueNone:
   3344         return ObjectFitNone;
   3345     case CSSValueScaleDown:
   3346         return ObjectFitScaleDown;
   3347     default:
   3348         ASSERT_NOT_REACHED();
   3349         return ObjectFitFill;
   3350     }
   3351 }
   3352 
   3353 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillSizeType fillSize)
   3354     : CSSValue(PrimitiveClass)
   3355 {
   3356     m_primitiveUnitType = CSS_VALUE_ID;
   3357     switch (fillSize) {
   3358     case Contain:
   3359         m_value.valueID = CSSValueContain;
   3360         break;
   3361     case Cover:
   3362         m_value.valueID = CSSValueCover;
   3363         break;
   3364     case SizeNone:
   3365         m_value.valueID = CSSValueNone;
   3366         break;
   3367     case SizeLength:
   3368     default:
   3369         ASSERT_NOT_REACHED();
   3370     }
   3371 }
   3372 
   3373 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontSmoothingMode smoothing)
   3374     : CSSValue(PrimitiveClass)
   3375 {
   3376     m_primitiveUnitType = CSS_VALUE_ID;
   3377     switch (smoothing) {
   3378     case AutoSmoothing:
   3379         m_value.valueID = CSSValueAuto;
   3380         return;
   3381     case NoSmoothing:
   3382         m_value.valueID = CSSValueNone;
   3383         return;
   3384     case Antialiased:
   3385         m_value.valueID = CSSValueAntialiased;
   3386         return;
   3387     case SubpixelAntialiased:
   3388         m_value.valueID = CSSValueSubpixelAntialiased;
   3389         return;
   3390     }
   3391 
   3392     ASSERT_NOT_REACHED();
   3393     m_value.valueID = CSSValueAuto;
   3394 }
   3395 
   3396 template<> inline CSSPrimitiveValue::operator FontSmoothingMode() const
   3397 {
   3398     ASSERT(isValueID());
   3399     switch (m_value.valueID) {
   3400     case CSSValueAuto:
   3401         return AutoSmoothing;
   3402     case CSSValueNone:
   3403         return NoSmoothing;
   3404     case CSSValueAntialiased:
   3405         return Antialiased;
   3406     case CSSValueSubpixelAntialiased:
   3407         return SubpixelAntialiased;
   3408     default:
   3409         break;
   3410     }
   3411 
   3412     ASSERT_NOT_REACHED();
   3413     return AutoSmoothing;
   3414 }
   3415 
   3416 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontWeight weight)
   3417     : CSSValue(PrimitiveClass)
   3418 {
   3419     m_primitiveUnitType = CSS_VALUE_ID;
   3420     switch (weight) {
   3421     case FontWeight900:
   3422         m_value.valueID = CSSValue900;
   3423         return;
   3424     case FontWeight800:
   3425         m_value.valueID = CSSValue800;
   3426         return;
   3427     case FontWeight700:
   3428         m_value.valueID = CSSValueBold;
   3429         return;
   3430     case FontWeight600:
   3431         m_value.valueID = CSSValue600;
   3432         return;
   3433     case FontWeight500:
   3434         m_value.valueID = CSSValue500;
   3435         return;
   3436     case FontWeight400:
   3437         m_value.valueID = CSSValueNormal;
   3438         return;
   3439     case FontWeight300:
   3440         m_value.valueID = CSSValue300;
   3441         return;
   3442     case FontWeight200:
   3443         m_value.valueID = CSSValue200;
   3444         return;
   3445     case FontWeight100:
   3446         m_value.valueID = CSSValue100;
   3447         return;
   3448     }
   3449 
   3450     ASSERT_NOT_REACHED();
   3451     m_value.valueID = CSSValueNormal;
   3452 }
   3453 
   3454 template<> inline CSSPrimitiveValue::operator FontWeight() const
   3455 {
   3456     ASSERT(isValueID());
   3457     switch (m_value.valueID) {
   3458     case CSSValueBold:
   3459         return FontWeightBold;
   3460     case CSSValueNormal:
   3461         return FontWeightNormal;
   3462     case CSSValue900:
   3463         return FontWeight900;
   3464     case CSSValue800:
   3465         return FontWeight800;
   3466     case CSSValue700:
   3467         return FontWeight700;
   3468     case CSSValue600:
   3469         return FontWeight600;
   3470     case CSSValue500:
   3471         return FontWeight500;
   3472     case CSSValue400:
   3473         return FontWeight400;
   3474     case CSSValue300:
   3475         return FontWeight300;
   3476     case CSSValue200:
   3477         return FontWeight200;
   3478     case CSSValue100:
   3479         return FontWeight100;
   3480     default:
   3481         break;
   3482     }
   3483 
   3484     ASSERT_NOT_REACHED();
   3485     return FontWeightNormal;
   3486 }
   3487 
   3488 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontStyle italic)
   3489     : CSSValue(PrimitiveClass)
   3490 {
   3491     m_primitiveUnitType = CSS_VALUE_ID;
   3492     switch (italic) {
   3493     case FontStyleNormal:
   3494         m_value.valueID = CSSValueNormal;
   3495         return;
   3496     case FontStyleItalic:
   3497         m_value.valueID = CSSValueItalic;
   3498         return;
   3499     }
   3500 
   3501     ASSERT_NOT_REACHED();
   3502     m_value.valueID = CSSValueNormal;
   3503 }
   3504 
   3505 template<> inline CSSPrimitiveValue::operator FontStyle() const
   3506 {
   3507     ASSERT(isValueID());
   3508     switch (m_value.valueID) {
   3509     case CSSValueOblique:
   3510     // FIXME: oblique is the same as italic for the moment...
   3511     case CSSValueItalic:
   3512         return FontStyleItalic;
   3513     case CSSValueNormal:
   3514         return FontStyleNormal;
   3515     default:
   3516         break;
   3517     }
   3518     ASSERT_NOT_REACHED();
   3519     return FontStyleNormal;
   3520 }
   3521 
   3522 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontStretch stretch)
   3523     : CSSValue(PrimitiveClass)
   3524 {
   3525     m_primitiveUnitType = CSS_VALUE_ID;
   3526     switch (stretch) {
   3527     case FontStretchUltraCondensed:
   3528         m_value.valueID = CSSValueUltraCondensed;
   3529         return;
   3530     case FontStretchExtraCondensed:
   3531         m_value.valueID = CSSValueExtraCondensed;
   3532         return;
   3533     case FontStretchCondensed:
   3534         m_value.valueID = CSSValueCondensed;
   3535         return;
   3536     case FontStretchSemiCondensed:
   3537         m_value.valueID = CSSValueSemiCondensed;
   3538         return;
   3539     case FontStretchNormal:
   3540         m_value.valueID = CSSValueNormal;
   3541         return;
   3542     case FontStretchSemiExpanded:
   3543         m_value.valueID = CSSValueSemiExpanded;
   3544         return;
   3545     case FontStretchExpanded:
   3546         m_value.valueID = CSSValueExpanded;
   3547         return;
   3548     case FontStretchExtraExpanded:
   3549         m_value.valueID = CSSValueExtraExpanded;
   3550         return;
   3551     case FontStretchUltraExpanded:
   3552         m_value.valueID = CSSValueUltraExpanded;
   3553         return;
   3554     }
   3555 
   3556     ASSERT_NOT_REACHED();
   3557     m_value.valueID = CSSValueNormal;
   3558 }
   3559 
   3560 template<> inline CSSPrimitiveValue::operator FontStretch() const
   3561 {
   3562     ASSERT(isValueID());
   3563     switch (m_value.valueID) {
   3564     case CSSValueUltraCondensed:
   3565         return FontStretchUltraCondensed;
   3566     case CSSValueExtraCondensed:
   3567         return FontStretchExtraCondensed;
   3568     case CSSValueCondensed:
   3569         return FontStretchCondensed;
   3570     case CSSValueSemiCondensed:
   3571         return FontStretchSemiCondensed;
   3572     case CSSValueNormal:
   3573         return FontStretchNormal;
   3574     case CSSValueSemiExpanded:
   3575         return FontStretchSemiExpanded;
   3576     case CSSValueExpanded:
   3577         return FontStretchExpanded;
   3578     case CSSValueExtraExpanded:
   3579         return FontStretchExtraExpanded;
   3580     case CSSValueUltraExpanded:
   3581         return FontStretchUltraExpanded;
   3582     default:
   3583         break;
   3584     }
   3585 
   3586     ASSERT_NOT_REACHED();
   3587     return FontStretchNormal;
   3588 }
   3589 
   3590 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontVariant smallCaps)
   3591     : CSSValue(PrimitiveClass)
   3592 {
   3593     m_primitiveUnitType = CSS_VALUE_ID;
   3594     switch (smallCaps) {
   3595     case FontVariantNormal:
   3596         m_value.valueID = CSSValueNormal;
   3597         return;
   3598     case FontVariantSmallCaps:
   3599         m_value.valueID = CSSValueSmallCaps;
   3600         return;
   3601     }
   3602 
   3603     ASSERT_NOT_REACHED();
   3604     m_value.valueID = CSSValueNormal;
   3605 }
   3606 
   3607 template<> inline CSSPrimitiveValue::operator FontVariant() const
   3608 {
   3609     ASSERT(isValueID());
   3610     switch (m_value.valueID) {
   3611     case CSSValueSmallCaps:
   3612         return FontVariantSmallCaps;
   3613     case CSSValueNormal:
   3614         return FontVariantNormal;
   3615     default:
   3616         break;
   3617     }
   3618     ASSERT_NOT_REACHED();
   3619     return FontVariantNormal;
   3620 }
   3621 
   3622 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextRenderingMode e)
   3623     : CSSValue(PrimitiveClass)
   3624 {
   3625     m_primitiveUnitType = CSS_VALUE_ID;
   3626     switch (e) {
   3627     case AutoTextRendering:
   3628         m_value.valueID = CSSValueAuto;
   3629         break;
   3630     case OptimizeSpeed:
   3631         m_value.valueID = CSSValueOptimizespeed;
   3632         break;
   3633     case OptimizeLegibility:
   3634         m_value.valueID = CSSValueOptimizelegibility;
   3635         break;
   3636     case GeometricPrecision:
   3637         m_value.valueID = CSSValueGeometricprecision;
   3638         break;
   3639     }
   3640 }
   3641 
   3642 template<> inline CSSPrimitiveValue::operator TextRenderingMode() const
   3643 {
   3644     ASSERT(isValueID());
   3645     switch (m_value.valueID) {
   3646     case CSSValueAuto:
   3647         return AutoTextRendering;
   3648     case CSSValueOptimizespeed:
   3649         return OptimizeSpeed;
   3650     case CSSValueOptimizelegibility:
   3651         return OptimizeLegibility;
   3652     case CSSValueGeometricprecision:
   3653         return GeometricPrecision;
   3654     default:
   3655         break;
   3656     }
   3657 
   3658     ASSERT_NOT_REACHED();
   3659     return AutoTextRendering;
   3660 }
   3661 
   3662 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ESpeak e)
   3663     : CSSValue(PrimitiveClass)
   3664 {
   3665     m_primitiveUnitType = CSS_VALUE_ID;
   3666     switch (e) {
   3667     case SpeakNone:
   3668         m_value.valueID = CSSValueNone;
   3669         break;
   3670     case SpeakNormal:
   3671         m_value.valueID = CSSValueNormal;
   3672         break;
   3673     case SpeakSpellOut:
   3674         m_value.valueID = CSSValueSpellOut;
   3675         break;
   3676     case SpeakDigits:
   3677         m_value.valueID = CSSValueDigits;
   3678         break;
   3679     case SpeakLiteralPunctuation:
   3680         m_value.valueID = CSSValueLiteralPunctuation;
   3681         break;
   3682     case SpeakNoPunctuation:
   3683         m_value.valueID = CSSValueNoPunctuation;
   3684         break;
   3685     }
   3686 }
   3687 
   3688 template<> inline CSSPrimitiveValue::operator Order() const
   3689 {
   3690     ASSERT(isValueID());
   3691     switch (m_value.valueID) {
   3692     case CSSValueLogical:
   3693         return LogicalOrder;
   3694     case CSSValueVisual:
   3695         return VisualOrder;
   3696     default:
   3697         break;
   3698     }
   3699 
   3700     ASSERT_NOT_REACHED();
   3701     return LogicalOrder;
   3702 }
   3703 
   3704 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(Order e)
   3705     : CSSValue(PrimitiveClass)
   3706 {
   3707     m_primitiveUnitType = CSS_VALUE_ID;
   3708     switch (e) {
   3709     case LogicalOrder:
   3710         m_value.valueID = CSSValueLogical;
   3711         break;
   3712     case VisualOrder:
   3713         m_value.valueID = CSSValueVisual;
   3714         break;
   3715     }
   3716 }
   3717 
   3718 template<> inline CSSPrimitiveValue::operator ESpeak() const
   3719 {
   3720     ASSERT(isValueID());
   3721     switch (m_value.valueID) {
   3722     case CSSValueNone:
   3723         return SpeakNone;
   3724     case CSSValueNormal:
   3725         return SpeakNormal;
   3726     case CSSValueSpellOut:
   3727         return SpeakSpellOut;
   3728     case CSSValueDigits:
   3729         return SpeakDigits;
   3730     case CSSValueLiteralPunctuation:
   3731         return SpeakLiteralPunctuation;
   3732     case CSSValueNoPunctuation:
   3733         return SpeakNoPunctuation;
   3734     default:
   3735         break;
   3736     }
   3737 
   3738     ASSERT_NOT_REACHED();
   3739     return SpeakNormal;
   3740 }
   3741 
   3742 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(blink::WebBlendMode blendMode)
   3743     : CSSValue(PrimitiveClass)
   3744 {
   3745     m_primitiveUnitType = CSS_VALUE_ID;
   3746     switch (blendMode) {
   3747     case blink::WebBlendModeNormal:
   3748         m_value.valueID = CSSValueNormal;
   3749         break;
   3750     case blink::WebBlendModeMultiply:
   3751         m_value.valueID = CSSValueMultiply;
   3752         break;
   3753     case blink::WebBlendModeScreen:
   3754         m_value.valueID = CSSValueScreen;
   3755         break;
   3756     case blink::WebBlendModeOverlay:
   3757         m_value.valueID = CSSValueOverlay;
   3758         break;
   3759     case blink::WebBlendModeDarken:
   3760         m_value.valueID = CSSValueDarken;
   3761         break;
   3762     case blink::WebBlendModeLighten:
   3763         m_value.valueID = CSSValueLighten;
   3764         break;
   3765     case blink::WebBlendModeColorDodge:
   3766         m_value.valueID = CSSValueColorDodge;
   3767         break;
   3768     case blink::WebBlendModeColorBurn:
   3769         m_value.valueID = CSSValueColorBurn;
   3770         break;
   3771     case blink::WebBlendModeHardLight:
   3772         m_value.valueID = CSSValueHardLight;
   3773         break;
   3774     case blink::WebBlendModeSoftLight:
   3775         m_value.valueID = CSSValueSoftLight;
   3776         break;
   3777     case blink::WebBlendModeDifference:
   3778         m_value.valueID = CSSValueDifference;
   3779         break;
   3780     case blink::WebBlendModeExclusion:
   3781         m_value.valueID = CSSValueExclusion;
   3782         break;
   3783     case blink::WebBlendModeHue:
   3784         m_value.valueID = CSSValueHue;
   3785         break;
   3786     case blink::WebBlendModeSaturation:
   3787         m_value.valueID = CSSValueSaturation;
   3788         break;
   3789     case blink::WebBlendModeColor:
   3790         m_value.valueID = CSSValueColor;
   3791         break;
   3792     case blink::WebBlendModeLuminosity:
   3793         m_value.valueID = CSSValueLuminosity;
   3794         break;
   3795     }
   3796 }
   3797 
   3798 template<> inline CSSPrimitiveValue::operator blink::WebBlendMode() const
   3799 {
   3800     ASSERT(isValueID());
   3801     switch (m_value.valueID) {
   3802     case CSSValueNormal:
   3803         return blink::WebBlendModeNormal;
   3804     case CSSValueMultiply:
   3805         return blink::WebBlendModeMultiply;
   3806     case CSSValueScreen:
   3807         return blink::WebBlendModeScreen;
   3808     case CSSValueOverlay:
   3809         return blink::WebBlendModeOverlay;
   3810     case CSSValueDarken:
   3811         return blink::WebBlendModeDarken;
   3812     case CSSValueLighten:
   3813         return blink::WebBlendModeLighten;
   3814     case CSSValueColorDodge:
   3815         return blink::WebBlendModeColorDodge;
   3816     case CSSValueColorBurn:
   3817         return blink::WebBlendModeColorBurn;
   3818     case CSSValueHardLight:
   3819         return blink::WebBlendModeHardLight;
   3820     case CSSValueSoftLight:
   3821         return blink::WebBlendModeSoftLight;
   3822     case CSSValueDifference:
   3823         return blink::WebBlendModeDifference;
   3824     case CSSValueExclusion:
   3825         return blink::WebBlendModeExclusion;
   3826     case CSSValueHue:
   3827         return blink::WebBlendModeHue;
   3828     case CSSValueSaturation:
   3829         return blink::WebBlendModeSaturation;
   3830     case CSSValueColor:
   3831         return blink::WebBlendModeColor;
   3832     case CSSValueLuminosity:
   3833         return blink::WebBlendModeLuminosity;
   3834     default:
   3835         break;
   3836     }
   3837 
   3838     ASSERT_NOT_REACHED();
   3839     return blink::WebBlendModeNormal;
   3840 }
   3841 
   3842 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineCap e)
   3843     : CSSValue(PrimitiveClass)
   3844 {
   3845     m_primitiveUnitType = CSS_VALUE_ID;
   3846     switch (e) {
   3847     case ButtCap:
   3848         m_value.valueID = CSSValueButt;
   3849         break;
   3850     case RoundCap:
   3851         m_value.valueID = CSSValueRound;
   3852         break;
   3853     case SquareCap:
   3854         m_value.valueID = CSSValueSquare;
   3855         break;
   3856     }
   3857 }
   3858 
   3859 template<> inline CSSPrimitiveValue::operator LineCap() const
   3860 {
   3861     ASSERT(isValueID());
   3862     switch (m_value.valueID) {
   3863     case CSSValueButt:
   3864         return ButtCap;
   3865     case CSSValueRound:
   3866         return RoundCap;
   3867     case CSSValueSquare:
   3868         return SquareCap;
   3869     default:
   3870         break;
   3871     }
   3872 
   3873     ASSERT_NOT_REACHED();
   3874     return ButtCap;
   3875 }
   3876 
   3877 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineJoin e)
   3878     : CSSValue(PrimitiveClass)
   3879 {
   3880     m_primitiveUnitType = CSS_VALUE_ID;
   3881     switch (e) {
   3882     case MiterJoin:
   3883         m_value.valueID = CSSValueMiter;
   3884         break;
   3885     case RoundJoin:
   3886         m_value.valueID = CSSValueRound;
   3887         break;
   3888     case BevelJoin:
   3889         m_value.valueID = CSSValueBevel;
   3890         break;
   3891     }
   3892 }
   3893 
   3894 template<> inline CSSPrimitiveValue::operator LineJoin() const
   3895 {
   3896     ASSERT(isValueID());
   3897     switch (m_value.valueID) {
   3898     case CSSValueMiter:
   3899         return MiterJoin;
   3900     case CSSValueRound:
   3901         return RoundJoin;
   3902     case CSSValueBevel:
   3903         return BevelJoin;
   3904     default:
   3905         break;
   3906     }
   3907 
   3908     ASSERT_NOT_REACHED();
   3909     return MiterJoin;
   3910 }
   3911 
   3912 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(WindRule e)
   3913     : CSSValue(PrimitiveClass)
   3914 {
   3915     m_primitiveUnitType = CSS_VALUE_ID;
   3916     switch (e) {
   3917     case RULE_NONZERO:
   3918         m_value.valueID = CSSValueNonzero;
   3919         break;
   3920     case RULE_EVENODD:
   3921         m_value.valueID = CSSValueEvenodd;
   3922         break;
   3923     }
   3924 }
   3925 
   3926 template<> inline CSSPrimitiveValue::operator WindRule() const
   3927 {
   3928     ASSERT(isValueID());
   3929     switch (m_value.valueID) {
   3930     case CSSValueNonzero:
   3931         return RULE_NONZERO;
   3932     case CSSValueEvenodd:
   3933         return RULE_EVENODD;
   3934     default:
   3935         break;
   3936     }
   3937 
   3938     ASSERT_NOT_REACHED();
   3939     return RULE_NONZERO;
   3940 }
   3941 
   3942 
   3943 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EAlignmentBaseline e)
   3944     : CSSValue(PrimitiveClass)
   3945 {
   3946     m_primitiveUnitType = CSS_VALUE_ID;
   3947     switch (e) {
   3948     case AB_AUTO:
   3949         m_value.valueID = CSSValueAuto;
   3950         break;
   3951     case AB_BASELINE:
   3952         m_value.valueID = CSSValueBaseline;
   3953         break;
   3954     case AB_BEFORE_EDGE:
   3955         m_value.valueID = CSSValueBeforeEdge;
   3956         break;
   3957     case AB_TEXT_BEFORE_EDGE:
   3958         m_value.valueID = CSSValueTextBeforeEdge;
   3959         break;
   3960     case AB_MIDDLE:
   3961         m_value.valueID = CSSValueMiddle;
   3962         break;
   3963     case AB_CENTRAL:
   3964         m_value.valueID = CSSValueCentral;
   3965         break;
   3966     case AB_AFTER_EDGE:
   3967         m_value.valueID = CSSValueAfterEdge;
   3968         break;
   3969     case AB_TEXT_AFTER_EDGE:
   3970         m_value.valueID = CSSValueTextAfterEdge;
   3971         break;
   3972     case AB_IDEOGRAPHIC:
   3973         m_value.valueID = CSSValueIdeographic;
   3974         break;
   3975     case AB_ALPHABETIC:
   3976         m_value.valueID = CSSValueAlphabetic;
   3977         break;
   3978     case AB_HANGING:
   3979         m_value.valueID = CSSValueHanging;
   3980         break;
   3981     case AB_MATHEMATICAL:
   3982         m_value.valueID = CSSValueMathematical;
   3983         break;
   3984     }
   3985 }
   3986 
   3987 template<> inline CSSPrimitiveValue::operator EAlignmentBaseline() const
   3988 {
   3989     ASSERT(isValueID());
   3990     switch (m_value.valueID) {
   3991     case CSSValueAuto:
   3992         return AB_AUTO;
   3993     case CSSValueBaseline:
   3994         return AB_BASELINE;
   3995     case CSSValueBeforeEdge:
   3996         return AB_BEFORE_EDGE;
   3997     case CSSValueTextBeforeEdge:
   3998         return AB_TEXT_BEFORE_EDGE;
   3999     case CSSValueMiddle:
   4000         return AB_MIDDLE;
   4001     case CSSValueCentral:
   4002         return AB_CENTRAL;
   4003     case CSSValueAfterEdge:
   4004         return AB_AFTER_EDGE;
   4005     case CSSValueTextAfterEdge:
   4006         return AB_TEXT_AFTER_EDGE;
   4007     case CSSValueIdeographic:
   4008         return AB_IDEOGRAPHIC;
   4009     case CSSValueAlphabetic:
   4010         return AB_ALPHABETIC;
   4011     case CSSValueHanging:
   4012         return AB_HANGING;
   4013     case CSSValueMathematical:
   4014         return AB_MATHEMATICAL;
   4015     default:
   4016         break;
   4017     }
   4018 
   4019     ASSERT_NOT_REACHED();
   4020     return AB_AUTO;
   4021 }
   4022 
   4023 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBorderCollapse e)
   4024     : CSSValue(PrimitiveClass)
   4025 {
   4026     m_primitiveUnitType = CSS_VALUE_ID;
   4027     switch (e) {
   4028     case BSEPARATE:
   4029         m_value.valueID = CSSValueSeparate;
   4030         break;
   4031     case BCOLLAPSE:
   4032         m_value.valueID = CSSValueCollapse;
   4033         break;
   4034     }
   4035 }
   4036 
   4037 template<> inline CSSPrimitiveValue::operator EBorderCollapse() const
   4038 {
   4039     ASSERT(isValueID());
   4040     switch (m_value.valueID) {
   4041     case CSSValueSeparate:
   4042         return BSEPARATE;
   4043     case CSSValueCollapse:
   4044         return BCOLLAPSE;
   4045     default:
   4046         break;
   4047     }
   4048 
   4049     ASSERT_NOT_REACHED();
   4050     return BSEPARATE;
   4051 }
   4052 
   4053 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBorderFit e)
   4054     : CSSValue(PrimitiveClass)
   4055 {
   4056     m_primitiveUnitType = CSS_VALUE_ID;
   4057     switch (e) {
   4058     case BorderFitBorder:
   4059         m_value.valueID = CSSValueBorder;
   4060         break;
   4061     case BorderFitLines:
   4062         m_value.valueID = CSSValueLines;
   4063         break;
   4064     }
   4065 }
   4066 
   4067 template<> inline CSSPrimitiveValue::operator EBorderFit() const
   4068 {
   4069     ASSERT(isValueID());
   4070     switch (m_value.valueID) {
   4071     case CSSValueBorder:
   4072         return BorderFitBorder;
   4073     case CSSValueLines:
   4074         return BorderFitLines;
   4075     default:
   4076         break;
   4077     }
   4078 
   4079     ASSERT_NOT_REACHED();
   4080     return BorderFitLines;
   4081 }
   4082 
   4083 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EImageRendering e)
   4084     : CSSValue(PrimitiveClass)
   4085 {
   4086     m_primitiveUnitType = CSS_VALUE_ID;
   4087     switch (e) {
   4088     case ImageRenderingAuto:
   4089         m_value.valueID = CSSValueAuto;
   4090         break;
   4091     case ImageRenderingOptimizeSpeed:
   4092         m_value.valueID = CSSValueOptimizespeed;
   4093         break;
   4094     case ImageRenderingOptimizeQuality:
   4095         m_value.valueID = CSSValueOptimizequality;
   4096         break;
   4097     case ImageRenderingPixelated:
   4098         m_value.valueID = CSSValuePixelated;
   4099         break;
   4100     case ImageRenderingOptimizeContrast:
   4101         m_value.valueID = CSSValueWebkitOptimizeContrast;
   4102         break;
   4103     }
   4104 }
   4105 
   4106 template<> inline CSSPrimitiveValue::operator EImageRendering() const
   4107 {
   4108     ASSERT(isValueID());
   4109     switch (m_value.valueID) {
   4110     case CSSValueAuto:
   4111         return ImageRenderingAuto;
   4112     case CSSValueOptimizespeed:
   4113         return ImageRenderingOptimizeSpeed;
   4114     case CSSValueOptimizequality:
   4115         return ImageRenderingOptimizeQuality;
   4116     case CSSValuePixelated:
   4117         return ImageRenderingPixelated;
   4118     case CSSValueWebkitOptimizeContrast:
   4119         return ImageRenderingOptimizeContrast;
   4120     default:
   4121         break;
   4122     }
   4123 
   4124     ASSERT_NOT_REACHED();
   4125     return ImageRenderingAuto;
   4126 }
   4127 
   4128 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETransformStyle3D e)
   4129     : CSSValue(PrimitiveClass)
   4130 {
   4131     m_primitiveUnitType = CSS_VALUE_ID;
   4132     switch (e) {
   4133     case TransformStyle3DFlat:
   4134         m_value.valueID = CSSValueFlat;
   4135         break;
   4136     case TransformStyle3DPreserve3D:
   4137         m_value.valueID = CSSValuePreserve3d;
   4138         break;
   4139     }
   4140 }
   4141 
   4142 template<> inline CSSPrimitiveValue::operator ETransformStyle3D() const
   4143 {
   4144     ASSERT(isValueID());
   4145     switch (m_value.valueID) {
   4146     case CSSValueFlat:
   4147         return TransformStyle3DFlat;
   4148     case CSSValuePreserve3d:
   4149         return TransformStyle3DPreserve3D;
   4150     default:
   4151         break;
   4152     }
   4153 
   4154     ASSERT_NOT_REACHED();
   4155     return TransformStyle3DFlat;
   4156 }
   4157 
   4158 enum LengthConversion {
   4159     AnyConversion = ~0,
   4160     FixedConversion = 1 << 0,
   4161     AutoConversion = 1 << 1,
   4162     PercentConversion = 1 << 2,
   4163 };
   4164 
   4165 template<int supported> Length CSSPrimitiveValue::convertToLength(const CSSToLengthConversionData& conversionData)
   4166 {
   4167     if ((supported & FixedConversion) && isLength())
   4168         return computeLength<Length>(conversionData);
   4169     if ((supported & PercentConversion) && isPercentage())
   4170         return Length(getDoubleValue(), Percent);
   4171     if ((supported & AutoConversion) && getValueID() == CSSValueAuto)
   4172         return Length(Auto);
   4173     if ((supported & FixedConversion) && (supported & PercentConversion) && isCalculated())
   4174         return Length(cssCalcValue()->toCalcValue(conversionData));
   4175     ASSERT_NOT_REACHED();
   4176     return Length(0, Fixed);
   4177 }
   4178 
   4179 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBufferedRendering e)
   4180     : CSSValue(PrimitiveClass)
   4181 {
   4182     m_primitiveUnitType = CSS_VALUE_ID;
   4183     switch (e) {
   4184     case BR_AUTO:
   4185         m_value.valueID = CSSValueAuto;
   4186         break;
   4187     case BR_DYNAMIC:
   4188         m_value.valueID = CSSValueDynamic;
   4189         break;
   4190     case BR_STATIC:
   4191         m_value.valueID = CSSValueStatic;
   4192         break;
   4193     }
   4194 }
   4195 
   4196 template<> inline CSSPrimitiveValue::operator EBufferedRendering() const
   4197 {
   4198     ASSERT(isValueID());
   4199     switch (m_value.valueID) {
   4200     case CSSValueAuto:
   4201         return BR_AUTO;
   4202     case CSSValueDynamic:
   4203         return BR_DYNAMIC;
   4204     case CSSValueStatic:
   4205         return BR_STATIC;
   4206     default:
   4207         break;
   4208     }
   4209 
   4210     ASSERT_NOT_REACHED();
   4211     return BR_AUTO;
   4212 }
   4213 
   4214 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorInterpolation e)
   4215     : CSSValue(PrimitiveClass)
   4216 {
   4217     m_primitiveUnitType = CSS_VALUE_ID;
   4218     switch (e) {
   4219     case CI_AUTO:
   4220         m_value.valueID = CSSValueAuto;
   4221         break;
   4222     case CI_SRGB:
   4223         m_value.valueID = CSSValueSrgb;
   4224         break;
   4225     case CI_LINEARRGB:
   4226         m_value.valueID = CSSValueLinearrgb;
   4227         break;
   4228     }
   4229 }
   4230 
   4231 template<> inline CSSPrimitiveValue::operator EColorInterpolation() const
   4232 {
   4233     ASSERT(isValueID());
   4234     switch (m_value.valueID) {
   4235     case CSSValueSrgb:
   4236         return CI_SRGB;
   4237     case CSSValueLinearrgb:
   4238         return CI_LINEARRGB;
   4239     case CSSValueAuto:
   4240         return CI_AUTO;
   4241     default:
   4242         break;
   4243     }
   4244 
   4245     ASSERT_NOT_REACHED();
   4246     return CI_AUTO;
   4247 }
   4248 
   4249 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorRendering e)
   4250     : CSSValue(PrimitiveClass)
   4251 {
   4252     m_primitiveUnitType = CSS_VALUE_ID;
   4253     switch (e) {
   4254     case CR_AUTO:
   4255         m_value.valueID = CSSValueAuto;
   4256         break;
   4257     case CR_OPTIMIZESPEED:
   4258         m_value.valueID = CSSValueOptimizespeed;
   4259         break;
   4260     case CR_OPTIMIZEQUALITY:
   4261         m_value.valueID = CSSValueOptimizequality;
   4262         break;
   4263     }
   4264 }
   4265 
   4266 template<> inline CSSPrimitiveValue::operator EColorRendering() const
   4267 {
   4268     ASSERT(isValueID());
   4269     switch (m_value.valueID) {
   4270     case CSSValueOptimizespeed:
   4271         return CR_OPTIMIZESPEED;
   4272     case CSSValueOptimizequality:
   4273         return CR_OPTIMIZEQUALITY;
   4274     case CSSValueAuto:
   4275         return CR_AUTO;
   4276     default:
   4277         break;
   4278     }
   4279 
   4280     ASSERT_NOT_REACHED();
   4281     return CR_AUTO;
   4282 }
   4283 
   4284 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDominantBaseline e)
   4285     : CSSValue(PrimitiveClass)
   4286 {
   4287     m_primitiveUnitType = CSS_VALUE_ID;
   4288     switch (e) {
   4289     case DB_AUTO:
   4290         m_value.valueID = CSSValueAuto;
   4291         break;
   4292     case DB_USE_SCRIPT:
   4293         m_value.valueID = CSSValueUseScript;
   4294         break;
   4295     case DB_NO_CHANGE:
   4296         m_value.valueID = CSSValueNoChange;
   4297         break;
   4298     case DB_RESET_SIZE:
   4299         m_value.valueID = CSSValueResetSize;
   4300         break;
   4301     case DB_CENTRAL:
   4302         m_value.valueID = CSSValueCentral;
   4303         break;
   4304     case DB_MIDDLE:
   4305         m_value.valueID = CSSValueMiddle;
   4306         break;
   4307     case DB_TEXT_BEFORE_EDGE:
   4308         m_value.valueID = CSSValueTextBeforeEdge;
   4309         break;
   4310     case DB_TEXT_AFTER_EDGE:
   4311         m_value.valueID = CSSValueTextAfterEdge;
   4312         break;
   4313     case DB_IDEOGRAPHIC:
   4314         m_value.valueID = CSSValueIdeographic;
   4315         break;
   4316     case DB_ALPHABETIC:
   4317         m_value.valueID = CSSValueAlphabetic;
   4318         break;
   4319     case DB_HANGING:
   4320         m_value.valueID = CSSValueHanging;
   4321         break;
   4322     case DB_MATHEMATICAL:
   4323         m_value.valueID = CSSValueMathematical;
   4324         break;
   4325     }
   4326 }
   4327 
   4328 template<> inline CSSPrimitiveValue::operator EDominantBaseline() const
   4329 {
   4330     ASSERT(isValueID());
   4331     switch (m_value.valueID) {
   4332     case CSSValueAuto:
   4333         return DB_AUTO;
   4334     case CSSValueUseScript:
   4335         return DB_USE_SCRIPT;
   4336     case CSSValueNoChange:
   4337         return DB_NO_CHANGE;
   4338     case CSSValueResetSize:
   4339         return DB_RESET_SIZE;
   4340     case CSSValueIdeographic:
   4341         return DB_IDEOGRAPHIC;
   4342     case CSSValueAlphabetic:
   4343         return DB_ALPHABETIC;
   4344     case CSSValueHanging:
   4345         return DB_HANGING;
   4346     case CSSValueMathematical:
   4347         return DB_MATHEMATICAL;
   4348     case CSSValueCentral:
   4349         return DB_CENTRAL;
   4350     case CSSValueMiddle:
   4351         return DB_MIDDLE;
   4352     case CSSValueTextAfterEdge:
   4353         return DB_TEXT_AFTER_EDGE;
   4354     case CSSValueTextBeforeEdge:
   4355         return DB_TEXT_BEFORE_EDGE;
   4356     default:
   4357         break;
   4358     }
   4359 
   4360     ASSERT_NOT_REACHED();
   4361     return DB_AUTO;
   4362 }
   4363 
   4364 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EShapeRendering e)
   4365     : CSSValue(PrimitiveClass)
   4366 {
   4367     m_primitiveUnitType = CSS_VALUE_ID;
   4368     switch (e) {
   4369     case SR_AUTO:
   4370         m_value.valueID = CSSValueAuto;
   4371         break;
   4372     case SR_OPTIMIZESPEED:
   4373         m_value.valueID = CSSValueOptimizespeed;
   4374         break;
   4375     case SR_CRISPEDGES:
   4376         m_value.valueID = CSSValueCrispedges;
   4377         break;
   4378     case SR_GEOMETRICPRECISION:
   4379         m_value.valueID = CSSValueGeometricprecision;
   4380         break;
   4381     }
   4382 }
   4383 
   4384 template<> inline CSSPrimitiveValue::operator EShapeRendering() const
   4385 {
   4386     ASSERT(isValueID());
   4387     switch (m_value.valueID) {
   4388     case CSSValueAuto:
   4389         return SR_AUTO;
   4390     case CSSValueOptimizespeed:
   4391         return SR_OPTIMIZESPEED;
   4392     case CSSValueCrispedges:
   4393         return SR_CRISPEDGES;
   4394     case CSSValueGeometricprecision:
   4395         return SR_GEOMETRICPRECISION;
   4396     default:
   4397         break;
   4398     }
   4399 
   4400     ASSERT_NOT_REACHED();
   4401     return SR_AUTO;
   4402 }
   4403 
   4404 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAnchor e)
   4405     : CSSValue(PrimitiveClass)
   4406 {
   4407     m_primitiveUnitType = CSS_VALUE_ID;
   4408     switch (e) {
   4409     case TA_START:
   4410         m_value.valueID = CSSValueStart;
   4411         break;
   4412     case TA_MIDDLE:
   4413         m_value.valueID = CSSValueMiddle;
   4414         break;
   4415     case TA_END:
   4416         m_value.valueID = CSSValueEnd;
   4417         break;
   4418     }
   4419 }
   4420 
   4421 template<> inline CSSPrimitiveValue::operator ETextAnchor() const
   4422 {
   4423     ASSERT(isValueID());
   4424     switch (m_value.valueID) {
   4425     case CSSValueStart:
   4426         return TA_START;
   4427     case CSSValueMiddle:
   4428         return TA_MIDDLE;
   4429     case CSSValueEnd:
   4430         return TA_END;
   4431     default:
   4432         break;
   4433     }
   4434 
   4435     ASSERT_NOT_REACHED();
   4436     return TA_START;
   4437 }
   4438 
   4439 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(SVGWritingMode e)
   4440     : CSSValue(PrimitiveClass)
   4441 {
   4442     m_primitiveUnitType = CSS_VALUE_ID;
   4443     switch (e) {
   4444     case WM_LRTB:
   4445         m_value.valueID = CSSValueLrTb;
   4446         break;
   4447     case WM_LR:
   4448         m_value.valueID = CSSValueLr;
   4449         break;
   4450     case WM_RLTB:
   4451         m_value.valueID = CSSValueRlTb;
   4452         break;
   4453     case WM_RL:
   4454         m_value.valueID = CSSValueRl;
   4455         break;
   4456     case WM_TBRL:
   4457         m_value.valueID = CSSValueTbRl;
   4458         break;
   4459     case WM_TB:
   4460         m_value.valueID = CSSValueTb;
   4461         break;
   4462     }
   4463 }
   4464 
   4465 template<> inline CSSPrimitiveValue::operator SVGWritingMode() const
   4466 {
   4467     ASSERT(isValueID());
   4468     switch (m_value.valueID) {
   4469     case CSSValueLrTb:
   4470         return WM_LRTB;
   4471     case CSSValueLr:
   4472         return WM_LR;
   4473     case CSSValueRlTb:
   4474         return WM_RLTB;
   4475     case CSSValueRl:
   4476         return WM_RL;
   4477     case CSSValueTbRl:
   4478         return WM_TBRL;
   4479     case CSSValueTb:
   4480         return WM_TB;
   4481     default:
   4482         break;
   4483     }
   4484 
   4485     ASSERT_NOT_REACHED();
   4486     return WM_LRTB;
   4487 }
   4488 
   4489 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EVectorEffect e)
   4490     : CSSValue(PrimitiveClass)
   4491 {
   4492     m_primitiveUnitType = CSS_VALUE_ID;
   4493     switch (e) {
   4494     case VE_NONE:
   4495         m_value.valueID = CSSValueNone;
   4496         break;
   4497     case VE_NON_SCALING_STROKE:
   4498         m_value.valueID = CSSValueNonScalingStroke;
   4499         break;
   4500     }
   4501 }
   4502 
   4503 template<> inline CSSPrimitiveValue::operator EVectorEffect() const
   4504 {
   4505     ASSERT(isValueID());
   4506     switch (m_value.valueID) {
   4507     case CSSValueNone:
   4508         return VE_NONE;
   4509     case CSSValueNonScalingStroke:
   4510         return VE_NON_SCALING_STROKE;
   4511     default:
   4512         break;
   4513     }
   4514 
   4515     ASSERT_NOT_REACHED();
   4516     return VE_NONE;
   4517 }
   4518 
   4519 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPaintOrderType e)
   4520     : CSSValue(PrimitiveClass)
   4521 {
   4522     m_primitiveUnitType = CSS_VALUE_ID;
   4523     switch (e) {
   4524     case PT_FILL:
   4525         m_value.valueID = CSSValueFill;
   4526         break;
   4527     case PT_STROKE:
   4528         m_value.valueID = CSSValueStroke;
   4529         break;
   4530     case PT_MARKERS:
   4531         m_value.valueID = CSSValueMarkers;
   4532         break;
   4533     default:
   4534         ASSERT_NOT_REACHED();
   4535         m_value.valueID = CSSValueFill;
   4536         break;
   4537     }
   4538 }
   4539 
   4540 template<> inline CSSPrimitiveValue::operator EPaintOrderType() const
   4541 {
   4542     ASSERT(isValueID());
   4543     switch (m_value.valueID) {
   4544     case CSSValueFill:
   4545         return PT_FILL;
   4546     case CSSValueStroke:
   4547         return PT_STROKE;
   4548     case CSSValueMarkers:
   4549         return PT_MARKERS;
   4550     default:
   4551         break;
   4552     }
   4553 
   4554     ASSERT_NOT_REACHED();
   4555     return PT_NONE;
   4556 }
   4557 
   4558 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMaskType e)
   4559     : CSSValue(PrimitiveClass)
   4560 {
   4561     m_primitiveUnitType = CSS_VALUE_ID;
   4562     switch (e) {
   4563     case MT_LUMINANCE:
   4564         m_value.valueID = CSSValueLuminance;
   4565         break;
   4566     case MT_ALPHA:
   4567         m_value.valueID = CSSValueAlpha;
   4568         break;
   4569     }
   4570 }
   4571 
   4572 template<> inline CSSPrimitiveValue::operator EMaskType() const
   4573 {
   4574     ASSERT(isValueID());
   4575     switch (m_value.valueID) {
   4576     case CSSValueLuminance:
   4577         return MT_LUMINANCE;
   4578     case CSSValueAlpha:
   4579         return MT_ALPHA;
   4580     default:
   4581         break;
   4582     }
   4583 
   4584     ASSERT_NOT_REACHED();
   4585     return MT_LUMINANCE;
   4586 }
   4587 
   4588 template<> inline CSSPrimitiveValue::operator TouchAction() const
   4589 {
   4590     ASSERT(isValueID());
   4591     switch (m_value.valueID) {
   4592     case CSSValueNone:
   4593         return TouchActionNone;
   4594     case CSSValueAuto:
   4595         return TouchActionAuto;
   4596     case CSSValuePanX:
   4597         return TouchActionPanX;
   4598     case CSSValuePanY:
   4599         return TouchActionPanY;
   4600     case CSSValueManipulation:
   4601         return TouchActionPanX | TouchActionPanY | TouchActionPinchZoom;
   4602     default:
   4603         break;
   4604     }
   4605 
   4606     ASSERT_NOT_REACHED();
   4607     return TouchActionNone;
   4608 }
   4609 
   4610 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EIsolation i)
   4611     : CSSValue(PrimitiveClass)
   4612 {
   4613     m_primitiveUnitType = CSS_VALUE_ID;
   4614     switch (i) {
   4615     case IsolationAuto:
   4616         m_value.valueID = CSSValueAuto;
   4617         break;
   4618     case IsolationIsolate:
   4619         m_value.valueID = CSSValueIsolate;
   4620         break;
   4621     }
   4622 }
   4623 
   4624 template<> inline CSSPrimitiveValue::operator EIsolation() const
   4625 {
   4626     ASSERT(isValueID());
   4627     switch (m_value.valueID) {
   4628     case CSSValueAuto:
   4629         return IsolationAuto;
   4630     case CSSValueIsolate:
   4631         return IsolationIsolate;
   4632     default:
   4633         break;
   4634     }
   4635 
   4636     ASSERT_NOT_REACHED();
   4637     return IsolationAuto;
   4638 }
   4639 
   4640 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TouchActionDelay t)
   4641     : CSSValue(PrimitiveClass)
   4642 {
   4643     m_primitiveUnitType = CSS_VALUE_ID;
   4644     switch (t) {
   4645     case TouchActionDelayNone:
   4646         m_value.valueID = CSSValueNone;
   4647         break;
   4648     case TouchActionDelayScript:
   4649         m_value.valueID = CSSValueScript;
   4650         break;
   4651     }
   4652 }
   4653 
   4654 template<> inline CSSPrimitiveValue::operator TouchActionDelay() const
   4655 {
   4656     switch (m_value.valueID) {
   4657     case CSSValueNone:
   4658         return TouchActionDelayNone;
   4659     case CSSValueScript:
   4660         return TouchActionDelayScript;
   4661     default:
   4662         break;
   4663     }
   4664 
   4665     ASSERT_NOT_REACHED();
   4666     return TouchActionDelayNone;
   4667 }
   4668 
   4669 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(CSSBoxType cssBox)
   4670     : CSSValue(PrimitiveClass)
   4671 {
   4672     m_primitiveUnitType = CSS_VALUE_ID;
   4673     switch (cssBox) {
   4674     case MarginBox:
   4675         m_value.valueID = CSSValueMarginBox;
   4676         break;
   4677     case BorderBox:
   4678         m_value.valueID = CSSValueBorderBox;
   4679         break;
   4680     case PaddingBox:
   4681         m_value.valueID = CSSValuePaddingBox;
   4682         break;
   4683     case ContentBox:
   4684         m_value.valueID = CSSValueContentBox;
   4685         break;
   4686     case BoxMissing:
   4687         // The missing box should convert to a null primitive value.
   4688         ASSERT_NOT_REACHED();
   4689     }
   4690 }
   4691 
   4692 template<> inline CSSPrimitiveValue::operator CSSBoxType() const
   4693 {
   4694     switch (getValueID()) {
   4695     case CSSValueMarginBox:
   4696         return MarginBox;
   4697     case CSSValueBorderBox:
   4698         return BorderBox;
   4699     case CSSValuePaddingBox:
   4700         return PaddingBox;
   4701     case CSSValueContentBox:
   4702         return ContentBox;
   4703     default:
   4704         break;
   4705     }
   4706     ASSERT_NOT_REACHED();
   4707     return ContentBox;
   4708 }
   4709 
   4710 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ItemPosition itemPosition)
   4711     : CSSValue(PrimitiveClass)
   4712 {
   4713     m_primitiveUnitType = CSS_VALUE_ID;
   4714     switch (itemPosition) {
   4715     case ItemPositionAuto:
   4716         m_value.valueID = CSSValueAuto;
   4717         break;
   4718     case ItemPositionStretch:
   4719         m_value.valueID = CSSValueStretch;
   4720         break;
   4721     case ItemPositionBaseline:
   4722         m_value.valueID = CSSValueBaseline;
   4723         break;
   4724     case ItemPositionLastBaseline:
   4725         m_value.valueID = CSSValueLastBaseline;
   4726         break;
   4727     case ItemPositionCenter:
   4728         m_value.valueID = CSSValueCenter;
   4729         break;
   4730     case ItemPositionStart:
   4731         m_value.valueID = CSSValueStart;
   4732         break;
   4733     case ItemPositionEnd:
   4734         m_value.valueID = CSSValueEnd;
   4735         break;
   4736     case ItemPositionSelfStart:
   4737         m_value.valueID = CSSValueSelfStart;
   4738         break;
   4739     case ItemPositionSelfEnd:
   4740         m_value.valueID = CSSValueSelfEnd;
   4741         break;
   4742     case ItemPositionFlexStart:
   4743         m_value.valueID = CSSValueFlexStart;
   4744         break;
   4745     case ItemPositionFlexEnd:
   4746         m_value.valueID = CSSValueFlexEnd;
   4747         break;
   4748     case ItemPositionLeft:
   4749         m_value.valueID = CSSValueLeft;
   4750         break;
   4751     case ItemPositionRight:
   4752         m_value.valueID = CSSValueRight;
   4753         break;
   4754     }
   4755 }
   4756 
   4757 template<> inline CSSPrimitiveValue::operator ItemPosition() const
   4758 {
   4759     switch (m_value.valueID) {
   4760     case CSSValueAuto:
   4761         return ItemPositionAuto;
   4762     case CSSValueStretch:
   4763         return ItemPositionStretch;
   4764     case CSSValueBaseline:
   4765         return ItemPositionBaseline;
   4766     case CSSValueLastBaseline:
   4767         return ItemPositionLastBaseline;
   4768     case CSSValueCenter:
   4769         return ItemPositionCenter;
   4770     case CSSValueStart:
   4771         return ItemPositionStart;
   4772     case CSSValueEnd:
   4773         return ItemPositionEnd;
   4774     case CSSValueSelfStart:
   4775         return ItemPositionSelfStart;
   4776     case CSSValueSelfEnd:
   4777         return ItemPositionSelfEnd;
   4778     case CSSValueFlexStart:
   4779         return ItemPositionFlexStart;
   4780     case CSSValueFlexEnd:
   4781         return ItemPositionFlexEnd;
   4782     case CSSValueLeft:
   4783         return ItemPositionLeft;
   4784     case CSSValueRight:
   4785         return ItemPositionRight;
   4786     default:
   4787         break;
   4788     }
   4789     ASSERT_NOT_REACHED();
   4790     return ItemPositionAuto;
   4791 }
   4792 
   4793 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(OverflowAlignment overflowAlignment)
   4794     : CSSValue(PrimitiveClass)
   4795 {
   4796     m_primitiveUnitType = CSS_VALUE_ID;
   4797     switch (overflowAlignment) {
   4798     case OverflowAlignmentDefault:
   4799         m_value.valueID = CSSValueDefault;
   4800         break;
   4801     case OverflowAlignmentTrue:
   4802         m_value.valueID = CSSValueTrue;
   4803         break;
   4804     case OverflowAlignmentSafe:
   4805         m_value.valueID = CSSValueSafe;
   4806         break;
   4807     }
   4808 }
   4809 
   4810 template<> inline CSSPrimitiveValue::operator OverflowAlignment() const
   4811 {
   4812     switch (m_value.valueID) {
   4813     case CSSValueTrue:
   4814         return OverflowAlignmentTrue;
   4815     case CSSValueSafe:
   4816         return OverflowAlignmentSafe;
   4817     default:
   4818         break;
   4819     }
   4820     ASSERT_NOT_REACHED();
   4821     return OverflowAlignmentTrue;
   4822 }
   4823 
   4824 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ScrollBehavior behavior)
   4825     : CSSValue(PrimitiveClass)
   4826 {
   4827     m_primitiveUnitType = CSS_VALUE_ID;
   4828     switch (behavior) {
   4829     case ScrollBehaviorInstant:
   4830         m_value.valueID = CSSValueInstant;
   4831         break;
   4832     case ScrollBehaviorSmooth:
   4833         m_value.valueID = CSSValueSmooth;
   4834         break;
   4835     case ScrollBehaviorAuto:
   4836         // Behavior 'auto' is only allowed in ScrollOptions arguments passed to
   4837         // CSSOM scroll APIs.
   4838         ASSERT_NOT_REACHED();
   4839     }
   4840 }
   4841 
   4842 template<> inline CSSPrimitiveValue::operator ScrollBehavior() const
   4843 {
   4844     switch (getValueID()) {
   4845     case CSSValueInstant:
   4846         return ScrollBehaviorInstant;
   4847     case CSSValueSmooth:
   4848         return ScrollBehaviorSmooth;
   4849     default:
   4850         break;
   4851     }
   4852     ASSERT_NOT_REACHED();
   4853     return ScrollBehaviorInstant;
   4854 }
   4855 
   4856 }
   4857 
   4858 #endif
   4859