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