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