Home | History | Annotate | Download | only in css
      1 /*
      2  * Copyright (C) 2007 Alexey Proskuryakov <ap (at) nypop.com>.
      3  * Copyright (C) 2008, 2009, 2010 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 "ColorSpace.h"
     34 #include "CSSPrimitiveValue.h"
     35 #include "CSSValueKeywords.h"
     36 #include "FontSmoothingMode.h"
     37 #include "GraphicsTypes.h"
     38 #include "Path.h"
     39 #include "RenderStyleConstants.h"
     40 #include "SVGRenderStyleDefs.h"
     41 #include "TextDirection.h"
     42 #include "TextOrientation.h"
     43 #include "TextRenderingMode.h"
     44 #include "ThemeTypes.h"
     45 #include "UnicodeBidi.h"
     46 
     47 namespace WebCore {
     48 
     49 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBorderStyle e)
     50     : m_type(CSS_IDENT)
     51     , m_hasCachedCSSText(false)
     52 {
     53     switch (e) {
     54         case BNONE:
     55             m_value.ident = CSSValueNone;
     56             break;
     57         case BHIDDEN:
     58             m_value.ident = CSSValueHidden;
     59             break;
     60         case INSET:
     61             m_value.ident = CSSValueInset;
     62             break;
     63         case GROOVE:
     64             m_value.ident = CSSValueGroove;
     65             break;
     66         case RIDGE:
     67             m_value.ident = CSSValueRidge;
     68             break;
     69         case OUTSET:
     70             m_value.ident = CSSValueOutset;
     71             break;
     72         case DOTTED:
     73             m_value.ident = CSSValueDotted;
     74             break;
     75         case DASHED:
     76             m_value.ident = CSSValueDashed;
     77             break;
     78         case SOLID:
     79             m_value.ident = CSSValueSolid;
     80             break;
     81         case DOUBLE:
     82             m_value.ident = CSSValueDouble;
     83             break;
     84     }
     85 }
     86 
     87 template<> inline CSSPrimitiveValue::operator EBorderStyle() const
     88 {
     89     return (EBorderStyle)(m_value.ident - CSSValueNone);
     90 }
     91 
     92 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(CompositeOperator e)
     93     : m_type(CSS_IDENT)
     94     , m_hasCachedCSSText(false)
     95 {
     96     switch (e) {
     97         case CompositeClear:
     98             m_value.ident = CSSValueClear;
     99             break;
    100         case CompositeCopy:
    101             m_value.ident = CSSValueCopy;
    102             break;
    103         case CompositeSourceOver:
    104             m_value.ident = CSSValueSourceOver;
    105             break;
    106         case CompositeSourceIn:
    107             m_value.ident = CSSValueSourceIn;
    108             break;
    109         case CompositeSourceOut:
    110             m_value.ident = CSSValueSourceOut;
    111             break;
    112         case CompositeSourceAtop:
    113             m_value.ident = CSSValueSourceAtop;
    114             break;
    115         case CompositeDestinationOver:
    116             m_value.ident = CSSValueDestinationOver;
    117             break;
    118         case CompositeDestinationIn:
    119             m_value.ident = CSSValueDestinationIn;
    120             break;
    121         case CompositeDestinationOut:
    122             m_value.ident = CSSValueDestinationOut;
    123             break;
    124         case CompositeDestinationAtop:
    125             m_value.ident = CSSValueDestinationAtop;
    126             break;
    127         case CompositeXOR:
    128             m_value.ident = CSSValueXor;
    129             break;
    130         case CompositePlusDarker:
    131             m_value.ident = CSSValuePlusDarker;
    132             break;
    133         case CompositeHighlight:
    134             m_value.ident = CSSValueHighlight;
    135             break;
    136         case CompositePlusLighter:
    137             m_value.ident = CSSValuePlusLighter;
    138             break;
    139     }
    140 }
    141 
    142 template<> inline CSSPrimitiveValue::operator CompositeOperator() const
    143 {
    144     switch (m_value.ident) {
    145         case CSSValueClear:
    146             return CompositeClear;
    147         case CSSValueCopy:
    148             return CompositeCopy;
    149         case CSSValueSourceOver:
    150             return CompositeSourceOver;
    151         case CSSValueSourceIn:
    152             return CompositeSourceIn;
    153         case CSSValueSourceOut:
    154             return CompositeSourceOut;
    155         case CSSValueSourceAtop:
    156             return CompositeSourceAtop;
    157         case CSSValueDestinationOver:
    158             return CompositeDestinationOver;
    159         case CSSValueDestinationIn:
    160             return CompositeDestinationIn;
    161         case CSSValueDestinationOut:
    162             return CompositeDestinationOut;
    163         case CSSValueDestinationAtop:
    164             return CompositeDestinationAtop;
    165         case CSSValueXor:
    166             return CompositeXOR;
    167         case CSSValuePlusDarker:
    168             return CompositePlusDarker;
    169         case CSSValueHighlight:
    170             return CompositeHighlight;
    171         case CSSValuePlusLighter:
    172             return CompositePlusLighter;
    173         default:
    174             ASSERT_NOT_REACHED();
    175             return CompositeClear;
    176     }
    177 }
    178 
    179 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ControlPart e)
    180     : m_type(CSS_IDENT)
    181     , m_hasCachedCSSText(false)
    182 {
    183     switch (e) {
    184         case NoControlPart:
    185             m_value.ident = CSSValueNone;
    186             break;
    187         case CheckboxPart:
    188             m_value.ident = CSSValueCheckbox;
    189             break;
    190         case RadioPart:
    191             m_value.ident = CSSValueRadio;
    192             break;
    193         case PushButtonPart:
    194             m_value.ident = CSSValuePushButton;
    195             break;
    196         case SquareButtonPart:
    197             m_value.ident = CSSValueSquareButton;
    198             break;
    199         case ButtonPart:
    200             m_value.ident = CSSValueButton;
    201             break;
    202         case ButtonBevelPart:
    203             m_value.ident = CSSValueButtonBevel;
    204             break;
    205         case DefaultButtonPart:
    206             m_value.ident = CSSValueDefaultButton;
    207             break;
    208         case InnerSpinButtonPart:
    209             m_value.ident = CSSValueInnerSpinButton;
    210             break;
    211         case ListboxPart:
    212             m_value.ident = CSSValueListbox;
    213             break;
    214         case ListButtonPart:
    215 #if ENABLE(DATALIST)
    216             m_value.ident = CSSValueListButton;
    217 #endif
    218             break;
    219         case ListItemPart:
    220             m_value.ident = CSSValueListitem;
    221             break;
    222         case MediaFullscreenButtonPart:
    223             m_value.ident = CSSValueMediaFullscreenButton;
    224             break;
    225         case MediaPlayButtonPart:
    226             m_value.ident = CSSValueMediaPlayButton;
    227             break;
    228         case MediaMuteButtonPart:
    229             m_value.ident = CSSValueMediaMuteButton;
    230             break;
    231         case MediaSeekBackButtonPart:
    232             m_value.ident = CSSValueMediaSeekBackButton;
    233             break;
    234         case MediaSeekForwardButtonPart:
    235             m_value.ident = CSSValueMediaSeekForwardButton;
    236             break;
    237         case MediaRewindButtonPart:
    238             m_value.ident = CSSValueMediaRewindButton;
    239             break;
    240         case MediaReturnToRealtimeButtonPart:
    241             m_value.ident = CSSValueMediaReturnToRealtimeButton;
    242             break;
    243         case MediaToggleClosedCaptionsButtonPart:
    244             m_value.ident = CSSValueMediaToggleClosedCaptionsButton;
    245             break;
    246         case MediaSliderPart:
    247             m_value.ident = CSSValueMediaSlider;
    248             break;
    249         case MediaSliderThumbPart:
    250             m_value.ident = CSSValueMediaSliderthumb;
    251             break;
    252         case MediaVolumeSliderContainerPart:
    253             m_value.ident = CSSValueMediaVolumeSliderContainer;
    254             break;
    255         case MediaVolumeSliderPart:
    256             m_value.ident = CSSValueMediaVolumeSlider;
    257             break;
    258         case MediaVolumeSliderMuteButtonPart:
    259             m_value.ident = CSSValueMediaVolumeSliderMuteButton;
    260             break;
    261         case MediaVolumeSliderThumbPart:
    262             m_value.ident = CSSValueMediaVolumeSliderthumb;
    263             break;
    264         case MediaControlsBackgroundPart:
    265             m_value.ident = CSSValueMediaControlsBackground;
    266             break;
    267         case MediaControlsFullscreenBackgroundPart:
    268             m_value.ident = CSSValueMediaControlsFullscreenBackground;
    269             break;
    270         case MediaCurrentTimePart:
    271             m_value.ident = CSSValueMediaCurrentTimeDisplay;
    272             break;
    273         case MediaTimeRemainingPart:
    274             m_value.ident = CSSValueMediaTimeRemainingDisplay;
    275             break;
    276         case MenulistPart:
    277             m_value.ident = CSSValueMenulist;
    278             break;
    279         case MenulistButtonPart:
    280             m_value.ident = CSSValueMenulistButton;
    281             break;
    282         case MenulistTextPart:
    283             m_value.ident = CSSValueMenulistText;
    284             break;
    285         case MenulistTextFieldPart:
    286             m_value.ident = CSSValueMenulistTextfield;
    287             break;
    288         case MeterPart:
    289             m_value.ident = CSSValueMeter;
    290             break;
    291         case RelevancyLevelIndicatorPart:
    292             m_value.ident = CSSValueRelevancyLevelIndicator;
    293             break;
    294         case ContinuousCapacityLevelIndicatorPart:
    295             m_value.ident = CSSValueContinuousCapacityLevelIndicator;
    296             break;
    297         case DiscreteCapacityLevelIndicatorPart:
    298             m_value.ident = CSSValueDiscreteCapacityLevelIndicator;
    299             break;
    300         case RatingLevelIndicatorPart:
    301             m_value.ident = CSSValueRatingLevelIndicator;
    302             break;
    303         case OuterSpinButtonPart:
    304             m_value.ident = CSSValueOuterSpinButton;
    305             break;
    306         case ProgressBarPart:
    307 #if ENABLE(PROGRESS_TAG)
    308             m_value.ident = CSSValueProgressBar;
    309 #endif
    310             break;
    311         case ProgressBarValuePart:
    312 #if ENABLE(PROGRESS_TAG)
    313             m_value.ident = CSSValueProgressBarValue;
    314 #endif
    315             break;
    316         case SliderHorizontalPart:
    317             m_value.ident = CSSValueSliderHorizontal;
    318             break;
    319         case SliderVerticalPart:
    320             m_value.ident = CSSValueSliderVertical;
    321             break;
    322         case SliderThumbHorizontalPart:
    323             m_value.ident = CSSValueSliderthumbHorizontal;
    324             break;
    325         case SliderThumbVerticalPart:
    326             m_value.ident = CSSValueSliderthumbVertical;
    327             break;
    328         case CaretPart:
    329             m_value.ident = CSSValueCaret;
    330             break;
    331         case SearchFieldPart:
    332             m_value.ident = CSSValueSearchfield;
    333             break;
    334         case SearchFieldDecorationPart:
    335             m_value.ident = CSSValueSearchfieldDecoration;
    336             break;
    337         case SearchFieldResultsDecorationPart:
    338             m_value.ident = CSSValueSearchfieldResultsDecoration;
    339             break;
    340         case SearchFieldResultsButtonPart:
    341             m_value.ident = CSSValueSearchfieldResultsButton;
    342             break;
    343         case SearchFieldCancelButtonPart:
    344             m_value.ident = CSSValueSearchfieldCancelButton;
    345             break;
    346         case TextFieldPart:
    347             m_value.ident = CSSValueTextfield;
    348             break;
    349         case TextAreaPart:
    350             m_value.ident = CSSValueTextarea;
    351             break;
    352         case CapsLockIndicatorPart:
    353             m_value.ident = CSSValueCapsLockIndicator;
    354             break;
    355         case InputSpeechButtonPart:
    356 #if ENABLE(INPUT_SPEECH)
    357             m_value.ident = CSSValueWebkitInputSpeechButton;
    358 #endif
    359             break;
    360     }
    361 }
    362 
    363 template<> inline CSSPrimitiveValue::operator ControlPart() const
    364 {
    365     if (m_value.ident == CSSValueNone)
    366         return NoControlPart;
    367     else
    368         return ControlPart(m_value.ident - CSSValueCheckbox + 1);
    369 }
    370 
    371 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillAttachment e)
    372     : m_type(CSS_IDENT)
    373     , m_hasCachedCSSText(false)
    374 {
    375     switch (e) {
    376         case ScrollBackgroundAttachment:
    377             m_value.ident = CSSValueScroll;
    378             break;
    379         case LocalBackgroundAttachment:
    380             m_value.ident = CSSValueLocal;
    381             break;
    382         case FixedBackgroundAttachment:
    383             m_value.ident = CSSValueFixed;
    384             break;
    385     }
    386 }
    387 
    388 template<> inline CSSPrimitiveValue::operator EFillAttachment() const
    389 {
    390     switch (m_value.ident) {
    391         case CSSValueScroll:
    392             return ScrollBackgroundAttachment;
    393         case CSSValueLocal:
    394             return LocalBackgroundAttachment;
    395         case CSSValueFixed:
    396             return FixedBackgroundAttachment;
    397         default:
    398             ASSERT_NOT_REACHED();
    399             return ScrollBackgroundAttachment;
    400     }
    401 }
    402 
    403 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillBox e)
    404     : m_type(CSS_IDENT)
    405     , m_hasCachedCSSText(false)
    406 {
    407     switch (e) {
    408         case BorderFillBox:
    409             m_value.ident = CSSValueBorderBox;
    410             break;
    411         case PaddingFillBox:
    412             m_value.ident = CSSValuePaddingBox;
    413             break;
    414         case ContentFillBox:
    415             m_value.ident = CSSValueContentBox;
    416             break;
    417         case TextFillBox:
    418             m_value.ident = CSSValueText;
    419             break;
    420     }
    421 }
    422 
    423 template<> inline CSSPrimitiveValue::operator EFillBox() const
    424 {
    425     switch (m_value.ident) {
    426         case CSSValueBorder:
    427         case CSSValueBorderBox:
    428             return BorderFillBox;
    429         case CSSValuePadding:
    430         case CSSValuePaddingBox:
    431             return PaddingFillBox;
    432         case CSSValueContent:
    433         case CSSValueContentBox:
    434             return ContentFillBox;
    435         case CSSValueText:
    436         case CSSValueWebkitText:
    437             return TextFillBox;
    438         default:
    439             ASSERT_NOT_REACHED();
    440             return BorderFillBox;
    441     }
    442 }
    443 
    444 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillRepeat e)
    445     : m_type(CSS_IDENT)
    446     , m_hasCachedCSSText(false)
    447 {
    448     switch (e) {
    449         case RepeatFill:
    450             m_value.ident = CSSValueRepeat;
    451             break;
    452         case NoRepeatFill:
    453             m_value.ident = CSSValueNoRepeat;
    454             break;
    455         case RoundFill:
    456             m_value.ident = CSSValueRound;
    457             break;
    458         case SpaceFill:
    459             m_value.ident = CSSValueSpace;
    460             break;
    461     }
    462 }
    463 
    464 template<> inline CSSPrimitiveValue::operator EFillRepeat() const
    465 {
    466     switch (m_value.ident) {
    467         case CSSValueRepeat:
    468             return RepeatFill;
    469         case CSSValueNoRepeat:
    470             return NoRepeatFill;
    471         case CSSValueRound:
    472             return RoundFill;
    473         case CSSValueSpace:
    474             return SpaceFill;
    475         default:
    476             ASSERT_NOT_REACHED();
    477             return RepeatFill;
    478     }
    479 }
    480 
    481 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxAlignment e)
    482     : m_type(CSS_IDENT)
    483     , m_hasCachedCSSText(false)
    484 {
    485     switch (e) {
    486         case BSTRETCH:
    487             m_value.ident = CSSValueStretch;
    488             break;
    489         case BSTART:
    490             m_value.ident = CSSValueStart;
    491             break;
    492         case BCENTER:
    493             m_value.ident = CSSValueCenter;
    494             break;
    495         case BEND:
    496             m_value.ident = CSSValueEnd;
    497             break;
    498         case BBASELINE:
    499             m_value.ident = CSSValueBaseline;
    500             break;
    501         case BJUSTIFY:
    502             m_value.ident = CSSValueJustify;
    503             break;
    504     }
    505 }
    506 
    507 template<> inline CSSPrimitiveValue::operator EBoxAlignment() const
    508 {
    509     switch (m_value.ident) {
    510         case CSSValueStretch:
    511             return BSTRETCH;
    512         case CSSValueStart:
    513             return BSTART;
    514         case CSSValueEnd:
    515             return BEND;
    516         case CSSValueCenter:
    517             return BCENTER;
    518         case CSSValueBaseline:
    519             return BBASELINE;
    520         case CSSValueJustify:
    521             return BJUSTIFY;
    522         default:
    523             ASSERT_NOT_REACHED();
    524             return BSTRETCH;
    525     }
    526 }
    527 
    528 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxDirection e)
    529     : m_type(CSS_IDENT)
    530     , m_hasCachedCSSText(false)
    531 {
    532     switch (e) {
    533         case BNORMAL:
    534             m_value.ident = CSSValueNormal;
    535             break;
    536         case BREVERSE:
    537             m_value.ident = CSSValueReverse;
    538             break;
    539     }
    540 }
    541 
    542 template<> inline CSSPrimitiveValue::operator EBoxDirection() const
    543 {
    544     switch (m_value.ident) {
    545         case CSSValueNormal:
    546             return BNORMAL;
    547         case CSSValueReverse:
    548             return BREVERSE;
    549         default:
    550             ASSERT_NOT_REACHED();
    551             return BNORMAL;
    552     }
    553 }
    554 
    555 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxLines e)
    556     : m_type(CSS_IDENT)
    557     , m_hasCachedCSSText(false)
    558 {
    559     switch (e) {
    560         case SINGLE:
    561             m_value.ident = CSSValueSingle;
    562             break;
    563         case MULTIPLE:
    564             m_value.ident = CSSValueMultiple;
    565             break;
    566     }
    567 }
    568 
    569 template<> inline CSSPrimitiveValue::operator EBoxLines() const
    570 {
    571     switch (m_value.ident) {
    572         case CSSValueSingle:
    573             return SINGLE;
    574         case CSSValueMultiple:
    575             return MULTIPLE;
    576         default:
    577             ASSERT_NOT_REACHED();
    578             return SINGLE;
    579     }
    580 }
    581 
    582 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxOrient e)
    583     : m_type(CSS_IDENT)
    584     , m_hasCachedCSSText(false)
    585 {
    586     switch (e) {
    587         case HORIZONTAL:
    588             m_value.ident = CSSValueHorizontal;
    589             break;
    590         case VERTICAL:
    591             m_value.ident = CSSValueVertical;
    592             break;
    593     }
    594 }
    595 
    596 template<> inline CSSPrimitiveValue::operator EBoxOrient() const
    597 {
    598     switch (m_value.ident) {
    599         case CSSValueHorizontal:
    600         case CSSValueInlineAxis:
    601             return HORIZONTAL;
    602         case CSSValueVertical:
    603         case CSSValueBlockAxis:
    604             return VERTICAL;
    605         default:
    606             ASSERT_NOT_REACHED();
    607             return HORIZONTAL;
    608     }
    609 }
    610 
    611 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECaptionSide e)
    612     : m_type(CSS_IDENT)
    613     , m_hasCachedCSSText(false)
    614 {
    615     switch (e) {
    616         case CAPLEFT:
    617             m_value.ident = CSSValueLeft;
    618             break;
    619         case CAPRIGHT:
    620             m_value.ident = CSSValueRight;
    621             break;
    622         case CAPTOP:
    623             m_value.ident = CSSValueTop;
    624             break;
    625         case CAPBOTTOM:
    626             m_value.ident = CSSValueBottom;
    627             break;
    628     }
    629 }
    630 
    631 template<> inline CSSPrimitiveValue::operator ECaptionSide() const
    632 {
    633     switch (m_value.ident) {
    634         case CSSValueLeft:
    635             return CAPLEFT;
    636         case CSSValueRight:
    637             return CAPRIGHT;
    638         case CSSValueTop:
    639             return CAPTOP;
    640         case CSSValueBottom:
    641             return CAPBOTTOM;
    642         default:
    643             ASSERT_NOT_REACHED();
    644             return CAPTOP;
    645     }
    646 }
    647 
    648 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EClear e)
    649     : m_type(CSS_IDENT)
    650     , m_hasCachedCSSText(false)
    651 {
    652     switch (e) {
    653         case CNONE:
    654             m_value.ident = CSSValueNone;
    655             break;
    656         case CLEFT:
    657             m_value.ident = CSSValueLeft;
    658             break;
    659         case CRIGHT:
    660             m_value.ident = CSSValueRight;
    661             break;
    662         case CBOTH:
    663             m_value.ident = CSSValueBoth;
    664             break;
    665     }
    666 }
    667 
    668 template<> inline CSSPrimitiveValue::operator EClear() const
    669 {
    670     switch (m_value.ident) {
    671         case CSSValueNone:
    672             return CNONE;
    673         case CSSValueLeft:
    674             return CLEFT;
    675         case CSSValueRight:
    676             return CRIGHT;
    677         case CSSValueBoth:
    678             return CBOTH;
    679         default:
    680             ASSERT_NOT_REACHED();
    681             return CNONE;
    682     }
    683 }
    684 
    685 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECursor e)
    686     : m_type(CSS_IDENT)
    687     , m_hasCachedCSSText(false)
    688 {
    689     switch (e) {
    690         case CURSOR_AUTO:
    691             m_value.ident = CSSValueAuto;
    692             break;
    693         case CURSOR_CROSS:
    694             m_value.ident = CSSValueCrosshair;
    695             break;
    696         case CURSOR_DEFAULT:
    697             m_value.ident = CSSValueDefault;
    698             break;
    699         case CURSOR_POINTER:
    700             m_value.ident = CSSValuePointer;
    701             break;
    702         case CURSOR_MOVE:
    703             m_value.ident = CSSValueMove;
    704             break;
    705         case CURSOR_CELL:
    706             m_value.ident = CSSValueCell;
    707             break;
    708         case CURSOR_VERTICAL_TEXT:
    709             m_value.ident = CSSValueVerticalText;
    710             break;
    711         case CURSOR_CONTEXT_MENU:
    712             m_value.ident = CSSValueContextMenu;
    713             break;
    714         case CURSOR_ALIAS:
    715             m_value.ident = CSSValueAlias;
    716             break;
    717         case CURSOR_COPY:
    718             m_value.ident = CSSValueCopy;
    719             break;
    720         case CURSOR_NONE:
    721             m_value.ident = CSSValueNone;
    722             break;
    723         case CURSOR_PROGRESS:
    724             m_value.ident = CSSValueProgress;
    725             break;
    726         case CURSOR_NO_DROP:
    727             m_value.ident = CSSValueNoDrop;
    728             break;
    729         case CURSOR_NOT_ALLOWED:
    730             m_value.ident = CSSValueNotAllowed;
    731             break;
    732         case CURSOR_WEBKIT_ZOOM_IN:
    733             m_value.ident = CSSValueWebkitZoomIn;
    734             break;
    735         case CURSOR_WEBKIT_ZOOM_OUT:
    736             m_value.ident = CSSValueWebkitZoomOut;
    737             break;
    738         case CURSOR_E_RESIZE:
    739             m_value.ident = CSSValueEResize;
    740             break;
    741         case CURSOR_NE_RESIZE:
    742             m_value.ident = CSSValueNeResize;
    743             break;
    744         case CURSOR_NW_RESIZE:
    745             m_value.ident = CSSValueNwResize;
    746             break;
    747         case CURSOR_N_RESIZE:
    748             m_value.ident = CSSValueNResize;
    749             break;
    750         case CURSOR_SE_RESIZE:
    751             m_value.ident = CSSValueSeResize;
    752             break;
    753         case CURSOR_SW_RESIZE:
    754             m_value.ident = CSSValueSwResize;
    755             break;
    756         case CURSOR_S_RESIZE:
    757             m_value.ident = CSSValueSResize;
    758             break;
    759         case CURSOR_W_RESIZE:
    760             m_value.ident = CSSValueWResize;
    761             break;
    762         case CURSOR_EW_RESIZE:
    763             m_value.ident = CSSValueEwResize;
    764             break;
    765         case CURSOR_NS_RESIZE:
    766             m_value.ident = CSSValueNsResize;
    767             break;
    768         case CURSOR_NESW_RESIZE:
    769             m_value.ident = CSSValueNeswResize;
    770             break;
    771         case CURSOR_NWSE_RESIZE:
    772             m_value.ident = CSSValueNwseResize;
    773             break;
    774         case CURSOR_COL_RESIZE:
    775             m_value.ident = CSSValueColResize;
    776             break;
    777         case CURSOR_ROW_RESIZE:
    778             m_value.ident = CSSValueRowResize;
    779             break;
    780         case CURSOR_TEXT:
    781             m_value.ident = CSSValueText;
    782             break;
    783         case CURSOR_WAIT:
    784             m_value.ident = CSSValueWait;
    785             break;
    786         case CURSOR_HELP:
    787             m_value.ident = CSSValueHelp;
    788             break;
    789         case CURSOR_ALL_SCROLL:
    790             m_value.ident = CSSValueAllScroll;
    791             break;
    792         case CURSOR_WEBKIT_GRAB:
    793             m_value.ident = CSSValueWebkitGrab;
    794             break;
    795         case CURSOR_WEBKIT_GRABBING:
    796             m_value.ident = CSSValueWebkitGrabbing;
    797             break;
    798     }
    799 }
    800 
    801 template<> inline CSSPrimitiveValue::operator ECursor() const
    802 {
    803     if (m_value.ident == CSSValueCopy)
    804         return CURSOR_COPY;
    805     if (m_value.ident == CSSValueNone)
    806         return CURSOR_NONE;
    807     return static_cast<ECursor>(m_value.ident - CSSValueAuto);
    808 }
    809 
    810 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDisplay e)
    811     : m_type(CSS_IDENT)
    812     , m_hasCachedCSSText(false)
    813 {
    814     switch (e) {
    815         case INLINE:
    816             m_value.ident = CSSValueInline;
    817             break;
    818         case BLOCK:
    819             m_value.ident = CSSValueBlock;
    820             break;
    821         case LIST_ITEM:
    822             m_value.ident = CSSValueListItem;
    823             break;
    824         case RUN_IN:
    825             m_value.ident = CSSValueRunIn;
    826             break;
    827         case COMPACT:
    828             m_value.ident = CSSValueCompact;
    829             break;
    830         case INLINE_BLOCK:
    831             m_value.ident = CSSValueInlineBlock;
    832             break;
    833         case TABLE:
    834             m_value.ident = CSSValueTable;
    835             break;
    836         case INLINE_TABLE:
    837             m_value.ident = CSSValueInlineTable;
    838             break;
    839         case TABLE_ROW_GROUP:
    840             m_value.ident = CSSValueTableRowGroup;
    841             break;
    842         case TABLE_HEADER_GROUP:
    843             m_value.ident = CSSValueTableHeaderGroup;
    844             break;
    845         case TABLE_FOOTER_GROUP:
    846             m_value.ident = CSSValueTableFooterGroup;
    847             break;
    848         case TABLE_ROW:
    849             m_value.ident = CSSValueTableRow;
    850             break;
    851         case TABLE_COLUMN_GROUP:
    852             m_value.ident = CSSValueTableColumnGroup;
    853             break;
    854         case TABLE_COLUMN:
    855             m_value.ident = CSSValueTableColumn;
    856             break;
    857         case TABLE_CELL:
    858             m_value.ident = CSSValueTableCell;
    859             break;
    860         case TABLE_CAPTION:
    861             m_value.ident = CSSValueTableCaption;
    862             break;
    863 #if ENABLE(WCSS)
    864         case WAP_MARQUEE:
    865             m_value.ident = CSSValueWapMarquee;
    866             break;
    867 #endif
    868         case BOX:
    869             m_value.ident = CSSValueWebkitBox;
    870             break;
    871         case INLINE_BOX:
    872             m_value.ident = CSSValueWebkitInlineBox;
    873             break;
    874         case NONE:
    875             m_value.ident = CSSValueNone;
    876             break;
    877     }
    878 }
    879 
    880 template<> inline CSSPrimitiveValue::operator EDisplay() const
    881 {
    882     if (m_value.ident == CSSValueNone)
    883         return NONE;
    884     return static_cast<EDisplay>(m_value.ident - CSSValueInline);
    885 }
    886 
    887 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EEmptyCell e)
    888     : m_type(CSS_IDENT)
    889     , m_hasCachedCSSText(false)
    890 {
    891     switch (e) {
    892         case SHOW:
    893             m_value.ident = CSSValueShow;
    894             break;
    895         case HIDE:
    896             m_value.ident = CSSValueHide;
    897             break;
    898     }
    899 }
    900 
    901 template<> inline CSSPrimitiveValue::operator EEmptyCell() const
    902 {
    903     switch (m_value.ident) {
    904         case CSSValueShow:
    905             return SHOW;
    906         case CSSValueHide:
    907             return HIDE;
    908         default:
    909             ASSERT_NOT_REACHED();
    910             return SHOW;
    911     }
    912 }
    913 
    914 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFloat e)
    915     : m_type(CSS_IDENT)
    916     , m_hasCachedCSSText(false)
    917 {
    918     switch (e) {
    919         case FNONE:
    920             m_value.ident = CSSValueNone;
    921             break;
    922         case FLEFT:
    923             m_value.ident = CSSValueLeft;
    924             break;
    925         case FRIGHT:
    926             m_value.ident = CSSValueRight;
    927             break;
    928     }
    929 }
    930 
    931 template<> inline CSSPrimitiveValue::operator EFloat() const
    932 {
    933     switch (m_value.ident) {
    934         case CSSValueLeft:
    935             return FLEFT;
    936         case CSSValueRight:
    937             return FRIGHT;
    938         case CSSValueNone:
    939         case CSSValueCenter:  // Non-standard CSS value
    940             return FNONE;
    941         default:
    942             ASSERT_NOT_REACHED();
    943             return FNONE;
    944     }
    945 }
    946 
    947 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EKHTMLLineBreak e)
    948     : m_type(CSS_IDENT)
    949     , m_hasCachedCSSText(false)
    950 {
    951     switch (e) {
    952         case LBNORMAL:
    953             m_value.ident = CSSValueNormal;
    954             break;
    955         case AFTER_WHITE_SPACE:
    956             m_value.ident = CSSValueAfterWhiteSpace;
    957             break;
    958     }
    959 }
    960 
    961 template<> inline CSSPrimitiveValue::operator EKHTMLLineBreak() const
    962 {
    963     switch (m_value.ident) {
    964         case CSSValueAfterWhiteSpace:
    965             return AFTER_WHITE_SPACE;
    966         case CSSValueNormal:
    967             return LBNORMAL;
    968         default:
    969             ASSERT_NOT_REACHED();
    970             return LBNORMAL;
    971     }
    972 }
    973 
    974 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStylePosition e)
    975     : m_type(CSS_IDENT)
    976     , m_hasCachedCSSText(false)
    977 {
    978     switch (e) {
    979         case OUTSIDE:
    980             m_value.ident = CSSValueOutside;
    981             break;
    982         case INSIDE:
    983             m_value.ident = CSSValueInside;
    984             break;
    985     }
    986 }
    987 
    988 template<> inline CSSPrimitiveValue::operator EListStylePosition() const
    989 {
    990     return (EListStylePosition)(m_value.ident - CSSValueOutside);
    991 }
    992 
    993 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStyleType e)
    994     : m_type(CSS_IDENT)
    995     , m_hasCachedCSSText(false)
    996 {
    997     switch (e) {
    998     case Afar:
    999         m_value.ident = CSSValueAfar;
   1000         break;
   1001     case Amharic:
   1002         m_value.ident = CSSValueAmharic;
   1003         break;
   1004     case AmharicAbegede:
   1005         m_value.ident = CSSValueAmharicAbegede;
   1006         break;
   1007     case ArabicIndic:
   1008         m_value.ident = CSSValueArabicIndic;
   1009         break;
   1010     case Armenian:
   1011         m_value.ident = CSSValueArmenian;
   1012         break;
   1013     case Asterisks:
   1014         m_value.ident = CSSValueAsterisks;
   1015         break;
   1016     case BinaryListStyle:
   1017         m_value.ident = CSSValueBinary;
   1018         break;
   1019     case Bengali:
   1020         m_value.ident = CSSValueBengali;
   1021         break;
   1022     case Cambodian:
   1023         m_value.ident = CSSValueCambodian;
   1024         break;
   1025     case Circle:
   1026         m_value.ident = CSSValueCircle;
   1027         break;
   1028     case CjkEarthlyBranch:
   1029         m_value.ident = CSSValueCjkEarthlyBranch;
   1030         break;
   1031     case CjkHeavenlyStem:
   1032         m_value.ident = CSSValueCjkHeavenlyStem;
   1033         break;
   1034     case CJKIdeographic:
   1035         m_value.ident = CSSValueCjkIdeographic;
   1036         break;
   1037     case DecimalLeadingZero:
   1038         m_value.ident = CSSValueDecimalLeadingZero;
   1039         break;
   1040     case DecimalListStyle:
   1041         m_value.ident = CSSValueDecimal;
   1042         break;
   1043     case Devanagari:
   1044         m_value.ident = CSSValueDevanagari;
   1045         break;
   1046     case Disc:
   1047         m_value.ident = CSSValueDisc;
   1048         break;
   1049     case Ethiopic:
   1050         m_value.ident = CSSValueEthiopic;
   1051         break;
   1052     case EthiopicAbegede:
   1053         m_value.ident = CSSValueEthiopicAbegede;
   1054         break;
   1055     case EthiopicAbegedeAmEt:
   1056         m_value.ident = CSSValueEthiopicAbegedeAmEt;
   1057         break;
   1058     case EthiopicAbegedeGez:
   1059         m_value.ident = CSSValueEthiopicAbegedeGez;
   1060         break;
   1061     case EthiopicAbegedeTiEr:
   1062         m_value.ident = CSSValueEthiopicAbegedeTiEr;
   1063         break;
   1064     case EthiopicAbegedeTiEt:
   1065         m_value.ident = CSSValueEthiopicAbegedeTiEt;
   1066         break;
   1067     case EthiopicHalehameAaEr:
   1068         m_value.ident = CSSValueEthiopicHalehameAaEr;
   1069         break;
   1070     case EthiopicHalehameAaEt:
   1071         m_value.ident = CSSValueEthiopicHalehameAaEt;
   1072         break;
   1073     case EthiopicHalehameAmEt:
   1074         m_value.ident = CSSValueEthiopicHalehameAmEt;
   1075         break;
   1076     case EthiopicHalehameGez:
   1077         m_value.ident = CSSValueEthiopicHalehameGez;
   1078         break;
   1079     case EthiopicHalehameOmEt:
   1080         m_value.ident = CSSValueEthiopicHalehameOmEt;
   1081         break;
   1082     case EthiopicHalehameSidEt:
   1083         m_value.ident = CSSValueEthiopicHalehameSidEt;
   1084         break;
   1085     case EthiopicHalehameSoEt:
   1086         m_value.ident = CSSValueEthiopicHalehameSoEt;
   1087         break;
   1088     case EthiopicHalehameTiEr:
   1089         m_value.ident = CSSValueEthiopicHalehameTiEr;
   1090         break;
   1091     case EthiopicHalehameTiEt:
   1092         m_value.ident = CSSValueEthiopicHalehameTiEt;
   1093         break;
   1094     case EthiopicHalehameTig:
   1095         m_value.ident = CSSValueEthiopicHalehameTig;
   1096         break;
   1097     case Footnotes:
   1098         m_value.ident = CSSValueFootnotes;
   1099         break;
   1100     case Georgian:
   1101         m_value.ident = CSSValueGeorgian;
   1102         break;
   1103     case Gujarati:
   1104         m_value.ident = CSSValueGujarati;
   1105         break;
   1106     case Gurmukhi:
   1107         m_value.ident = CSSValueGurmukhi;
   1108         break;
   1109     case Hangul:
   1110         m_value.ident = CSSValueHangul;
   1111         break;
   1112     case HangulConsonant:
   1113         m_value.ident = CSSValueHangulConsonant;
   1114         break;
   1115     case Hebrew:
   1116         m_value.ident = CSSValueHebrew;
   1117         break;
   1118     case Hiragana:
   1119         m_value.ident = CSSValueHiragana;
   1120         break;
   1121     case HiraganaIroha:
   1122         m_value.ident = CSSValueHiraganaIroha;
   1123         break;
   1124     case Kannada:
   1125         m_value.ident = CSSValueKannada;
   1126         break;
   1127     case Katakana:
   1128         m_value.ident = CSSValueKatakana;
   1129         break;
   1130     case KatakanaIroha:
   1131         m_value.ident = CSSValueKatakanaIroha;
   1132         break;
   1133     case Khmer:
   1134         m_value.ident = CSSValueKhmer;
   1135         break;
   1136     case Lao:
   1137         m_value.ident = CSSValueLao;
   1138         break;
   1139     case LowerAlpha:
   1140         m_value.ident = CSSValueLowerAlpha;
   1141         break;
   1142     case LowerArmenian:
   1143         m_value.ident = CSSValueLowerArmenian;
   1144         break;
   1145     case LowerGreek:
   1146         m_value.ident = CSSValueLowerGreek;
   1147         break;
   1148     case LowerHexadecimal:
   1149         m_value.ident = CSSValueLowerHexadecimal;
   1150         break;
   1151     case LowerLatin:
   1152         m_value.ident = CSSValueLowerLatin;
   1153         break;
   1154     case LowerNorwegian:
   1155         m_value.ident = CSSValueLowerNorwegian;
   1156         break;
   1157     case LowerRoman:
   1158         m_value.ident = CSSValueLowerRoman;
   1159         break;
   1160     case Malayalam:
   1161         m_value.ident = CSSValueMalayalam;
   1162         break;
   1163     case Mongolian:
   1164         m_value.ident = CSSValueMongolian;
   1165         break;
   1166     case Myanmar:
   1167         m_value.ident = CSSValueMyanmar;
   1168         break;
   1169     case NoneListStyle:
   1170         m_value.ident = CSSValueNone;
   1171         break;
   1172     case Octal:
   1173         m_value.ident = CSSValueOctal;
   1174         break;
   1175     case Oriya:
   1176         m_value.ident = CSSValueOriya;
   1177         break;
   1178     case Oromo:
   1179         m_value.ident = CSSValueOromo;
   1180         break;
   1181     case Persian:
   1182         m_value.ident = CSSValuePersian;
   1183         break;
   1184     case Sidama:
   1185         m_value.ident = CSSValueSidama;
   1186         break;
   1187     case Somali:
   1188         m_value.ident = CSSValueSomali;
   1189         break;
   1190     case Square:
   1191         m_value.ident = CSSValueSquare;
   1192         break;
   1193     case Telugu:
   1194         m_value.ident = CSSValueTelugu;
   1195         break;
   1196     case Thai:
   1197         m_value.ident = CSSValueThai;
   1198         break;
   1199     case Tibetan:
   1200         m_value.ident = CSSValueTibetan;
   1201         break;
   1202     case Tigre:
   1203         m_value.ident = CSSValueTigre;
   1204         break;
   1205     case TigrinyaEr:
   1206         m_value.ident = CSSValueTigrinyaEr;
   1207         break;
   1208     case TigrinyaErAbegede:
   1209         m_value.ident = CSSValueTigrinyaErAbegede;
   1210         break;
   1211     case TigrinyaEt:
   1212         m_value.ident = CSSValueTigrinyaEt;
   1213         break;
   1214     case TigrinyaEtAbegede:
   1215         m_value.ident = CSSValueTigrinyaEtAbegede;
   1216         break;
   1217     case UpperAlpha:
   1218         m_value.ident = CSSValueUpperAlpha;
   1219         break;
   1220     case UpperArmenian:
   1221         m_value.ident = CSSValueUpperArmenian;
   1222         break;
   1223     case UpperGreek:
   1224         m_value.ident = CSSValueUpperGreek;
   1225         break;
   1226     case UpperHexadecimal:
   1227         m_value.ident = CSSValueUpperHexadecimal;
   1228         break;
   1229     case UpperLatin:
   1230         m_value.ident = CSSValueUpperLatin;
   1231         break;
   1232     case UpperNorwegian:
   1233         m_value.ident = CSSValueUpperNorwegian;
   1234         break;
   1235     case UpperRoman:
   1236         m_value.ident = CSSValueUpperRoman;
   1237         break;
   1238     case Urdu:
   1239         m_value.ident = CSSValueUrdu;
   1240         break;
   1241     }
   1242 }
   1243 
   1244 template<> inline CSSPrimitiveValue::operator EListStyleType() const
   1245 {
   1246     switch (m_value.ident) {
   1247         case CSSValueNone:
   1248             return NoneListStyle;
   1249         default:
   1250             return static_cast<EListStyleType>(m_value.ident - CSSValueDisc);
   1251     }
   1252 }
   1253 
   1254 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarginCollapse e)
   1255     : m_type(CSS_IDENT)
   1256     , m_hasCachedCSSText(false)
   1257 {
   1258     switch (e) {
   1259         case MCOLLAPSE:
   1260             m_value.ident = CSSValueCollapse;
   1261             break;
   1262         case MSEPARATE:
   1263             m_value.ident = CSSValueSeparate;
   1264             break;
   1265         case MDISCARD:
   1266             m_value.ident = CSSValueDiscard;
   1267             break;
   1268     }
   1269 }
   1270 
   1271 template<> inline CSSPrimitiveValue::operator EMarginCollapse() const
   1272 {
   1273     switch (m_value.ident) {
   1274         case CSSValueCollapse:
   1275             return MCOLLAPSE;
   1276         case CSSValueSeparate:
   1277             return MSEPARATE;
   1278         case CSSValueDiscard:
   1279             return MDISCARD;
   1280         default:
   1281             ASSERT_NOT_REACHED();
   1282             return MCOLLAPSE;
   1283     }
   1284 }
   1285 
   1286 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeBehavior e)
   1287     : m_type(CSS_IDENT)
   1288     , m_hasCachedCSSText(false)
   1289 {
   1290     switch (e) {
   1291         case MNONE:
   1292             m_value.ident = CSSValueNone;
   1293             break;
   1294         case MSCROLL:
   1295             m_value.ident = CSSValueScroll;
   1296             break;
   1297         case MSLIDE:
   1298             m_value.ident = CSSValueSlide;
   1299             break;
   1300         case MALTERNATE:
   1301             m_value.ident = CSSValueAlternate;
   1302             break;
   1303     }
   1304 }
   1305 
   1306 template<> inline CSSPrimitiveValue::operator EMarqueeBehavior() const
   1307 {
   1308     switch (m_value.ident) {
   1309         case CSSValueNone:
   1310             return MNONE;
   1311         case CSSValueScroll:
   1312             return MSCROLL;
   1313         case CSSValueSlide:
   1314             return MSLIDE;
   1315         case CSSValueAlternate:
   1316             return MALTERNATE;
   1317         default:
   1318             ASSERT_NOT_REACHED();
   1319             return MNONE;
   1320     }
   1321 }
   1322 
   1323 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeDirection e)
   1324     : m_type(CSS_IDENT)
   1325     , m_hasCachedCSSText(false)
   1326 {
   1327     switch (e) {
   1328         case MFORWARD:
   1329             m_value.ident = CSSValueForwards;
   1330             break;
   1331         case MBACKWARD:
   1332             m_value.ident = CSSValueBackwards;
   1333             break;
   1334         case MAUTO:
   1335             m_value.ident = CSSValueAuto;
   1336             break;
   1337         case MUP:
   1338             m_value.ident = CSSValueUp;
   1339             break;
   1340         case MDOWN:
   1341             m_value.ident = CSSValueDown;
   1342             break;
   1343         case MLEFT:
   1344             m_value.ident = CSSValueLeft;
   1345             break;
   1346         case MRIGHT:
   1347             m_value.ident = CSSValueRight;
   1348             break;
   1349     }
   1350 }
   1351 
   1352 template<> inline CSSPrimitiveValue::operator EMarqueeDirection() const
   1353 {
   1354     switch (m_value.ident) {
   1355         case CSSValueForwards:
   1356             return MFORWARD;
   1357         case CSSValueBackwards:
   1358             return MBACKWARD;
   1359         case CSSValueAuto:
   1360             return MAUTO;
   1361         case CSSValueAhead:
   1362         case CSSValueUp: // We don't support vertical languages, so AHEAD just maps to UP.
   1363             return MUP;
   1364         case CSSValueReverse:
   1365         case CSSValueDown: // REVERSE just maps to DOWN, since we don't do vertical text.
   1366             return MDOWN;
   1367         case CSSValueLeft:
   1368             return MLEFT;
   1369         case CSSValueRight:
   1370             return MRIGHT;
   1371         default:
   1372             ASSERT_NOT_REACHED();
   1373             return MAUTO;
   1374     }
   1375 }
   1376 
   1377 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMatchNearestMailBlockquoteColor e)
   1378     : m_type(CSS_IDENT)
   1379     , m_hasCachedCSSText(false)
   1380 {
   1381     switch (e) {
   1382         case BCNORMAL:
   1383             m_value.ident = CSSValueNormal;
   1384             break;
   1385         case MATCH:
   1386             m_value.ident = CSSValueMatch;
   1387             break;
   1388     }
   1389 }
   1390 
   1391 template<> inline CSSPrimitiveValue::operator EMatchNearestMailBlockquoteColor() const
   1392 {
   1393     switch (m_value.ident) {
   1394         case CSSValueNormal:
   1395             return BCNORMAL;
   1396         case CSSValueMatch:
   1397             return MATCH;
   1398         default:
   1399             ASSERT_NOT_REACHED();
   1400             return BCNORMAL;
   1401     }
   1402 }
   1403 
   1404 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ENBSPMode e)
   1405     : m_type(CSS_IDENT)
   1406     , m_hasCachedCSSText(false)
   1407 {
   1408     switch (e) {
   1409         case NBNORMAL:
   1410             m_value.ident = CSSValueNormal;
   1411             break;
   1412         case SPACE:
   1413             m_value.ident = CSSValueSpace;
   1414             break;
   1415     }
   1416 }
   1417 
   1418 template<> inline CSSPrimitiveValue::operator ENBSPMode() const
   1419 {
   1420     switch (m_value.ident) {
   1421         case CSSValueSpace:
   1422             return SPACE;
   1423         case CSSValueNormal:
   1424             return NBNORMAL;
   1425         default:
   1426             ASSERT_NOT_REACHED();
   1427             return NBNORMAL;
   1428     }
   1429 }
   1430 
   1431 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EOverflow e)
   1432     : m_type(CSS_IDENT)
   1433     , m_hasCachedCSSText(false)
   1434 {
   1435     switch (e) {
   1436         case OVISIBLE:
   1437             m_value.ident = CSSValueVisible;
   1438             break;
   1439         case OHIDDEN:
   1440             m_value.ident = CSSValueHidden;
   1441             break;
   1442         case OSCROLL:
   1443             m_value.ident = CSSValueScroll;
   1444             break;
   1445         case OAUTO:
   1446             m_value.ident = CSSValueAuto;
   1447             break;
   1448         case OMARQUEE:
   1449             m_value.ident = CSSValueWebkitMarquee;
   1450             break;
   1451         case OOVERLAY:
   1452             m_value.ident = CSSValueOverlay;
   1453             break;
   1454     }
   1455 }
   1456 
   1457 template<> inline CSSPrimitiveValue::operator EOverflow() const
   1458 {
   1459     switch (m_value.ident) {
   1460         case CSSValueVisible:
   1461             return OVISIBLE;
   1462         case CSSValueHidden:
   1463             return OHIDDEN;
   1464         case CSSValueScroll:
   1465             return OSCROLL;
   1466         case CSSValueAuto:
   1467             return OAUTO;
   1468         case CSSValueWebkitMarquee:
   1469             return OMARQUEE;
   1470         case CSSValueOverlay:
   1471             return OOVERLAY;
   1472         default:
   1473             ASSERT_NOT_REACHED();
   1474             return OVISIBLE;
   1475     }
   1476 }
   1477 
   1478 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPageBreak e)
   1479     : m_type(CSS_IDENT)
   1480     , m_hasCachedCSSText(false)
   1481 {
   1482     switch (e) {
   1483         case PBAUTO:
   1484             m_value.ident = CSSValueAuto;
   1485             break;
   1486         case PBALWAYS:
   1487             m_value.ident = CSSValueAlways;
   1488             break;
   1489         case PBAVOID:
   1490             m_value.ident = CSSValueAvoid;
   1491             break;
   1492     }
   1493 }
   1494 
   1495 template<> inline CSSPrimitiveValue::operator EPageBreak() const
   1496 {
   1497     switch (m_value.ident) {
   1498         case CSSValueAuto:
   1499             return PBAUTO;
   1500         case CSSValueLeft:
   1501         case CSSValueRight:
   1502         case CSSValueAlways:
   1503             return PBALWAYS; // CSS2.1: "Conforming user agents may map left/right to always."
   1504         case CSSValueAvoid:
   1505             return PBAVOID;
   1506         default:
   1507             ASSERT_NOT_REACHED();
   1508             return PBAUTO;
   1509     }
   1510 }
   1511 
   1512 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPosition e)
   1513     : m_type(CSS_IDENT)
   1514     , m_hasCachedCSSText(false)
   1515 {
   1516     switch (e) {
   1517         case StaticPosition:
   1518             m_value.ident = CSSValueStatic;
   1519             break;
   1520         case RelativePosition:
   1521             m_value.ident = CSSValueRelative;
   1522             break;
   1523         case AbsolutePosition:
   1524             m_value.ident = CSSValueAbsolute;
   1525             break;
   1526         case FixedPosition:
   1527             m_value.ident = CSSValueFixed;
   1528             break;
   1529     }
   1530 }
   1531 
   1532 template<> inline CSSPrimitiveValue::operator EPosition() const
   1533 {
   1534     switch (m_value.ident) {
   1535         case CSSValueStatic:
   1536             return StaticPosition;
   1537         case CSSValueRelative:
   1538             return RelativePosition;
   1539         case CSSValueAbsolute:
   1540             return AbsolutePosition;
   1541         case CSSValueFixed:
   1542             return FixedPosition;
   1543         default:
   1544             ASSERT_NOT_REACHED();
   1545             return StaticPosition;
   1546     }
   1547 }
   1548 
   1549 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EResize e)
   1550     : m_type(CSS_IDENT)
   1551     , m_hasCachedCSSText(false)
   1552 {
   1553     switch (e) {
   1554         case RESIZE_BOTH:
   1555             m_value.ident = CSSValueBoth;
   1556             break;
   1557         case RESIZE_HORIZONTAL:
   1558             m_value.ident = CSSValueHorizontal;
   1559             break;
   1560         case RESIZE_VERTICAL:
   1561             m_value.ident = CSSValueVertical;
   1562             break;
   1563         case RESIZE_NONE:
   1564             m_value.ident = CSSValueNone;
   1565             break;
   1566     }
   1567 }
   1568 
   1569 template<> inline CSSPrimitiveValue::operator EResize() const
   1570 {
   1571     switch (m_value.ident) {
   1572         case CSSValueBoth:
   1573             return RESIZE_BOTH;
   1574         case CSSValueHorizontal:
   1575             return RESIZE_HORIZONTAL;
   1576         case CSSValueVertical:
   1577             return RESIZE_VERTICAL;
   1578         case CSSValueAuto:
   1579             ASSERT_NOT_REACHED(); // Depends on settings, thus should be handled by the caller.
   1580             return RESIZE_NONE;
   1581         case CSSValueNone:
   1582             return RESIZE_NONE;
   1583         default:
   1584             ASSERT_NOT_REACHED();
   1585             return RESIZE_NONE;
   1586     }
   1587 }
   1588 
   1589 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETableLayout e)
   1590     : m_type(CSS_IDENT)
   1591     , m_hasCachedCSSText(false)
   1592 {
   1593     switch (e) {
   1594         case TAUTO:
   1595             m_value.ident = CSSValueAuto;
   1596             break;
   1597         case TFIXED:
   1598             m_value.ident = CSSValueFixed;
   1599             break;
   1600     }
   1601 }
   1602 
   1603 template<> inline CSSPrimitiveValue::operator ETableLayout() const
   1604 {
   1605     switch (m_value.ident) {
   1606         case CSSValueFixed:
   1607             return TFIXED;
   1608         case CSSValueAuto:
   1609             return TAUTO;
   1610         default:
   1611             ASSERT_NOT_REACHED();
   1612             return TAUTO;
   1613     }
   1614 }
   1615 
   1616 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAlign e)
   1617     : m_type(CSS_IDENT)
   1618     , m_hasCachedCSSText(false)
   1619 {
   1620     switch (e) {
   1621     case TAAUTO:
   1622         m_value.ident = CSSValueWebkitAuto;
   1623         break;
   1624     case TASTART:
   1625         m_value.ident = CSSValueStart;
   1626         break;
   1627     case TAEND:
   1628         m_value.ident = CSSValueEnd;
   1629         break;
   1630     case LEFT:
   1631         m_value.ident = CSSValueLeft;
   1632         break;
   1633     case RIGHT:
   1634         m_value.ident = CSSValueRight;
   1635         break;
   1636     case CENTER:
   1637         m_value.ident = CSSValueCenter;
   1638         break;
   1639     case JUSTIFY:
   1640         m_value.ident = CSSValueJustify;
   1641         break;
   1642     case WEBKIT_LEFT:
   1643         m_value.ident = CSSValueWebkitLeft;
   1644         break;
   1645     case WEBKIT_RIGHT:
   1646         m_value.ident = CSSValueWebkitRight;
   1647         break;
   1648     case WEBKIT_CENTER:
   1649         m_value.ident = CSSValueWebkitCenter;
   1650         break;
   1651     }
   1652 }
   1653 
   1654 template<> inline CSSPrimitiveValue::operator ETextAlign() const
   1655 {
   1656     switch (m_value.ident) {
   1657         case CSSValueStart:
   1658             return TASTART;
   1659         case CSSValueEnd:
   1660             return TAEND;
   1661         default:
   1662             return static_cast<ETextAlign>(m_value.ident - CSSValueWebkitAuto);
   1663     }
   1664 }
   1665 
   1666 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextSecurity e)
   1667     : m_type(CSS_IDENT)
   1668     , m_hasCachedCSSText(false)
   1669 {
   1670     switch (e) {
   1671         case TSNONE:
   1672             m_value.ident = CSSValueNone;
   1673             break;
   1674         case TSDISC:
   1675             m_value.ident = CSSValueDisc;
   1676             break;
   1677         case TSCIRCLE:
   1678             m_value.ident = CSSValueCircle;
   1679             break;
   1680         case TSSQUARE:
   1681             m_value.ident = CSSValueSquare;
   1682             break;
   1683     }
   1684 }
   1685 
   1686 template<> inline CSSPrimitiveValue::operator ETextSecurity() const
   1687 {
   1688     switch (m_value.ident) {
   1689         case CSSValueNone:
   1690             return TSNONE;
   1691         case CSSValueDisc:
   1692             return TSDISC;
   1693         case CSSValueCircle:
   1694             return TSCIRCLE;
   1695         case CSSValueSquare:
   1696             return TSSQUARE;
   1697         default:
   1698             ASSERT_NOT_REACHED();
   1699             return TSNONE;
   1700     }
   1701 }
   1702 
   1703 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextTransform e)
   1704     : m_type(CSS_IDENT)
   1705     , m_hasCachedCSSText(false)
   1706 {
   1707     switch (e) {
   1708         case CAPITALIZE:
   1709             m_value.ident = CSSValueCapitalize;
   1710             break;
   1711         case UPPERCASE:
   1712             m_value.ident = CSSValueUppercase;
   1713             break;
   1714         case LOWERCASE:
   1715             m_value.ident = CSSValueLowercase;
   1716             break;
   1717         case TTNONE:
   1718             m_value.ident = CSSValueNone;
   1719             break;
   1720     }
   1721 }
   1722 
   1723 template<> inline CSSPrimitiveValue::operator ETextTransform() const
   1724 {
   1725     switch (m_value.ident) {
   1726         case CSSValueCapitalize:
   1727             return CAPITALIZE;
   1728         case CSSValueUppercase:
   1729             return UPPERCASE;
   1730         case CSSValueLowercase:
   1731             return LOWERCASE;
   1732         case CSSValueNone:
   1733             return TTNONE;
   1734         default:
   1735             ASSERT_NOT_REACHED();
   1736             return TTNONE;
   1737     }
   1738 }
   1739 
   1740 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUnicodeBidi e)
   1741     : m_type(CSS_IDENT)
   1742     , m_hasCachedCSSText(false)
   1743 {
   1744     switch (e) {
   1745     case UBNormal:
   1746         m_value.ident = CSSValueNormal;
   1747         break;
   1748     case Embed:
   1749         m_value.ident = CSSValueEmbed;
   1750         break;
   1751     case Override:
   1752         m_value.ident = CSSValueBidiOverride;
   1753         break;
   1754     case Isolate:
   1755         m_value.ident = CSSValueWebkitIsolate;
   1756     }
   1757 }
   1758 
   1759 template<> inline CSSPrimitiveValue::operator EUnicodeBidi() const
   1760 {
   1761     switch (m_value.ident) {
   1762     case CSSValueNormal:
   1763         return UBNormal;
   1764     case CSSValueEmbed:
   1765         return Embed;
   1766     case CSSValueBidiOverride:
   1767         return Override;
   1768     case CSSValueWebkitIsolate:
   1769         return Isolate;
   1770     default:
   1771         ASSERT_NOT_REACHED();
   1772         return UBNormal;
   1773     }
   1774 }
   1775 
   1776 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserDrag e)
   1777     : m_type(CSS_IDENT)
   1778     , m_hasCachedCSSText(false)
   1779 {
   1780     switch (e) {
   1781         case DRAG_AUTO:
   1782             m_value.ident = CSSValueAuto;
   1783             break;
   1784         case DRAG_NONE:
   1785             m_value.ident = CSSValueNone;
   1786             break;
   1787         case DRAG_ELEMENT:
   1788             m_value.ident = CSSValueElement;
   1789             break;
   1790     }
   1791 }
   1792 
   1793 template<> inline CSSPrimitiveValue::operator EUserDrag() const
   1794 {
   1795     switch (m_value.ident) {
   1796         case CSSValueAuto:
   1797             return DRAG_AUTO;
   1798         case CSSValueNone:
   1799             return DRAG_NONE;
   1800         case CSSValueElement:
   1801             return DRAG_ELEMENT;
   1802         default:
   1803             ASSERT_NOT_REACHED();
   1804             return DRAG_AUTO;
   1805     }
   1806 }
   1807 
   1808 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserModify e)
   1809     : m_type(CSS_IDENT)
   1810     , m_hasCachedCSSText(false)
   1811 {
   1812     switch (e) {
   1813         case READ_ONLY:
   1814             m_value.ident = CSSValueReadOnly;
   1815             break;
   1816         case READ_WRITE:
   1817             m_value.ident = CSSValueReadWrite;
   1818             break;
   1819         case READ_WRITE_PLAINTEXT_ONLY:
   1820             m_value.ident = CSSValueReadWritePlaintextOnly;
   1821             break;
   1822     }
   1823 }
   1824 
   1825 template<> inline CSSPrimitiveValue::operator EUserModify() const
   1826 {
   1827     return static_cast<EUserModify>(m_value.ident - CSSValueReadOnly);
   1828 }
   1829 
   1830 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserSelect e)
   1831     : m_type(CSS_IDENT)
   1832     , m_hasCachedCSSText(false)
   1833 {
   1834     switch (e) {
   1835         case SELECT_NONE:
   1836             m_value.ident = CSSValueNone;
   1837             break;
   1838         case SELECT_TEXT:
   1839             m_value.ident = CSSValueText;
   1840             break;
   1841     }
   1842 }
   1843 
   1844 template<> inline CSSPrimitiveValue::operator EUserSelect() const
   1845 {
   1846     switch (m_value.ident) {
   1847         case CSSValueAuto:
   1848             return SELECT_TEXT;
   1849         case CSSValueNone:
   1850             return SELECT_NONE;
   1851         case CSSValueText:
   1852             return SELECT_TEXT;
   1853         default:
   1854             ASSERT_NOT_REACHED();
   1855             return SELECT_TEXT;
   1856     }
   1857 }
   1858 
   1859 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EVisibility e)
   1860     : m_type(CSS_IDENT)
   1861     , m_hasCachedCSSText(false)
   1862 {
   1863     switch (e) {
   1864         case VISIBLE:
   1865             m_value.ident = CSSValueVisible;
   1866             break;
   1867         case HIDDEN:
   1868             m_value.ident = CSSValueHidden;
   1869             break;
   1870         case COLLAPSE:
   1871             m_value.ident = CSSValueCollapse;
   1872             break;
   1873     }
   1874 }
   1875 
   1876 template<> inline CSSPrimitiveValue::operator EVisibility() const
   1877 {
   1878     switch (m_value.ident) {
   1879         case CSSValueHidden:
   1880             return HIDDEN;
   1881         case CSSValueVisible:
   1882             return VISIBLE;
   1883         case CSSValueCollapse:
   1884             return COLLAPSE;
   1885         default:
   1886             ASSERT_NOT_REACHED();
   1887             return VISIBLE;
   1888     }
   1889 }
   1890 
   1891 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWhiteSpace e)
   1892     : m_type(CSS_IDENT)
   1893     , m_hasCachedCSSText(false)
   1894 {
   1895     switch (e) {
   1896         case NORMAL:
   1897             m_value.ident = CSSValueNormal;
   1898             break;
   1899         case PRE:
   1900             m_value.ident = CSSValuePre;
   1901             break;
   1902         case PRE_WRAP:
   1903             m_value.ident = CSSValuePreWrap;
   1904             break;
   1905         case PRE_LINE:
   1906             m_value.ident = CSSValuePreLine;
   1907             break;
   1908         case NOWRAP:
   1909             m_value.ident = CSSValueNowrap;
   1910             break;
   1911         case KHTML_NOWRAP:
   1912             m_value.ident = CSSValueWebkitNowrap;
   1913             break;
   1914     }
   1915 }
   1916 
   1917 template<> inline CSSPrimitiveValue::operator EWhiteSpace() const
   1918 {
   1919     switch (m_value.ident) {
   1920         case CSSValueWebkitNowrap:
   1921             return KHTML_NOWRAP;
   1922         case CSSValueNowrap:
   1923             return NOWRAP;
   1924         case CSSValuePre:
   1925             return PRE;
   1926         case CSSValuePreWrap:
   1927             return PRE_WRAP;
   1928         case CSSValuePreLine:
   1929             return PRE_LINE;
   1930         case CSSValueNormal:
   1931             return NORMAL;
   1932         default:
   1933             ASSERT_NOT_REACHED();
   1934             return NORMAL;
   1935     }
   1936 }
   1937 
   1938 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWordBreak e)
   1939     : m_type(CSS_IDENT)
   1940     , m_hasCachedCSSText(false)
   1941 {
   1942     switch (e) {
   1943         case NormalWordBreak:
   1944             m_value.ident = CSSValueNormal;
   1945             break;
   1946         case BreakAllWordBreak:
   1947             m_value.ident = CSSValueBreakAll;
   1948             break;
   1949         case BreakWordBreak:
   1950             m_value.ident = CSSValueBreakWord;
   1951             break;
   1952     }
   1953 }
   1954 
   1955 template<> inline CSSPrimitiveValue::operator EWordBreak() const
   1956 {
   1957     switch (m_value.ident) {
   1958         case CSSValueBreakAll:
   1959             return BreakAllWordBreak;
   1960         case CSSValueBreakWord:
   1961             return BreakWordBreak;
   1962         case CSSValueNormal:
   1963             return NormalWordBreak;
   1964         default:
   1965         ASSERT_NOT_REACHED();
   1966         return NormalWordBreak;
   1967     }
   1968 }
   1969 
   1970 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWordWrap e)
   1971     : m_type(CSS_IDENT)
   1972     , m_hasCachedCSSText(false)
   1973 {
   1974     switch (e) {
   1975         case NormalWordWrap:
   1976             m_value.ident = CSSValueNormal;
   1977             break;
   1978         case BreakWordWrap:
   1979             m_value.ident = CSSValueBreakWord;
   1980             break;
   1981     }
   1982 }
   1983 
   1984 template<> inline CSSPrimitiveValue::operator EWordWrap() const
   1985 {
   1986     switch (m_value.ident) {
   1987         case CSSValueBreakWord:
   1988             return BreakWordWrap;
   1989         case CSSValueNormal:
   1990             return NormalWordWrap;
   1991         default:
   1992             ASSERT_NOT_REACHED();
   1993             return NormalWordWrap;
   1994     }
   1995 }
   1996 
   1997 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextDirection e)
   1998     : m_type(CSS_IDENT)
   1999     , m_hasCachedCSSText(false)
   2000 {
   2001     switch (e) {
   2002         case LTR:
   2003             m_value.ident = CSSValueLtr;
   2004             break;
   2005         case RTL:
   2006             m_value.ident = CSSValueRtl;
   2007             break;
   2008     }
   2009 }
   2010 
   2011 template<> inline CSSPrimitiveValue::operator TextDirection() const
   2012 {
   2013     switch (m_value.ident) {
   2014         case CSSValueLtr:
   2015             return LTR;
   2016         case CSSValueRtl:
   2017             return RTL;
   2018         default:
   2019             ASSERT_NOT_REACHED();
   2020             return LTR;
   2021     }
   2022 }
   2023 
   2024 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(WritingMode e)
   2025     : m_type(CSS_IDENT)
   2026     , m_hasCachedCSSText(false)
   2027 {
   2028     switch (e) {
   2029     case TopToBottomWritingMode:
   2030         m_value.ident = CSSValueHorizontalTb;
   2031         break;
   2032     case RightToLeftWritingMode:
   2033         m_value.ident = CSSValueVerticalRl;
   2034         break;
   2035     case LeftToRightWritingMode:
   2036         m_value.ident = CSSValueVerticalLr;
   2037         break;
   2038     case BottomToTopWritingMode:
   2039         m_value.ident = CSSValueHorizontalBt;
   2040         break;
   2041     }
   2042 }
   2043 
   2044 template<> inline CSSPrimitiveValue::operator WritingMode() const
   2045 {
   2046     switch (m_value.ident) {
   2047     case CSSValueHorizontalTb:
   2048         return TopToBottomWritingMode;
   2049     case CSSValueVerticalRl:
   2050         return RightToLeftWritingMode;
   2051     case CSSValueVerticalLr:
   2052         return LeftToRightWritingMode;
   2053     case CSSValueHorizontalBt:
   2054         return BottomToTopWritingMode;
   2055     default:
   2056         ASSERT_NOT_REACHED();
   2057         return TopToBottomWritingMode;
   2058     }
   2059 }
   2060 
   2061 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextCombine e)
   2062     : m_type(CSS_IDENT)
   2063     , m_hasCachedCSSText(false)
   2064 {
   2065     switch (e) {
   2066     case TextCombineNone:
   2067         m_value.ident = CSSValueNone;
   2068         break;
   2069     case TextCombineHorizontal:
   2070         m_value.ident = CSSValueHorizontal;
   2071         break;
   2072     }
   2073 }
   2074 
   2075 template<> inline CSSPrimitiveValue::operator TextCombine() const
   2076 {
   2077     switch (m_value.ident) {
   2078     case CSSValueNone:
   2079         return TextCombineNone;
   2080     case CSSValueHorizontal:
   2081         return TextCombineHorizontal;
   2082     default:
   2083         ASSERT_NOT_REACHED();
   2084         return TextCombineNone;
   2085     }
   2086 }
   2087 
   2088 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextEmphasisPosition position)
   2089     : m_type(CSS_IDENT)
   2090     , m_hasCachedCSSText(false)
   2091 {
   2092     switch (position) {
   2093     case TextEmphasisPositionOver:
   2094         m_value.ident = CSSValueOver;
   2095         break;
   2096     case TextEmphasisPositionUnder:
   2097         m_value.ident = CSSValueUnder;
   2098         break;
   2099     }
   2100 }
   2101 
   2102 template<> inline CSSPrimitiveValue::operator TextEmphasisPosition() const
   2103 {
   2104     switch (m_value.ident) {
   2105     case CSSValueOver:
   2106         return TextEmphasisPositionOver;
   2107     case CSSValueUnder:
   2108         return TextEmphasisPositionUnder;
   2109     default:
   2110         ASSERT_NOT_REACHED();
   2111         return TextEmphasisPositionOver;
   2112     }
   2113 }
   2114 
   2115 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextEmphasisFill fill)
   2116     : m_type(CSS_IDENT)
   2117     , m_hasCachedCSSText(false)
   2118 {
   2119     switch (fill) {
   2120     case TextEmphasisFillFilled:
   2121         m_value.ident = CSSValueFilled;
   2122         break;
   2123     case TextEmphasisFillOpen:
   2124         m_value.ident = CSSValueOpen;
   2125         break;
   2126     }
   2127 }
   2128 
   2129 template<> inline CSSPrimitiveValue::operator TextEmphasisFill() const
   2130 {
   2131     switch (m_value.ident) {
   2132     case CSSValueFilled:
   2133         return TextEmphasisFillFilled;
   2134     case CSSValueOpen:
   2135         return TextEmphasisFillOpen;
   2136     default:
   2137         ASSERT_NOT_REACHED();
   2138         return TextEmphasisFillFilled;
   2139     }
   2140 }
   2141 
   2142 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextEmphasisMark mark)
   2143     : m_type(CSS_IDENT)
   2144     , m_hasCachedCSSText(false)
   2145 {
   2146     switch (mark) {
   2147     case TextEmphasisMarkDot:
   2148         m_value.ident = CSSValueDot;
   2149         break;
   2150     case TextEmphasisMarkCircle:
   2151         m_value.ident = CSSValueCircle;
   2152         break;
   2153     case TextEmphasisMarkDoubleCircle:
   2154         m_value.ident = CSSValueDoubleCircle;
   2155         break;
   2156     case TextEmphasisMarkTriangle:
   2157         m_value.ident = CSSValueTriangle;
   2158         break;
   2159     case TextEmphasisMarkSesame:
   2160         m_value.ident = CSSValueSesame;
   2161         break;
   2162     case TextEmphasisMarkNone:
   2163     case TextEmphasisMarkAuto:
   2164     case TextEmphasisMarkCustom:
   2165         ASSERT_NOT_REACHED();
   2166         m_value.ident = CSSValueNone;
   2167         break;
   2168     }
   2169 }
   2170 
   2171 template<> inline CSSPrimitiveValue::operator TextEmphasisMark() const
   2172 {
   2173     switch (m_value.ident) {
   2174     case CSSValueNone:
   2175         return TextEmphasisMarkNone;
   2176     case CSSValueDot:
   2177         return TextEmphasisMarkDot;
   2178     case CSSValueCircle:
   2179         return TextEmphasisMarkCircle;
   2180     case CSSValueDoubleCircle:
   2181         return TextEmphasisMarkDoubleCircle;
   2182     case CSSValueTriangle:
   2183         return TextEmphasisMarkTriangle;
   2184     case CSSValueSesame:
   2185         return TextEmphasisMarkSesame;
   2186     default:
   2187         ASSERT_NOT_REACHED();
   2188         return TextEmphasisMarkNone;
   2189     }
   2190 }
   2191 
   2192 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextOrientation e)
   2193     : m_type(CSS_IDENT)
   2194     , m_hasCachedCSSText(false)
   2195 {
   2196     switch (e) {
   2197     case TextOrientationVerticalRight:
   2198         m_value.ident = CSSValueVerticalRight;
   2199         break;
   2200     case TextOrientationUpright:
   2201         m_value.ident = CSSValueUpright;
   2202         break;
   2203     }
   2204 }
   2205 
   2206 template<> inline CSSPrimitiveValue::operator TextOrientation() const
   2207 {
   2208     switch (m_value.ident) {
   2209     case CSSValueVerticalRight:
   2210         return TextOrientationVerticalRight;
   2211     case CSSValueUpright:
   2212         return TextOrientationUpright;
   2213     default:
   2214         ASSERT_NOT_REACHED();
   2215         return TextOrientationVerticalRight;
   2216     }
   2217 }
   2218 
   2219 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPointerEvents e)
   2220     : m_type(CSS_IDENT)
   2221     , m_hasCachedCSSText(false)
   2222 {
   2223     switch (e) {
   2224         case PE_NONE:
   2225             m_value.ident = CSSValueNone;
   2226             break;
   2227         case PE_STROKE:
   2228             m_value.ident = CSSValueStroke;
   2229             break;
   2230         case PE_FILL:
   2231             m_value.ident = CSSValueFill;
   2232             break;
   2233         case PE_PAINTED:
   2234             m_value.ident = CSSValuePainted;
   2235             break;
   2236         case PE_VISIBLE:
   2237             m_value.ident = CSSValueVisible;
   2238             break;
   2239         case PE_VISIBLE_STROKE:
   2240             m_value.ident = CSSValueVisiblestroke;
   2241             break;
   2242         case PE_VISIBLE_FILL:
   2243             m_value.ident = CSSValueVisiblefill;
   2244             break;
   2245         case PE_VISIBLE_PAINTED:
   2246             m_value.ident = CSSValueVisiblepainted;
   2247             break;
   2248         case PE_AUTO:
   2249             m_value.ident = CSSValueAuto;
   2250             break;
   2251         case PE_ALL:
   2252             m_value.ident = CSSValueAll;
   2253             break;
   2254     }
   2255 }
   2256 
   2257 template<> inline CSSPrimitiveValue::operator EPointerEvents() const
   2258 {
   2259     switch (m_value.ident) {
   2260         case CSSValueAll:
   2261             return PE_ALL;
   2262         case CSSValueAuto:
   2263             return PE_AUTO;
   2264         case CSSValueNone:
   2265             return PE_NONE;
   2266         case CSSValueVisiblepainted:
   2267             return PE_VISIBLE_PAINTED;
   2268         case CSSValueVisiblefill:
   2269             return PE_VISIBLE_FILL;
   2270         case CSSValueVisiblestroke:
   2271             return PE_VISIBLE_STROKE;
   2272         case CSSValueVisible:
   2273             return PE_VISIBLE;
   2274         case CSSValuePainted:
   2275             return PE_PAINTED;
   2276         case CSSValueFill:
   2277             return PE_FILL;
   2278         case CSSValueStroke:
   2279             return PE_STROKE;
   2280         default:
   2281             ASSERT_NOT_REACHED();
   2282             return PE_ALL;
   2283     }
   2284 }
   2285 
   2286 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontSmoothingMode smoothing)
   2287     : m_type(CSS_IDENT)
   2288     , m_hasCachedCSSText(false)
   2289 {
   2290     switch (smoothing) {
   2291     case AutoSmoothing:
   2292         m_value.ident = CSSValueAuto;
   2293         return;
   2294     case NoSmoothing:
   2295         m_value.ident = CSSValueNone;
   2296         return;
   2297     case Antialiased:
   2298         m_value.ident = CSSValueAntialiased;
   2299         return;
   2300     case SubpixelAntialiased:
   2301         m_value.ident = CSSValueSubpixelAntialiased;
   2302         return;
   2303     }
   2304 
   2305     ASSERT_NOT_REACHED();
   2306     m_value.ident = CSSValueAuto;
   2307 }
   2308 
   2309 template<> inline CSSPrimitiveValue::operator FontSmoothingMode() const
   2310 {
   2311     switch (m_value.ident) {
   2312     case CSSValueAuto:
   2313         return AutoSmoothing;
   2314     case CSSValueNone:
   2315         return NoSmoothing;
   2316     case CSSValueAntialiased:
   2317         return Antialiased;
   2318     case CSSValueSubpixelAntialiased:
   2319         return SubpixelAntialiased;
   2320     }
   2321 
   2322     ASSERT_NOT_REACHED();
   2323     return AutoSmoothing;
   2324 }
   2325 
   2326 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextRenderingMode e)
   2327     : m_type(CSS_IDENT)
   2328     , m_hasCachedCSSText(false)
   2329 {
   2330     switch (e) {
   2331         case AutoTextRendering:
   2332             m_value.ident = CSSValueAuto;
   2333             break;
   2334         case OptimizeSpeed:
   2335             m_value.ident = CSSValueOptimizespeed;
   2336             break;
   2337         case OptimizeLegibility:
   2338             m_value.ident = CSSValueOptimizelegibility;
   2339             break;
   2340         case GeometricPrecision:
   2341             m_value.ident = CSSValueGeometricprecision;
   2342             break;
   2343     }
   2344 }
   2345 
   2346 template<> inline CSSPrimitiveValue::operator TextRenderingMode() const
   2347 {
   2348     switch (m_value.ident) {
   2349         case CSSValueAuto:
   2350             return AutoTextRendering;
   2351         case CSSValueOptimizespeed:
   2352             return OptimizeSpeed;
   2353         case CSSValueOptimizelegibility:
   2354             return OptimizeLegibility;
   2355         case CSSValueGeometricprecision:
   2356             return GeometricPrecision;
   2357         default:
   2358             ASSERT_NOT_REACHED();
   2359             return AutoTextRendering;
   2360     }
   2361 }
   2362 
   2363 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ColorSpace space)
   2364     : m_type(CSS_IDENT)
   2365     , m_hasCachedCSSText(false)
   2366 {
   2367     switch (space) {
   2368     case ColorSpaceDeviceRGB:
   2369         m_value.ident = CSSValueDefault;
   2370         break;
   2371     case ColorSpaceSRGB:
   2372         m_value.ident = CSSValueSrgb;
   2373         break;
   2374     case ColorSpaceLinearRGB:
   2375         // CSS color correction does not support linearRGB yet.
   2376         ASSERT_NOT_REACHED();
   2377         m_value.ident = CSSValueDefault;
   2378         break;
   2379     }
   2380 }
   2381 
   2382 template<> inline CSSPrimitiveValue::operator ColorSpace() const
   2383 {
   2384     switch (m_value.ident) {
   2385     case CSSValueDefault:
   2386         return ColorSpaceDeviceRGB;
   2387     case CSSValueSrgb:
   2388         return ColorSpaceSRGB;
   2389     default:
   2390         ASSERT_NOT_REACHED();
   2391         return ColorSpaceDeviceRGB;
   2392     }
   2393 }
   2394 
   2395 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(Hyphens hyphens)
   2396     : m_type(CSS_IDENT)
   2397     , m_hasCachedCSSText(false)
   2398 {
   2399     switch (hyphens) {
   2400     case HyphensNone:
   2401         m_value.ident = CSSValueNone;
   2402         break;
   2403     case HyphensManual:
   2404         m_value.ident = CSSValueManual;
   2405         break;
   2406     case HyphensAuto:
   2407         m_value.ident = CSSValueAuto;
   2408         break;
   2409     }
   2410 }
   2411 
   2412 template<> inline CSSPrimitiveValue::operator Hyphens() const
   2413 {
   2414     switch (m_value.ident) {
   2415     case CSSValueNone:
   2416         return HyphensNone;
   2417     case CSSValueManual:
   2418         return HyphensManual;
   2419     case CSSValueAuto:
   2420         return HyphensAuto;
   2421     default:
   2422         ASSERT_NOT_REACHED();
   2423         return HyphensAuto;
   2424     }
   2425 }
   2426 
   2427 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ESpeak e)
   2428     : m_type(CSS_IDENT)
   2429     , m_hasCachedCSSText(false)
   2430 {
   2431     switch (e) {
   2432     case SpeakNone:
   2433         m_value.ident = CSSValueNone;
   2434         break;
   2435     case SpeakNormal:
   2436         m_value.ident = CSSValueNormal;
   2437         break;
   2438     case SpeakSpellOut:
   2439         m_value.ident = CSSValueSpellOut;
   2440         break;
   2441     case SpeakDigits:
   2442         m_value.ident = CSSValueDigits;
   2443         break;
   2444     case SpeakLiteralPunctuation:
   2445         m_value.ident = CSSValueLiteralPunctuation;
   2446         break;
   2447     case SpeakNoPunctuation:
   2448         m_value.ident = CSSValueNoPunctuation;
   2449         break;
   2450     }
   2451 }
   2452 
   2453 template<> inline CSSPrimitiveValue::operator ESpeak() const
   2454 {
   2455     switch (m_value.ident) {
   2456     case CSSValueNone:
   2457         return SpeakNone;
   2458     case CSSValueNormal:
   2459         return SpeakNormal;
   2460     case CSSValueSpellOut:
   2461         return SpeakSpellOut;
   2462     case CSSValueDigits:
   2463         return SpeakDigits;
   2464     case CSSValueLiteralPunctuation:
   2465         return SpeakLiteralPunctuation;
   2466     case CSSValueNoPunctuation:
   2467         return SpeakNoPunctuation;
   2468     default:
   2469         ASSERT_NOT_REACHED();
   2470         return SpeakNormal;
   2471     }
   2472 }
   2473 
   2474 #if ENABLE(SVG)
   2475 
   2476 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineCap e)
   2477     : m_type(CSS_IDENT)
   2478     , m_hasCachedCSSText(false)
   2479 {
   2480     switch (e) {
   2481         case ButtCap:
   2482             m_value.ident = CSSValueButt;
   2483             break;
   2484         case RoundCap:
   2485             m_value.ident = CSSValueRound;
   2486             break;
   2487         case SquareCap:
   2488             m_value.ident = CSSValueSquare;
   2489             break;
   2490     }
   2491 }
   2492 
   2493 template<> inline CSSPrimitiveValue::operator LineCap() const
   2494 {
   2495     switch (m_value.ident) {
   2496         case CSSValueButt:
   2497             return ButtCap;
   2498         case CSSValueRound:
   2499             return RoundCap;
   2500         case CSSValueSquare:
   2501             return SquareCap;
   2502         default:
   2503             ASSERT_NOT_REACHED();
   2504             return ButtCap;
   2505     }
   2506 }
   2507 
   2508 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineJoin e)
   2509     : m_type(CSS_IDENT)
   2510     , m_hasCachedCSSText(false)
   2511 {
   2512     switch (e) {
   2513         case MiterJoin:
   2514             m_value.ident = CSSValueMiter;
   2515             break;
   2516         case RoundJoin:
   2517             m_value.ident = CSSValueRound;
   2518             break;
   2519         case BevelJoin:
   2520             m_value.ident = CSSValueBevel;
   2521             break;
   2522     }
   2523 }
   2524 
   2525 template<> inline CSSPrimitiveValue::operator LineJoin() const
   2526 {
   2527     switch (m_value.ident) {
   2528         case CSSValueMiter:
   2529             return MiterJoin;
   2530         case CSSValueRound:
   2531             return RoundJoin;
   2532         case CSSValueBevel:
   2533             return BevelJoin;
   2534         default:
   2535             ASSERT_NOT_REACHED();
   2536             return MiterJoin;
   2537     }
   2538 }
   2539 
   2540 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(WindRule e)
   2541     : m_type(CSS_IDENT)
   2542     , m_hasCachedCSSText(false)
   2543 {
   2544     switch (e) {
   2545         case RULE_NONZERO:
   2546             m_value.ident = CSSValueNonzero;
   2547             break;
   2548         case RULE_EVENODD:
   2549             m_value.ident = CSSValueEvenodd;
   2550             break;
   2551     }
   2552 }
   2553 
   2554 template<> inline CSSPrimitiveValue::operator WindRule() const
   2555 {
   2556     switch (m_value.ident) {
   2557         case CSSValueNonzero:
   2558             return RULE_NONZERO;
   2559         case CSSValueEvenodd:
   2560             return RULE_EVENODD;
   2561         default:
   2562             ASSERT_NOT_REACHED();
   2563             return RULE_NONZERO;
   2564     }
   2565 }
   2566 
   2567 
   2568 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EAlignmentBaseline e)
   2569     : m_type(CSS_IDENT)
   2570     , m_hasCachedCSSText(false)
   2571 {
   2572     switch (e) {
   2573         case AB_AUTO:
   2574             m_value.ident = CSSValueAuto;
   2575             break;
   2576         case AB_BASELINE:
   2577             m_value.ident = CSSValueBaseline;
   2578             break;
   2579         case AB_BEFORE_EDGE:
   2580             m_value.ident = CSSValueBeforeEdge;
   2581             break;
   2582         case AB_TEXT_BEFORE_EDGE:
   2583             m_value.ident = CSSValueTextBeforeEdge;
   2584             break;
   2585         case AB_MIDDLE:
   2586             m_value.ident = CSSValueMiddle;
   2587             break;
   2588         case AB_CENTRAL:
   2589             m_value.ident = CSSValueCentral;
   2590             break;
   2591         case AB_AFTER_EDGE:
   2592             m_value.ident = CSSValueAfterEdge;
   2593             break;
   2594         case AB_TEXT_AFTER_EDGE:
   2595             m_value.ident = CSSValueTextAfterEdge;
   2596             break;
   2597         case AB_IDEOGRAPHIC:
   2598             m_value.ident = CSSValueIdeographic;
   2599             break;
   2600         case AB_ALPHABETIC:
   2601             m_value.ident = CSSValueAlphabetic;
   2602             break;
   2603         case AB_HANGING:
   2604             m_value.ident = CSSValueHanging;
   2605             break;
   2606         case AB_MATHEMATICAL:
   2607             m_value.ident = CSSValueMathematical;
   2608             break;
   2609     }
   2610 }
   2611 
   2612 template<> inline CSSPrimitiveValue::operator EAlignmentBaseline() const
   2613 {
   2614     switch (m_value.ident) {
   2615         case CSSValueAuto:
   2616             return AB_AUTO;
   2617         case CSSValueBaseline:
   2618             return AB_BASELINE;
   2619         case CSSValueBeforeEdge:
   2620             return AB_BEFORE_EDGE;
   2621         case CSSValueTextBeforeEdge:
   2622             return AB_TEXT_BEFORE_EDGE;
   2623         case CSSValueMiddle:
   2624             return AB_MIDDLE;
   2625         case CSSValueCentral:
   2626             return AB_CENTRAL;
   2627         case CSSValueAfterEdge:
   2628             return AB_AFTER_EDGE;
   2629         case CSSValueTextAfterEdge:
   2630             return AB_TEXT_AFTER_EDGE;
   2631         case CSSValueIdeographic:
   2632             return AB_IDEOGRAPHIC;
   2633         case CSSValueAlphabetic:
   2634             return AB_ALPHABETIC;
   2635         case CSSValueHanging:
   2636             return AB_HANGING;
   2637         case CSSValueMathematical:
   2638             return AB_MATHEMATICAL;
   2639         default:
   2640             ASSERT_NOT_REACHED();
   2641             return AB_AUTO;
   2642     }
   2643 }
   2644 
   2645 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorInterpolation e)
   2646     : m_type(CSS_IDENT)
   2647     , m_hasCachedCSSText(false)
   2648 {
   2649     switch (e) {
   2650         case CI_AUTO:
   2651             m_value.ident = CSSValueAuto;
   2652             break;
   2653         case CI_SRGB:
   2654             m_value.ident = CSSValueSrgb;
   2655             break;
   2656         case CI_LINEARRGB:
   2657             m_value.ident = CSSValueLinearrgb;
   2658             break;
   2659     }
   2660 }
   2661 
   2662 template<> inline CSSPrimitiveValue::operator EColorInterpolation() const
   2663 {
   2664     switch (m_value.ident) {
   2665         case CSSValueSrgb:
   2666             return CI_SRGB;
   2667         case CSSValueLinearrgb:
   2668             return CI_LINEARRGB;
   2669         case CSSValueAuto:
   2670             return CI_AUTO;
   2671         default:
   2672             ASSERT_NOT_REACHED();
   2673             return CI_AUTO;
   2674     }
   2675 }
   2676 
   2677 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorRendering e)
   2678     : m_type(CSS_IDENT)
   2679     , m_hasCachedCSSText(false)
   2680 {
   2681     switch (e) {
   2682         case CR_AUTO:
   2683             m_value.ident = CSSValueAuto;
   2684             break;
   2685         case CR_OPTIMIZESPEED:
   2686             m_value.ident = CSSValueOptimizespeed;
   2687             break;
   2688         case CR_OPTIMIZEQUALITY:
   2689             m_value.ident = CSSValueOptimizequality;
   2690             break;
   2691     }
   2692 }
   2693 
   2694 template<> inline CSSPrimitiveValue::operator EColorRendering() const
   2695 {
   2696     switch (m_value.ident) {
   2697         case CSSValueOptimizespeed:
   2698             return CR_OPTIMIZESPEED;
   2699         case CSSValueOptimizequality:
   2700             return CR_OPTIMIZEQUALITY;
   2701         case CSSValueAuto:
   2702             return CR_AUTO;
   2703         default:
   2704             ASSERT_NOT_REACHED();
   2705             return CR_AUTO;
   2706     }
   2707 }
   2708 
   2709 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDominantBaseline e)
   2710     : m_type(CSS_IDENT)
   2711     , m_hasCachedCSSText(false)
   2712 {
   2713     switch (e) {
   2714         case DB_AUTO:
   2715             m_value.ident = CSSValueAuto;
   2716             break;
   2717         case DB_USE_SCRIPT:
   2718             m_value.ident = CSSValueUseScript;
   2719             break;
   2720         case DB_NO_CHANGE:
   2721             m_value.ident = CSSValueNoChange;
   2722             break;
   2723         case DB_RESET_SIZE:
   2724             m_value.ident = CSSValueResetSize;
   2725             break;
   2726         case DB_CENTRAL:
   2727             m_value.ident = CSSValueCentral;
   2728             break;
   2729         case DB_MIDDLE:
   2730             m_value.ident = CSSValueMiddle;
   2731             break;
   2732         case DB_TEXT_BEFORE_EDGE:
   2733             m_value.ident = CSSValueTextBeforeEdge;
   2734             break;
   2735         case DB_TEXT_AFTER_EDGE:
   2736             m_value.ident = CSSValueTextAfterEdge;
   2737             break;
   2738         case DB_IDEOGRAPHIC:
   2739             m_value.ident = CSSValueIdeographic;
   2740             break;
   2741         case DB_ALPHABETIC:
   2742             m_value.ident = CSSValueAlphabetic;
   2743             break;
   2744         case DB_HANGING:
   2745             m_value.ident = CSSValueHanging;
   2746             break;
   2747         case DB_MATHEMATICAL:
   2748             m_value.ident = CSSValueMathematical;
   2749             break;
   2750     }
   2751 }
   2752 
   2753 template<> inline CSSPrimitiveValue::operator EDominantBaseline() const
   2754 {
   2755     switch (m_value.ident) {
   2756         case CSSValueAuto:
   2757             return DB_AUTO;
   2758         case CSSValueUseScript:
   2759             return DB_USE_SCRIPT;
   2760         case CSSValueNoChange:
   2761             return DB_NO_CHANGE;
   2762         case CSSValueResetSize:
   2763             return DB_RESET_SIZE;
   2764         case CSSValueIdeographic:
   2765             return DB_IDEOGRAPHIC;
   2766         case CSSValueAlphabetic:
   2767             return DB_ALPHABETIC;
   2768         case CSSValueHanging:
   2769             return DB_HANGING;
   2770         case CSSValueMathematical:
   2771             return DB_MATHEMATICAL;
   2772         case CSSValueCentral:
   2773             return DB_CENTRAL;
   2774         case CSSValueMiddle:
   2775             return DB_MIDDLE;
   2776         case CSSValueTextAfterEdge:
   2777             return DB_TEXT_AFTER_EDGE;
   2778         case CSSValueTextBeforeEdge:
   2779             return DB_TEXT_BEFORE_EDGE;
   2780         default:
   2781             ASSERT_NOT_REACHED();
   2782             return DB_AUTO;
   2783     }
   2784 }
   2785 
   2786 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EImageRendering e)
   2787     : m_type(CSS_IDENT)
   2788     , m_hasCachedCSSText(false)
   2789 {
   2790     switch (e) {
   2791         case IR_AUTO:
   2792             m_value.ident = CSSValueAuto;
   2793             break;
   2794         case IR_OPTIMIZESPEED:
   2795             m_value.ident = CSSValueOptimizespeed;
   2796             break;
   2797         case IR_OPTIMIZEQUALITY:
   2798             m_value.ident = CSSValueOptimizequality;
   2799             break;
   2800     }
   2801 }
   2802 
   2803 template<> inline CSSPrimitiveValue::operator EImageRendering() const
   2804 {
   2805     switch (m_value.ident) {
   2806         case CSSValueAuto:
   2807             return IR_AUTO;
   2808         case CSSValueOptimizespeed:
   2809             return IR_OPTIMIZESPEED;
   2810         case CSSValueOptimizequality:
   2811             return IR_OPTIMIZEQUALITY;
   2812         default:
   2813             ASSERT_NOT_REACHED();
   2814             return IR_AUTO;
   2815     }
   2816 }
   2817 
   2818 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EShapeRendering e)
   2819     : m_type(CSS_IDENT)
   2820     , m_hasCachedCSSText(false)
   2821 {
   2822     switch (e) {
   2823         case IR_AUTO:
   2824             m_value.ident = CSSValueAuto;
   2825             break;
   2826         case IR_OPTIMIZESPEED:
   2827             m_value.ident = CSSValueOptimizespeed;
   2828             break;
   2829         case SR_CRISPEDGES:
   2830             m_value.ident = CSSValueCrispedges;
   2831             break;
   2832         case SR_GEOMETRICPRECISION:
   2833             m_value.ident = CSSValueGeometricprecision;
   2834             break;
   2835     }
   2836 }
   2837 
   2838 template<> inline CSSPrimitiveValue::operator EShapeRendering() const
   2839 {
   2840     switch (m_value.ident) {
   2841         case CSSValueAuto:
   2842             return SR_AUTO;
   2843         case CSSValueOptimizespeed:
   2844             return SR_OPTIMIZESPEED;
   2845         case CSSValueCrispedges:
   2846             return SR_CRISPEDGES;
   2847         case CSSValueGeometricprecision:
   2848             return SR_GEOMETRICPRECISION;
   2849         default:
   2850             ASSERT_NOT_REACHED();
   2851             return SR_AUTO;
   2852     }
   2853 }
   2854 
   2855 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAnchor e)
   2856     : m_type(CSS_IDENT)
   2857     , m_hasCachedCSSText(false)
   2858 {
   2859     switch (e) {
   2860         case TA_START:
   2861             m_value.ident = CSSValueStart;
   2862             break;
   2863         case TA_MIDDLE:
   2864             m_value.ident = CSSValueMiddle;
   2865             break;
   2866         case TA_END:
   2867             m_value.ident = CSSValueEnd;
   2868             break;
   2869     }
   2870 }
   2871 
   2872 template<> inline CSSPrimitiveValue::operator ETextAnchor() const
   2873 {
   2874     switch (m_value.ident) {
   2875         case CSSValueStart:
   2876             return TA_START;
   2877         case CSSValueMiddle:
   2878             return TA_MIDDLE;
   2879         case CSSValueEnd:
   2880             return TA_END;
   2881         default:
   2882             ASSERT_NOT_REACHED();
   2883             return TA_START;
   2884     }
   2885 }
   2886 
   2887 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(SVGWritingMode e)
   2888     : m_type(CSS_IDENT)
   2889     , m_hasCachedCSSText(false)
   2890 {
   2891     switch (e) {
   2892         case WM_LRTB:
   2893             m_value.ident = CSSValueLrTb;
   2894             break;
   2895         case WM_LR:
   2896             m_value.ident = CSSValueLr;
   2897             break;
   2898         case WM_RLTB:
   2899             m_value.ident = CSSValueRlTb;
   2900             break;
   2901         case WM_RL:
   2902             m_value.ident = CSSValueRl;
   2903             break;
   2904         case WM_TBRL:
   2905             m_value.ident = CSSValueTbRl;
   2906             break;
   2907         case WM_TB:
   2908             m_value.ident = CSSValueTb;
   2909             break;
   2910     }
   2911 }
   2912 
   2913 template<> inline CSSPrimitiveValue::operator SVGWritingMode() const
   2914 {
   2915     switch (m_value.ident) {
   2916     case CSSValueLrTb:
   2917         return WM_LRTB;
   2918     case CSSValueLr:
   2919         return WM_LR;
   2920     case CSSValueRlTb:
   2921         return WM_RLTB;
   2922     case CSSValueRl:
   2923         return WM_RL;
   2924     case CSSValueTbRl:
   2925         return WM_TBRL;
   2926     case CSSValueTb:
   2927         return WM_TB;
   2928     default:
   2929         ASSERT_NOT_REACHED();
   2930         return WM_LRTB;
   2931     }
   2932 }
   2933 
   2934 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EVectorEffect e)
   2935     : m_type(CSS_IDENT)
   2936     , m_hasCachedCSSText(false)
   2937 {
   2938     switch (e) {
   2939     case VE_NONE:
   2940         m_value.ident = CSSValueNone;
   2941         break;
   2942     case VE_NON_SCALING_STROKE:
   2943         m_value.ident = CSSValueNonScalingStroke;
   2944         break;
   2945     }
   2946 }
   2947 
   2948 template<> inline CSSPrimitiveValue::operator EVectorEffect() const
   2949 {
   2950     switch (m_value.ident) {
   2951     case CSSValueNone:
   2952         return VE_NONE;
   2953     case CSSValueNonScalingStroke:
   2954         return VE_NON_SCALING_STROKE;
   2955     default:
   2956         ASSERT_NOT_REACHED();
   2957         return VE_NONE;
   2958     }
   2959 }
   2960 
   2961 #endif
   2962 
   2963 }
   2964 
   2965 #endif
   2966