cc6567687d582ccd94eb94ea124ce0f43a2a174f
[WebKit-https.git] / WebCore / rendering / RenderStyle.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
5  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2000 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2003, 2005, 2006 Apple Computer, Inc.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25
26 #ifndef RENDERSTYLE_H
27 #define RENDERSTYLE_H
28
29 /*
30  * WARNING:
31  * --------
32  *
33  * The order of the values in the enums have to agree with the order specified
34  * in CSSValueKeywords.in, otherwise some optimizations in the parser will fail,
35  * and produce invaliud results.
36  */
37
38 #include "CSSPrimitiveValue.h"
39 #include "CSSValueList.h"
40 #include "Color.h"
41 #include "CSSCursorImageValue.h"
42 #include "DataRef.h"
43 #include "Font.h"
44 #include "GraphicsTypes.h"
45 #include "IntRect.h"
46 #include "Length.h"
47 #include "Pair.h"
48 #include "Shared.h"
49 #include "TextDirection.h"
50 #include <wtf/Vector.h>
51
52 #ifdef SVG_SUPPORT
53 #include "SVGRenderStyle.h"
54 #endif
55
56 template<typename T, typename U> inline bool compareEqual(const T& t, const U& u) { return t == static_cast<T>(u); }
57
58 #define SET_VAR(group, variable, value) \
59     if (!compareEqual(group->variable, value)) \
60         group.access()->variable = value;
61
62 namespace WebCore {
63
64 using std::max;
65
66 class CachedImage;
67 class CachedResource;
68 class CSSStyleSelector;
69 class CSSValueList;
70 struct CursorData;
71 class CursorList;
72 class Pair;
73 class RenderArena;
74 class ShadowValue;
75 class StringImpl;
76
77 enum PseudoState { PseudoUnknown, PseudoNone, PseudoAnyLink, PseudoLink, PseudoVisited};
78
79 //------------------------------------------------
80
81 //------------------------------------------------
82 // Box model attributes. Not inherited.
83
84 struct LengthBox {
85     LengthBox() { }
86     LengthBox(LengthType t)
87         : left(t), right(t), top(t), bottom(t) { }
88
89     Length left;
90     Length right;
91     Length top;
92     Length bottom;
93
94     LengthBox& operator=(const Length& len)
95     {
96         left = len;
97         right = len;
98         top = len;
99         bottom = len;
100         return *this;
101     }
102
103     bool operator==(const LengthBox& o) const
104     {
105         return left == o.left && right == o.right && top == o.top && bottom == o.bottom;
106     }
107
108
109     bool nonZero() const { return left.value() || right.value() || top.value() || bottom.value(); }
110 };
111
112 enum EPosition {
113     StaticPosition, RelativePosition, AbsolutePosition, FixedPosition
114 };
115
116 enum EFloat {
117     FNONE = 0, FLEFT, FRIGHT
118 };
119
120 //------------------------------------------------
121 // Border attributes. Not inherited.
122
123 // These have been defined in the order of their precedence for border-collapsing. Do
124 // not change this order!
125 enum EBorderStyle {
126     BNONE, BHIDDEN, INSET, GROOVE, RIDGE, OUTSET, DOTTED, DASHED, SOLID, DOUBLE
127 };
128
129 class BorderValue
130 {
131 public:
132     BorderValue() {
133         width = 3; // medium is default value
134         m_style = BNONE;
135     }
136
137     Color color;
138     unsigned width : 12;
139     unsigned m_style : 4; // EBorderStyle 
140
141     EBorderStyle style() const { return static_cast<EBorderStyle>(m_style); }
142     
143     bool nonZero(bool checkStyle = true) const {
144         return width != 0 && (!checkStyle || m_style != BNONE);
145     }
146
147     bool isTransparent() const {
148         return color.isValid() && color.alpha() == 0;
149     }
150
151     bool isVisible(bool checkStyle = true) const {
152         return nonZero(checkStyle) && !isTransparent() && (!checkStyle || m_style != BHIDDEN);
153     }
154
155     bool operator==(const BorderValue& o) const
156     {
157         return width == o.width && m_style == o.m_style && color == o.color;
158     }
159
160     bool operator!=(const BorderValue& o) const
161     {
162         return !(*this == o);
163     }
164 };
165
166 class OutlineValue : public BorderValue
167 {
168 public:
169     OutlineValue()
170     {
171         _offset = 0;
172         _auto = false;
173     }
174     
175     bool operator==(const OutlineValue& o) const
176     {
177         return width == o.width && m_style == o.m_style && color == o.color && _offset == o._offset && _auto == o._auto;
178     }
179     
180     bool operator!=(const OutlineValue& o) const
181     {
182         return !(*this == o);
183     }
184     
185     int _offset;
186     bool _auto;
187 };
188
189 enum EBorderPrecedence { BOFF, BTABLE, BCOLGROUP, BCOL, BROWGROUP, BROW, BCELL };
190
191 struct CollapsedBorderValue
192 {
193     CollapsedBorderValue() :border(0), precedence(BOFF) {}
194     CollapsedBorderValue(const BorderValue* b, EBorderPrecedence p) :border(b), precedence(p) {}
195     
196     int width() const { return border && border->nonZero() ? border->width : 0; }
197     EBorderStyle style() const { return border ? border->style() : BHIDDEN; }
198     bool exists() const { return border; }
199     Color color() const { return border ? border->color : Color(); }
200     bool isTransparent() const { return border ? border->isTransparent() : true; }
201     
202     bool operator==(const CollapsedBorderValue& o) const
203     {
204         if (!border) return !o.border;
205         if (!o.border) return false;
206         return *border == *o.border && precedence == o.precedence;
207     }
208     
209     const BorderValue* border;
210     EBorderPrecedence precedence;    
211 };
212
213 enum EBorderImageRule {
214     BI_STRETCH, BI_ROUND, BI_REPEAT
215 };
216
217 class BorderImage
218 {
219 public:
220     BorderImage() :m_image(0), m_horizontalRule(BI_STRETCH), m_verticalRule(BI_STRETCH) {}
221     BorderImage(CachedImage* image, LengthBox slices, EBorderImageRule h, EBorderImageRule v) 
222       :m_image(image), m_slices(slices), m_horizontalRule(h), m_verticalRule(v) {}
223
224     bool operator==(const BorderImage& o) const
225     {
226         return m_image == o.m_image && m_slices == o.m_slices && m_horizontalRule == o.m_horizontalRule &&
227                m_verticalRule == o.m_verticalRule;
228     }
229
230     bool hasImage() const { return m_image != 0; }
231     CachedImage* image() const { return m_image; }
232     
233     EBorderImageRule horizontalRule() const { return static_cast<EBorderImageRule>(m_horizontalRule); }
234     EBorderImageRule verticalRule() const { return static_cast<EBorderImageRule>(m_verticalRule); }
235     
236     CachedImage* m_image;
237     LengthBox m_slices;
238     unsigned m_horizontalRule : 2; // EBorderImageRule
239     unsigned m_verticalRule : 2; // EBorderImageRule
240 };
241
242 class BorderData
243 {
244 public:
245     BorderValue left;
246     BorderValue right;
247     BorderValue top;
248     BorderValue bottom;
249     
250     BorderImage image;
251
252     IntSize topLeft;
253     IntSize topRight;
254     IntSize bottomLeft;
255     IntSize bottomRight;
256
257     bool hasBorder() const
258     {
259         bool haveImage = image.hasImage();
260         return left.nonZero(!haveImage) || right.nonZero(!haveImage) || top.nonZero(!haveImage) || bottom.nonZero(!haveImage);
261     }
262
263     bool hasBorderRadius() const {
264         if (topLeft.width() > 0)
265             return true;
266         if (topRight.width() > 0)
267             return true;
268         if (bottomLeft.width() > 0)
269             return true;
270         if (bottomRight.width() > 0)
271             return true;
272         return false;
273     }
274     
275     unsigned short borderLeftWidth() const {
276         if (!image.hasImage() && (left.style() == BNONE || left.style() == BHIDDEN))
277             return 0; 
278         return left.width;
279     }
280     
281     unsigned short borderRightWidth() const {
282         if (!image.hasImage() && (right.style() == BNONE || right.style() == BHIDDEN))
283             return 0;
284         return right.width;
285     }
286     
287     unsigned short borderTopWidth() const {
288         if (!image.hasImage() && (top.style() == BNONE || top.style() == BHIDDEN))
289             return 0;
290         return top.width;
291     }
292     
293     unsigned short borderBottomWidth() const {
294         if (!image.hasImage() && (bottom.style() == BNONE || bottom.style() == BHIDDEN))
295             return 0;
296         return bottom.width;
297     }
298     
299     bool operator==(const BorderData& o) const
300     {
301         return left == o.left && right == o.right && top == o.top && bottom == o.bottom && image == o.image &&
302                topLeft == o.topLeft && topRight == o.topRight && bottomLeft == o.bottomLeft && bottomRight == o.bottomRight;
303     }
304     
305     bool operator!=(const BorderData& o) const {
306         return !(*this == o);
307     }
308 };
309
310 enum EMarginCollapse { MCOLLAPSE, MSEPARATE, MDISCARD };
311
312 class StyleSurroundData : public Shared<StyleSurroundData>
313 {
314 public:
315     StyleSurroundData();
316     StyleSurroundData(const StyleSurroundData& o);
317     
318     bool operator==(const StyleSurroundData& o) const;
319     bool operator!=(const StyleSurroundData& o) const {
320         return !(*this == o);
321     }
322
323     LengthBox offset;
324     LengthBox margin;
325     LengthBox padding;
326     BorderData border;
327 };
328
329
330 //------------------------------------------------
331 // Box attributes. Not inherited.
332
333 enum EBoxSizing { CONTENT_BOX, BORDER_BOX };
334
335 class StyleBoxData : public Shared<StyleBoxData>
336 {
337 public:
338     StyleBoxData();
339     StyleBoxData(const StyleBoxData& o);
340
341     // copy and assignment
342 //    StyleBoxData(const StyleBoxData &other);
343 //    const StyleBoxData &operator = (const StyleBoxData &other);
344
345     bool operator==(const StyleBoxData& o) const;
346     bool operator!=(const StyleBoxData& o) const {
347         return !(*this == o);
348     }
349
350     Length width;
351     Length height;
352
353     Length min_width;
354     Length max_width;
355
356     Length min_height;
357     Length max_height;
358
359     Length vertical_align;
360
361     int z_index;
362     bool z_auto : 1;
363     unsigned boxSizing : 1; // EBoxSizing
364 };
365
366 //------------------------------------------------
367 // Dashboard region attributes. Not inherited.
368
369 struct StyleDashboardRegion
370 {
371     String label;
372     LengthBox offset;
373     int type;
374     
375     enum {
376         None,
377         Circle,
378         Rectangle
379     };
380
381     bool operator==(const StyleDashboardRegion& o) const
382     {
383         return type == o.type && offset == o.offset && label == o.label;
384     }
385 };
386
387 //------------------------------------------------
388 // Random visual rendering model attributes. Not inherited.
389
390 enum EOverflow {
391     OVISIBLE, OHIDDEN, OSCROLL, OAUTO, OOVERLAY, OMARQUEE
392 };
393
394 enum EVerticalAlign {
395     BASELINE, MIDDLE, SUB, SUPER, TEXT_TOP,
396     TEXT_BOTTOM, TOP, BOTTOM, BASELINE_MIDDLE, LENGTH
397 };
398
399 enum EClear{
400     CNONE = 0, CLEFT = 1, CRIGHT = 2, CBOTH = 3
401 };
402
403 enum ETableLayout {
404     TAUTO, TFIXED
405 };
406
407 enum EUnicodeBidi {
408     UBNormal, Embed, Override
409 };
410
411 class StyleVisualData : public Shared<StyleVisualData>
412 {
413 public:
414     StyleVisualData();
415     ~StyleVisualData();
416     StyleVisualData(const StyleVisualData& o );
417
418     bool operator==( const StyleVisualData &o ) const {
419         return ( clip == o.clip &&
420                  hasClip == o.hasClip &&
421                  colspan == o.colspan &&
422                  counterIncrement == o.counterIncrement &&
423                  counterReset == o.counterReset &&
424                  textDecoration == o.textDecoration);
425     }
426     bool operator!=( const StyleVisualData &o ) const {
427         return !(*this == o);
428     }
429
430     LengthBox clip;
431     bool hasClip : 1;
432     unsigned textDecoration : 4; // Text decorations defined *only* by this element.
433     
434     short colspan; // for html, not a css2 attribute
435
436     short counterIncrement; // ok, so these are not visual mode specific
437     short counterReset;     // can't go to inherited, since these are not inherited
438
439 };
440
441 //------------------------------------------------
442 enum EBackgroundBox {
443     BGBORDER, BGPADDING, BGCONTENT
444 };
445
446 enum EBackgroundRepeat {
447     REPEAT, REPEAT_X, REPEAT_Y, NO_REPEAT
448 };
449
450 struct LengthSize {
451     Length width;
452     Length height;
453 };
454
455 struct BackgroundLayer {
456 public:
457     BackgroundLayer();
458     ~BackgroundLayer();
459
460     CachedImage* backgroundImage() const { return m_image; }
461     Length backgroundXPosition() const { return m_xPosition; }
462     Length backgroundYPosition() const { return m_yPosition; }
463     bool backgroundAttachment() const { return m_bgAttachment; }
464     EBackgroundBox backgroundClip() const { return static_cast<EBackgroundBox>(m_bgClip); }
465     EBackgroundBox backgroundOrigin() const { return static_cast<EBackgroundBox>(m_bgOrigin); }
466     EBackgroundRepeat backgroundRepeat() const { return static_cast<EBackgroundRepeat>(m_bgRepeat); }
467     CompositeOperator backgroundComposite() const { return static_cast<CompositeOperator>(m_bgComposite); }
468     LengthSize backgroundSize() const { return m_backgroundSize; }
469
470     BackgroundLayer* next() const { return m_next; }
471     BackgroundLayer* next() { return m_next; }
472
473     bool isBackgroundImageSet() const { return m_imageSet; }
474     bool isBackgroundXPositionSet() const { return m_xPosSet; }
475     bool isBackgroundYPositionSet() const { return m_yPosSet; }
476     bool isBackgroundAttachmentSet() const { return m_attachmentSet; }
477     bool isBackgroundClipSet() const { return m_clipSet; }
478     bool isBackgroundOriginSet() const { return m_originSet; }
479     bool isBackgroundRepeatSet() const { return m_repeatSet; }
480     bool isBackgroundCompositeSet() const { return m_compositeSet; }
481     bool isBackgroundSizeSet() const { return m_backgroundSizeSet; }
482     
483     void setBackgroundImage(CachedImage* i) { m_image = i; m_imageSet = true; }
484     void setBackgroundXPosition(const Length& l) { m_xPosition = l; m_xPosSet = true; }
485     void setBackgroundYPosition(const Length& l) { m_yPosition = l; m_yPosSet = true; }
486     void setBackgroundAttachment(bool b) { m_bgAttachment = b; m_attachmentSet = true; }
487     void setBackgroundClip(EBackgroundBox b) { m_bgClip = b; m_clipSet = true; }
488     void setBackgroundOrigin(EBackgroundBox b) { m_bgOrigin = b; m_originSet = true; }
489     void setBackgroundRepeat(EBackgroundRepeat r) { m_bgRepeat = r; m_repeatSet = true; }
490     void setBackgroundComposite(CompositeOperator c) { m_bgComposite = c; m_compositeSet = true; }
491     void setBackgroundSize(const LengthSize& b) { m_backgroundSize = b; m_backgroundSizeSet = true; }
492     
493     void clearBackgroundImage() { m_imageSet = false; }
494     void clearBackgroundXPosition() { m_xPosSet = false; }
495     void clearBackgroundYPosition() { m_yPosSet = false; }
496     void clearBackgroundAttachment() { m_attachmentSet = false; }
497     void clearBackgroundClip() { m_clipSet = false; }
498     void clearBackgroundOrigin() { m_originSet = false; }
499     void clearBackgroundRepeat() { m_repeatSet = false; }
500     void clearBackgroundComposite() { m_compositeSet = false; }
501     void clearBackgroundSize() { m_backgroundSizeSet = false; }
502
503     void setNext(BackgroundLayer* n) { if (m_next != n) { delete m_next; m_next = n; } }
504
505     BackgroundLayer& operator=(const BackgroundLayer& o);    
506     BackgroundLayer(const BackgroundLayer& o);
507
508     bool operator==(const BackgroundLayer& o) const;
509     bool operator!=(const BackgroundLayer& o) const {
510         return !(*this == o);
511     }
512
513     bool containsImage(CachedImage* c) const { if (c == m_image) return true; if (m_next) return m_next->containsImage(c); return false; }
514     
515     bool hasImage() const {
516         if (m_image)
517             return true;
518         return m_next ? m_next->hasImage() : false;
519     }
520     bool hasFixedImage() const {
521         if (m_image && !m_bgAttachment)
522             return true;
523         return m_next ? m_next->hasFixedImage() : false;
524     }
525
526     void fillUnsetProperties();
527     void cullEmptyLayers();
528
529     CachedImage* m_image;
530
531     Length m_xPosition;
532     Length m_yPosition;
533
534     bool m_bgAttachment : 1;
535     unsigned m_bgClip : 2; // EBackgroundBox
536     unsigned m_bgOrigin : 2; // EBackgroundBox
537     unsigned m_bgRepeat : 2; // EBackgroundRepeat
538     unsigned m_bgComposite : 2; // CompositeOperator
539
540     LengthSize m_backgroundSize;
541
542     bool m_imageSet : 1;
543     bool m_attachmentSet : 1;
544     bool m_clipSet : 1;
545     bool m_originSet : 1;
546     bool m_repeatSet : 1;
547     bool m_xPosSet : 1;
548     bool m_yPosSet : 1;
549     bool m_compositeSet : 1;
550     bool m_backgroundSizeSet : 1;
551
552     BackgroundLayer* m_next;
553 };
554
555 class StyleBackgroundData : public Shared<StyleBackgroundData>
556 {
557 public:
558     StyleBackgroundData();
559     ~StyleBackgroundData() {}
560     StyleBackgroundData(const StyleBackgroundData& o );
561
562     bool operator==(const StyleBackgroundData& o) const;
563     bool operator!=(const StyleBackgroundData &o) const {
564         return !(*this == o);
565     }
566
567     BackgroundLayer m_background;
568     Color m_color;
569     OutlineValue m_outline;
570 };
571
572 //------------------------------------------------
573 // CSS3 Marquee Properties
574
575 enum EMarqueeBehavior { MNONE, MSCROLL, MSLIDE, MALTERNATE, MUNFURL };
576 enum EMarqueeDirection { MAUTO = 0, MLEFT = 1, MRIGHT = -1, MUP = 2, MDOWN = -2, MFORWARD = 3, MBACKWARD = -3 };
577
578 class StyleMarqueeData : public Shared<StyleMarqueeData>
579 {
580 public:
581     StyleMarqueeData();
582     StyleMarqueeData(const StyleMarqueeData& o);
583     
584     bool operator==(const StyleMarqueeData& o) const;
585     bool operator!=(const StyleMarqueeData& o) const {
586         return !(*this == o);
587     }
588     
589     Length increment;
590     int speed;
591     
592     int loops; // -1 means infinite.
593     
594     unsigned behavior : 3; // EMarqueeBehavior 
595     EMarqueeDirection direction : 3; // not unsigned because EMarqueeDirection has negative values
596 };
597     
598 //------------------------------------------------
599 // CSS3 Flexible Box Properties
600
601 enum EBoxAlignment { BSTRETCH, BSTART, BCENTER, BEND, BJUSTIFY, BBASELINE };
602 enum EBoxOrient { HORIZONTAL, VERTICAL };
603 enum EBoxLines { SINGLE, MULTIPLE };
604 enum EBoxDirection { BNORMAL, BREVERSE };
605
606 class StyleFlexibleBoxData : public Shared<StyleFlexibleBoxData>
607 {
608 public:
609     StyleFlexibleBoxData();
610     StyleFlexibleBoxData(const StyleFlexibleBoxData& o);
611
612     bool operator==(const StyleFlexibleBoxData& o) const;
613     bool operator!=(const StyleFlexibleBoxData &o) const {
614         return !(*this == o);
615     }
616
617     float flex;
618     unsigned int flex_group;
619     unsigned int ordinal_group;
620
621     unsigned align : 3; // EBoxAlignment
622     unsigned pack: 3; // EBoxAlignment
623     unsigned orient: 1; // EBoxOrient
624     unsigned lines : 1; // EBoxLines
625 };
626
627 // This struct holds information about shadows for the text-shadow and box-shadow properties.
628 struct ShadowData {
629     ShadowData(int _x, int _y, int _blur, const Color& _color)
630     :x(_x), y(_y), blur(_blur), color(_color), next(0) {}
631     ShadowData(const ShadowData& o);
632     
633     ~ShadowData() { delete next; }
634
635     bool operator==(const ShadowData& o) const;
636     bool operator!=(const ShadowData &o) const {
637         return !(*this == o);
638     }
639     
640     int x;
641     int y;
642     int blur;
643     Color color;
644     ShadowData* next;
645 };
646
647 #ifdef XBL_SUPPORT
648 struct BindingURI {
649     BindingURI(StringImpl*);
650     ~BindingURI();
651
652     BindingURI* copy();
653
654     bool operator==(const BindingURI& o) const;
655     bool operator!=(const BindingURI& o) const {
656         return !(*this == o);
657     }
658     
659     BindingURI* next() { return m_next; }
660     void setNext(BindingURI* n) { m_next = n; }
661     
662     StringImpl* uri() { return m_uri; }
663     
664     BindingURI* m_next;
665     StringImpl* m_uri;
666 };
667 #endif
668
669 //------------------------------------------------
670
671 enum ETextSecurity {
672     TSNONE, TSDISC, TSCIRCLE, TSSQUARE
673 };
674
675 // CSS3 User Modify Properties
676
677 enum EUserModify {
678     READ_ONLY, READ_WRITE, READ_WRITE_PLAINTEXT_ONLY
679 };
680
681 // CSS3 User Drag Values
682
683 enum EUserDrag {
684     DRAG_AUTO, DRAG_NONE, DRAG_ELEMENT
685 };
686
687 // CSS3 User Select Values
688
689 enum EUserSelect {
690     SELECT_AUTO, SELECT_NONE, SELECT_TEXT, SELECT_IGNORE
691 };
692
693 // Word Break Values. Matches WinIE, rather than CSS3
694
695 enum EWordWrap {
696     WBNORMAL, BREAK_WORD
697 };
698
699 enum ENBSPMode {
700     NBNORMAL, SPACE
701 };
702
703 enum EKHTMLLineBreak {
704     LBNORMAL, AFTER_WHITE_SPACE
705 };
706
707 enum EMatchNearestMailBlockquoteColor {
708     BCNORMAL, MATCH
709 };
710
711 enum EResize {
712     RESIZE_NONE, RESIZE_BOTH, RESIZE_HORIZONTAL, RESIZE_VERTICAL
713 };
714
715 enum EAppearance {
716     NoAppearance, CheckboxAppearance, RadioAppearance, PushButtonAppearance, SquareButtonAppearance, ButtonAppearance,
717     ButtonBevelAppearance, ListboxAppearance, ListItemAppearance, MenulistAppearance,
718     MenulistButtonAppearance, MenulistTextAppearance, MenulistTextFieldAppearance,
719     ScrollbarButtonUpAppearance, ScrollbarButtonDownAppearance, 
720     ScrollbarButtonLeftAppearance, ScrollbarButtonRightAppearance,
721     ScrollbarTrackHorizontalAppearance, ScrollbarTrackVerticalAppearance,
722     ScrollbarThumbHorizontalAppearance, ScrollbarThumbVerticalAppearance,
723     ScrollbarGripperHorizontalAppearance, ScrollbarGripperVerticalAppearance,
724     SliderHorizontalAppearance, SliderVerticalAppearance, SliderThumbHorizontalAppearance,
725     SliderThumbVerticalAppearance, CaretAppearance, SearchFieldAppearance, SearchFieldResultsAppearance,
726     SearchFieldCloseAppearance, TextFieldAppearance, TextAreaAppearance
727 };
728
729 // This struct is for rarely used non-inherited CSS3 properties.  By grouping them together,
730 // we save space, and only allocate this object when someone actually uses
731 // a non-inherited CSS3 property.
732 class StyleCSS3NonInheritedData : public Shared<StyleCSS3NonInheritedData>
733 {
734 public:
735     StyleCSS3NonInheritedData();
736     ~StyleCSS3NonInheritedData();
737     StyleCSS3NonInheritedData(const StyleCSS3NonInheritedData& o);
738
739 #ifdef XBL_SUPPORT
740     bool bindingsEquivalent(const StyleCSS3NonInheritedData& o) const;
741 #endif
742
743     bool operator==(const StyleCSS3NonInheritedData& o) const;
744     bool operator!=(const StyleCSS3NonInheritedData &o) const {
745         return !(*this == o);
746     }
747     
748     int lineClamp;         // An Apple extension.  Not really CSS3 but not worth making a new struct over.
749     Vector<StyleDashboardRegion> m_dashboardRegions;
750     float opacity;         // Whether or not we're transparent.
751     DataRef<StyleFlexibleBoxData> flexibleBox; // Flexible box properties 
752     DataRef<StyleMarqueeData> marquee; // Marquee properties
753     unsigned userDrag : 2; // EUserDrag
754     unsigned userSelect : 2;  // EUserSelect
755     bool textOverflow : 1; // Whether or not lines that spill out should be truncated with "..."
756     unsigned marginTopCollapse : 2; // EMarginCollapse
757     unsigned marginBottomCollapse : 2; // EMarginCollapse
758     unsigned matchNearestMailBlockquoteColor : 1; // EMatchNearestMailBlockquoteColor
759
760     unsigned m_appearance : 6; // EAppearance
761
762 #ifdef XBL_SUPPORT
763     BindingURI* bindingURI; // The XBL binding URI list.
764 #endif
765 };
766
767 // This struct is for rarely used inherited CSS3 properties.  By grouping them together,
768 // we save space, and only allocate this object when someone actually uses
769 // an inherited CSS3 property.
770 class StyleCSS3InheritedData : public Shared<StyleCSS3InheritedData>
771 {
772 public:
773     StyleCSS3InheritedData();
774     ~StyleCSS3InheritedData();
775     StyleCSS3InheritedData(const StyleCSS3InheritedData& o);
776
777     bool operator==(const StyleCSS3InheritedData& o) const;
778     bool operator!=(const StyleCSS3InheritedData &o) const {
779         return !(*this == o);
780     }
781     bool shadowDataEquivalent(const StyleCSS3InheritedData& o) const;
782
783     ShadowData* textShadow;  // Our text shadow information for shadowed text drawing.
784     AtomicString highlight; // Apple-specific extension for custom highlight rendering.
785     unsigned textSecurity : 2; // ETextSecurity
786     unsigned userModify : 2; // EUserModify  (editing)
787     unsigned wordWrap : 1; // EWordWrap 
788     unsigned nbspMode : 1; // ENBSPMode
789     unsigned khtmlLineBreak : 1; // EKHTMLLineBreak
790     bool textSizeAdjust : 1;    // An Apple extension.  Not really CSS3 but not worth making a new struct over.
791     unsigned resize : 2; // EResize
792     
793 private:
794     StyleCSS3InheritedData &operator=(const StyleCSS3InheritedData &);
795 };
796
797 //------------------------------------------------
798 // Inherited attributes.
799 //
800
801 enum EWhiteSpace {
802     NORMAL, PRE, PRE_WRAP, PRE_LINE, NOWRAP, KHTML_NOWRAP
803 };
804
805 enum ETextAlign {
806     TAAUTO, LEFT, RIGHT, CENTER, JUSTIFY, KHTML_LEFT, KHTML_RIGHT, KHTML_CENTER
807 };
808
809 enum ETextTransform {
810     CAPITALIZE, UPPERCASE, LOWERCASE, TTNONE
811 };
812
813 enum ETextDecoration {
814     TDNONE = 0x0 , UNDERLINE = 0x1, OVERLINE = 0x2, LINE_THROUGH= 0x4, BLINK = 0x8
815 };
816
817 enum EPageBreak {
818     PBAUTO, PBALWAYS, PBAVOID
819 };
820
821 class StyleInheritedData : public Shared<StyleInheritedData>
822 {
823 public:
824     StyleInheritedData();
825     ~StyleInheritedData();
826     StyleInheritedData(const StyleInheritedData& o );
827
828     bool operator==(const StyleInheritedData& o) const;
829     bool operator != ( const StyleInheritedData &o ) const {
830         return !(*this == o);
831     }
832
833     Length indent;
834     // could be packed in a short but doesn't
835     // make a difference currently because of padding
836     Length line_height;
837
838     CachedImage *style_image;
839     RefPtr<CursorList> cursorData;
840
841     Font font;
842     Color color;
843     
844     short horizontal_border_spacing;
845     short vertical_border_spacing;
846     
847     // Paged media properties.
848     short widows;
849     short orphans;
850     unsigned page_break_inside : 2; // EPageBreak
851 };
852
853
854 enum EEmptyCell {
855     SHOW, HIDE
856 };
857
858 enum ECaptionSide
859 {
860     CAPTOP, CAPBOTTOM, CAPLEFT, CAPRIGHT
861 };
862
863
864 enum EListStyleType {
865      DISC, CIRCLE, SQUARE, LDECIMAL, DECIMAL_LEADING_ZERO,
866      LOWER_ROMAN, UPPER_ROMAN, LOWER_GREEK,
867      LOWER_ALPHA, LOWER_LATIN, UPPER_ALPHA, UPPER_LATIN,
868      HEBREW, ARMENIAN, GEORGIAN, CJK_IDEOGRAPHIC,
869      HIRAGANA, KATAKANA, HIRAGANA_IROHA, KATAKANA_IROHA, LNONE
870 };
871
872 enum EListStylePosition { OUTSIDE, INSIDE };
873
874 enum EVisibility { VISIBLE, HIDDEN, COLLAPSE };
875
876 enum ECursor {
877     CURSOR_AUTO, CURSOR_CROSS, CURSOR_DEFAULT, CURSOR_POINTER, CURSOR_MOVE,
878     CURSOR_E_RESIZE, CURSOR_NE_RESIZE, CURSOR_NW_RESIZE, CURSOR_N_RESIZE, CURSOR_SE_RESIZE, CURSOR_SW_RESIZE,
879     CURSOR_S_RESIZE, CURSOR_W_RESIZE, CURSOR_EW_RESIZE, CURSOR_NS_RESIZE, CURSOR_NESW_RESIZE, CURSOR_NWSE_RESIZE,
880     CURSOR_COL_RESIZE, CURSOR_ROW_RESIZE, CURSOR_TEXT, CURSOR_WAIT, CURSOR_HELP, CURSOR_ALL_SCROLL
881 };
882
883 struct CursorData {
884     CursorData()
885         : cursorImage(0)
886     {}
887     
888     IntPoint hotSpot; // for CSS3 support
889     CachedImage* cursorImage; // weak pointer, the CSSValueImage takes care of deleting cursorImage
890     String cursorFragmentId; // only used for SVGCursorElement, a direct pointer would get stale
891 };
892
893 class CursorList : public Shared<CursorList> {
894 public:
895     const CursorData& operator[](int i) const {
896         return m_vector[i];
897     }
898
899     size_t size() const { return m_vector.size(); }
900     void append(const CursorData& cursorData) { m_vector.append(cursorData); }
901
902 private:
903     Vector<CursorData> m_vector;
904 };
905
906 enum ContentType {
907     CONTENT_NONE, CONTENT_OBJECT, CONTENT_TEXT, CONTENT_COUNTER
908 };
909
910 class CounterData {
911     
912 public:
913     CounterData() {}
914     CounterData(const String& i, EListStyleType l, const String& s)
915         : m_identifier(i), m_listStyle(l), m_separator(s) {}
916     
917     String identifier() { return m_identifier; }
918     EListStyleType listStyle() { return m_listStyle; }
919     String separator() { return m_separator; }
920
921 private:
922     String m_identifier;
923     EListStyleType m_listStyle;
924     String m_separator;
925 };
926
927 struct ContentData {
928     ContentData() :_contentType(CONTENT_NONE), _nextContent(0) {}
929     ~ContentData();
930     void clearContent();
931
932     ContentType contentType() { return _contentType; }
933
934     StringImpl* contentText() { if (contentType() == CONTENT_TEXT) return _content.text; return 0; }
935     CachedResource* contentObject() { if (contentType() == CONTENT_OBJECT) return _content.object; return 0; }
936     CounterData* contentCounter() { if (contentType() == CONTENT_COUNTER) return _content.counter; return 0; }
937     
938     ContentType _contentType;
939
940     union {
941         CachedResource* object;
942         StringImpl* text;
943         CounterData* counter;
944     } _content ;
945
946     ContentData* _nextContent;
947 };
948
949 //------------------------------------------------
950
951 enum EDisplay {
952     INLINE, BLOCK, LIST_ITEM, RUN_IN, COMPACT, INLINE_BLOCK,
953     TABLE, INLINE_TABLE, TABLE_ROW_GROUP,
954     TABLE_HEADER_GROUP, TABLE_FOOTER_GROUP, TABLE_ROW,
955     TABLE_COLUMN_GROUP, TABLE_COLUMN, TABLE_CELL,
956     TABLE_CAPTION, BOX, INLINE_BOX, NONE
957 };
958
959 class RenderStyle
960 {
961     friend class CSSStyleSelector;
962
963 public:
964     // static pseudo styles. Dynamic ones are produced on the fly.
965     enum PseudoId { NOPSEUDO, FIRST_LINE, FIRST_LETTER, BEFORE, AFTER, SELECTION, FIRST_LINE_INHERITED, FILE_UPLOAD_BUTTON };
966
967     void ref() { m_ref++;  }
968     void deref(RenderArena* arena) { 
969         if (m_ref) m_ref--; 
970         if (!m_ref)
971             arenaDelete(arena);
972     }
973     bool hasOneRef() { return m_ref==1; }
974     int refCount() const { return m_ref; }
975     
976     // Overloaded new operator.  Derived classes must override operator new
977     // in order to allocate out of the RenderArena.
978     void* operator new(size_t sz, RenderArena* renderArena) throw();    
979     
980     // Overridden to prevent the normal delete from being called.
981     void operator delete(void* ptr, size_t sz);
982     
983 private:
984     void arenaDelete(RenderArena *arena);
985
986 protected:
987
988 // !START SYNC!: Keep this in sync with the copy constructor in RenderStyle.cpp
989
990     // inherit
991     struct InheritedFlags {
992         bool operator==( const InheritedFlags &other ) const {
993             return (_empty_cells == other._empty_cells) &&
994                    (_caption_side == other._caption_side) &&
995                    (_list_style_type == other._list_style_type) &&
996                    (_list_style_position == other._list_style_position) &&
997                    (_visibility == other._visibility) &&
998                    (_text_align == other._text_align) &&
999                    (_text_transform == other._text_transform) &&
1000                    (_text_decorations == other._text_decorations) &&
1001                    (_text_transform == other._text_transform) &&
1002                    (_cursor_style == other._cursor_style) &&
1003                    (_direction == other._direction) &&
1004                    (_border_collapse == other._border_collapse) &&
1005                    (_white_space == other._white_space) &&
1006                    (_box_direction == other._box_direction) &&
1007                    (_visuallyOrdered == other._visuallyOrdered) &&
1008                    (_htmlHacks == other._htmlHacks) &&
1009                    (_force_backgrounds_to_white == other._force_backgrounds_to_white);
1010         }
1011         
1012         bool operator!=( const InheritedFlags &other ) const {
1013             return !(*this == other);
1014         }
1015
1016         unsigned _empty_cells : 1; // EEmptyCell 
1017         unsigned _caption_side : 2; // ECaptionSide
1018         unsigned _list_style_type : 5 ; // EListStyleType
1019         unsigned _list_style_position : 1; // EListStylePosition
1020         unsigned _visibility : 2; // EVisibility
1021         unsigned _text_align : 4; // ETextAlign
1022         unsigned _text_transform : 2; // ETextTransform
1023         unsigned _text_decorations : 4;
1024         unsigned _cursor_style : 5; // ECursor
1025         unsigned _direction : 1; // TextDirection
1026         bool _border_collapse : 1 ;
1027         unsigned _white_space : 3; // EWhiteSpace
1028         unsigned _box_direction : 1; // EBoxDirection (CSS3 box_direction property, flexible box layout module)
1029         
1030         // non CSS2 inherited
1031         bool _visuallyOrdered : 1;
1032         bool _htmlHacks :1;
1033         bool _force_backgrounds_to_white : 1;
1034     } inherited_flags;
1035
1036 // don't inherit
1037     struct NonInheritedFlags {
1038         bool operator==( const NonInheritedFlags &other ) const {
1039             return (_effectiveDisplay == other._effectiveDisplay) &&
1040             (_originalDisplay == other._originalDisplay) &&
1041             (_bg_repeat == other._bg_repeat) &&
1042             (_overflowX == other._overflowX) &&
1043             (_overflowY == other._overflowY) &&
1044             (_vertical_align == other._vertical_align) &&
1045             (_clear == other._clear) &&
1046             (_position == other._position) &&
1047             (_floating == other._floating) &&
1048             (_table_layout == other._table_layout) &&
1049             (_page_break_before == other._page_break_before) &&
1050             (_page_break_after == other._page_break_after) &&
1051             (_styleType == other._styleType) &&
1052             (_affectedByHover == other._affectedByHover) &&
1053             (_affectedByActive == other._affectedByActive) &&
1054             (_affectedByDrag == other._affectedByDrag) &&
1055             (_pseudoBits == other._pseudoBits) &&
1056             (_unicodeBidi == other._unicodeBidi);
1057         }
1058
1059         bool operator!=( const NonInheritedFlags &other ) const {
1060             return !(*this == other);
1061         }
1062         
1063         unsigned _effectiveDisplay : 5; // EDisplay
1064         unsigned _originalDisplay : 5; // EDisplay
1065         unsigned _bg_repeat : 2; // EBackgroundRepeat
1066         unsigned _overflowX : 4; // EOverflow
1067         unsigned _overflowY : 4; // EOverflow
1068         unsigned _vertical_align : 4; // EVerticalAlign
1069         unsigned _clear : 2; // EClear
1070         unsigned _position : 2; // EPosition
1071         unsigned _floating : 2; // EFloat
1072         unsigned _table_layout : 1; // ETableLayout
1073         
1074         unsigned _page_break_before : 2; // EPageBreak
1075         unsigned _page_break_after : 2; // EPageBreak
1076
1077         unsigned _styleType : 3; // PseudoId
1078         bool _affectedByHover : 1;
1079         bool _affectedByActive : 1;
1080         bool _affectedByDrag : 1;
1081         unsigned _pseudoBits : 7;
1082         unsigned _unicodeBidi : 2; // EUnicodeBidi
1083     } noninherited_flags;
1084
1085 // non-inherited attributes
1086     DataRef<StyleBoxData> box;
1087     DataRef<StyleVisualData> visual;
1088     DataRef<StyleBackgroundData> background;
1089     DataRef<StyleSurroundData> surround;
1090     DataRef<StyleCSS3NonInheritedData> css3NonInheritedData;
1091
1092 // inherited attributes
1093     DataRef<StyleCSS3InheritedData> css3InheritedData;
1094     DataRef<StyleInheritedData> inherited;
1095     
1096 // list of associated pseudo styles
1097     RenderStyle* pseudoStyle;
1098     
1099     // added this here, so we can get rid of the vptr in this class.
1100     // makes up for the same size.
1101     ContentData* content;
1102     RefPtr<CSSValueList> counterResetList;
1103     RefPtr<CSSValueList> counterIncrementList;
1104
1105     unsigned m_pseudoState : 3; // PseudoState
1106     bool m_affectedByAttributeSelectors : 1;
1107     bool m_unique : 1;
1108     int m_ref;
1109     
1110 #ifdef SVG_SUPPORT
1111     DataRef<SVGRenderStyle> m_svgStyle;
1112 #endif
1113     
1114 // !END SYNC!
1115
1116 protected:
1117     void setBitDefaults()
1118     {
1119         inherited_flags._empty_cells = initialEmptyCells();
1120         inherited_flags._caption_side = initialCaptionSide();
1121         inherited_flags._list_style_type = initialListStyleType();
1122         inherited_flags._list_style_position = initialListStylePosition();
1123         inherited_flags._visibility = initialVisibility();
1124         inherited_flags._text_align = initialTextAlign();
1125         inherited_flags._text_transform = initialTextTransform();
1126         inherited_flags._text_decorations = initialTextDecoration();
1127         inherited_flags._cursor_style = initialCursor();
1128         inherited_flags._direction = initialDirection();
1129         inherited_flags._border_collapse = initialBorderCollapse();
1130         inherited_flags._white_space = initialWhiteSpace();
1131         inherited_flags._visuallyOrdered = initialVisuallyOrdered();
1132         inherited_flags._htmlHacks=false;
1133         inherited_flags._box_direction = initialBoxDirection();
1134         inherited_flags._force_backgrounds_to_white = false;
1135         
1136         noninherited_flags._effectiveDisplay = noninherited_flags._originalDisplay = initialDisplay();
1137         noninherited_flags._overflowX = initialOverflowX();
1138         noninherited_flags._overflowY = initialOverflowY();
1139         noninherited_flags._vertical_align = initialVerticalAlign();
1140         noninherited_flags._clear = initialClear();
1141         noninherited_flags._position = initialPosition();
1142         noninherited_flags._floating = initialFloating();
1143         noninherited_flags._table_layout = initialTableLayout();
1144         noninherited_flags._page_break_before = initialPageBreak();
1145         noninherited_flags._page_break_after = initialPageBreak();
1146         noninherited_flags._styleType = NOPSEUDO;
1147         noninherited_flags._affectedByHover = false;
1148         noninherited_flags._affectedByActive = false;
1149         noninherited_flags._affectedByDrag = false;
1150         noninherited_flags._pseudoBits = 0;
1151         noninherited_flags._unicodeBidi = initialUnicodeBidi();
1152     }
1153
1154 public:
1155
1156     RenderStyle();
1157     // used to create the default style.
1158     RenderStyle(bool);
1159     RenderStyle(const RenderStyle&);
1160
1161     ~RenderStyle();
1162
1163     void inheritFrom(const RenderStyle* inheritParent);
1164
1165     PseudoId styleType() { return  static_cast<PseudoId>(noninherited_flags._styleType); }
1166     void setStyleType(PseudoId styleType) { noninherited_flags._styleType = styleType; }
1167
1168     RenderStyle* getPseudoStyle(PseudoId pi);
1169     void addPseudoStyle(RenderStyle* pseudo);
1170
1171     bool affectedByHoverRules() const { return  noninherited_flags._affectedByHover; }
1172     bool affectedByActiveRules() const { return  noninherited_flags._affectedByActive; }
1173     bool affectedByDragRules() const { return  noninherited_flags._affectedByDrag; }
1174
1175     void setAffectedByHoverRules(bool b) {  noninherited_flags._affectedByHover = b; }
1176     void setAffectedByActiveRules(bool b) {  noninherited_flags._affectedByActive = b; }
1177     void setAffectedByDragRules(bool b) {  noninherited_flags._affectedByDrag = b; }
1178  
1179     bool operator==(const RenderStyle& other) const;
1180     bool        isFloating() const { return !(noninherited_flags._floating == FNONE); }
1181     bool        hasMargin() const { return surround->margin.nonZero(); }
1182     bool        hasBorder() const { return surround->border.hasBorder(); }
1183     bool        hasOffset() const { return surround->offset.nonZero(); }
1184
1185     bool hasBackground() const { if (backgroundColor().isValid() && backgroundColor().alpha() > 0)
1186                                     return true;
1187                                  return background->m_background.hasImage(); }
1188     bool hasFixedBackgroundImage() const { return background->m_background.hasFixedImage(); }
1189     bool hasAppearance() const { return appearance() != NoAppearance; }
1190
1191     bool visuallyOrdered() const { return inherited_flags._visuallyOrdered; }
1192     void setVisuallyOrdered(bool b) {  inherited_flags._visuallyOrdered = b; }
1193
1194     bool isStyleAvailable() const;
1195     
1196     bool hasPseudoStyle(PseudoId pseudo) const;
1197     void setHasPseudoStyle(PseudoId pseudo);
1198     
1199 // attribute getter methods
1200
1201     EDisplay    display() const { return static_cast<EDisplay>(noninherited_flags._effectiveDisplay); }
1202     EDisplay    originalDisplay() const { return static_cast<EDisplay>(noninherited_flags._originalDisplay); }
1203     
1204     Length      left() const {  return surround->offset.left; }
1205     Length      right() const {  return surround->offset.right; }
1206     Length      top() const {  return surround->offset.top; }
1207     Length      bottom() const {  return surround->offset.bottom; }
1208
1209     EPosition   position() const { return  static_cast<EPosition>(noninherited_flags._position); }
1210     EFloat      floating() const { return  static_cast<EFloat>(noninherited_flags._floating); }
1211
1212     Length      width() const { return box->width; }
1213     Length      height() const { return box->height; }
1214     Length      minWidth() const { return box->min_width; }
1215     Length      maxWidth() const { return box->max_width; }
1216     Length      minHeight() const { return box->min_height; }
1217     Length      maxHeight() const { return box->max_height; }
1218
1219     const BorderData& border() const { return surround->border; }
1220     const BorderValue& borderLeft() const { return surround->border.left; }
1221     const BorderValue& borderRight() const { return surround->border.right; }
1222     const BorderValue& borderTop() const { return surround->border.top; }
1223     const BorderValue& borderBottom() const { return surround->border.bottom; }
1224
1225     const BorderImage& borderImage() const { return surround->border.image; }
1226
1227     IntSize borderTopLeftRadius() const { return surround->border.topLeft; }
1228     IntSize borderTopRightRadius() const { return surround->border.topRight; }
1229     IntSize borderBottomLeftRadius() const { return surround->border.bottomLeft; }
1230     IntSize borderBottomRightRadius() const { return surround->border.bottomRight; }
1231     bool hasBorderRadius() const { return surround->border.hasBorderRadius(); }
1232
1233     unsigned short  borderLeftWidth() const { return surround->border.borderLeftWidth(); }
1234     EBorderStyle    borderLeftStyle() const { return surround->border.left.style(); }
1235     const Color&  borderLeftColor() const { return surround->border.left.color; }
1236     bool borderLeftIsTransparent() const { return surround->border.left.isTransparent(); }
1237     unsigned short  borderRightWidth() const { return surround->border.borderRightWidth(); }
1238     EBorderStyle    borderRightStyle() const {  return surround->border.right.style(); }
1239     const Color&   borderRightColor() const {  return surround->border.right.color; }
1240     bool borderRightIsTransparent() const { return surround->border.right.isTransparent(); }
1241     unsigned short  borderTopWidth() const { return surround->border.borderTopWidth(); }
1242     EBorderStyle    borderTopStyle() const { return surround->border.top.style(); }
1243     const Color&  borderTopColor() const {  return surround->border.top.color; }
1244     bool borderTopIsTransparent() const { return surround->border.top.isTransparent(); }
1245     unsigned short  borderBottomWidth() const { return surround->border.borderBottomWidth(); }
1246     EBorderStyle    borderBottomStyle() const {  return surround->border.bottom.style(); }
1247     const Color&   borderBottomColor() const {  return surround->border.bottom.color; }
1248     bool borderBottomIsTransparent() const { return surround->border.bottom.isTransparent(); }
1249     
1250     unsigned short outlineSize() const { return max(0, outlineWidth() + outlineOffset()); }
1251     unsigned short outlineWidth() const {
1252         if (background->m_outline.style() == BNONE || background->m_outline.style() == BHIDDEN)
1253             return 0;
1254         return background->m_outline.width;
1255     }
1256     bool hasOutline() const { return outlineWidth() > 0 && outlineStyle() > BHIDDEN; }
1257     EBorderStyle   outlineStyle() const {  return background->m_outline.style(); }
1258     bool outlineStyleIsAuto() const { return background->m_outline._auto; }
1259     const Color &  outlineColor() const {  return background->m_outline.color; }
1260
1261     EOverflow overflowX() const { return static_cast<EOverflow>(noninherited_flags._overflowX); }
1262     EOverflow overflowY() const { return static_cast<EOverflow>(noninherited_flags._overflowY); }
1263
1264     EVisibility visibility() const { return static_cast<EVisibility>(inherited_flags._visibility); }
1265     EVerticalAlign verticalAlign() const { return  static_cast<EVerticalAlign>(noninherited_flags._vertical_align); }
1266     Length verticalAlignLength() const { return box->vertical_align; }
1267
1268     Length clipLeft() const { return visual->clip.left; }
1269     Length clipRight() const { return visual->clip.right; }
1270     Length clipTop() const { return visual->clip.top; }
1271     Length clipBottom() const { return visual->clip.bottom; }
1272     LengthBox clip() const { return visual->clip; }
1273     bool hasClip() const { return visual->hasClip; }
1274     
1275     EUnicodeBidi unicodeBidi() const { return static_cast<EUnicodeBidi>(noninherited_flags._unicodeBidi); }
1276
1277     EClear clear() const { return static_cast<EClear>(noninherited_flags._clear); }
1278     ETableLayout tableLayout() const { return static_cast<ETableLayout>(noninherited_flags._table_layout); }
1279
1280     short colSpan() const { return visual->colspan; }
1281
1282     const Font& font() { return inherited->font; }
1283     const FontDescription& fontDescription() { return inherited->font.fontDescription(); }
1284     int fontSize() const { return inherited->font.pixelSize(); }
1285
1286     const Color & color() const { return inherited->color; }
1287     Length textIndent() const { return inherited->indent; }
1288     ETextAlign textAlign() const { return static_cast<ETextAlign>(inherited_flags._text_align); }
1289     ETextTransform textTransform() const { return static_cast<ETextTransform>(inherited_flags._text_transform); }
1290     int textDecorationsInEffect() const { return inherited_flags._text_decorations; }
1291     int textDecoration() const { return visual->textDecoration; }
1292     int wordSpacing() const { return inherited->font.wordSpacing(); }
1293     int letterSpacing() const { return inherited->font.letterSpacing(); }
1294
1295     TextDirection direction() const { return static_cast<TextDirection>(inherited_flags._direction); }
1296     Length lineHeight() const { return inherited->line_height; }
1297
1298     EWhiteSpace whiteSpace() const { return static_cast<EWhiteSpace>(inherited_flags._white_space); }
1299     static bool autoWrap(EWhiteSpace ws) {
1300         // Nowrap and pre don't automatically wrap.
1301         return ws != NOWRAP && ws != PRE;
1302     }
1303     bool autoWrap() const {
1304         return autoWrap(whiteSpace());
1305     }
1306     static bool preserveNewline(EWhiteSpace ws) {
1307         // Normal and nowrap do not preserve newlines.
1308         return ws != NORMAL && ws != NOWRAP;
1309     }
1310     bool preserveNewline() const {
1311         return preserveNewline(whiteSpace());
1312     }
1313     static bool collapseWhiteSpace(EWhiteSpace ws) {
1314         // Pre and prewrap do not collapse whitespace.
1315         return ws != PRE && ws != PRE_WRAP;
1316     }
1317     bool collapseWhiteSpace() const {
1318         return collapseWhiteSpace(whiteSpace());
1319     }
1320     bool isCollapsibleWhiteSpace(UChar c) const {
1321         switch (c) {
1322             case ' ':
1323             case '\t':
1324                 return collapseWhiteSpace();
1325             case '\n':
1326                 return !preserveNewline();
1327         }
1328         return false;
1329     }
1330     bool breakOnlyAfterWhiteSpace() const {
1331         return whiteSpace() == PRE_WRAP || khtmlLineBreak() == AFTER_WHITE_SPACE;
1332     }
1333
1334     const Color & backgroundColor() const { return background->m_color; }
1335     CachedImage *backgroundImage() const { return background->m_background.m_image; }
1336     EBackgroundRepeat backgroundRepeat() const { return static_cast<EBackgroundRepeat>(background->m_background.m_bgRepeat); }
1337     CompositeOperator backgroundComposite() const { return static_cast<CompositeOperator>(background->m_background.m_bgComposite); }
1338     bool backgroundAttachment() const { return background->m_background.m_bgAttachment; }
1339     EBackgroundBox backgroundClip() const { return static_cast<EBackgroundBox>(background->m_background.m_bgClip); }
1340     EBackgroundBox backgroundOrigin() const { return static_cast<EBackgroundBox>(background->m_background.m_bgOrigin); }
1341     Length backgroundXPosition() const { return background->m_background.m_xPosition; }
1342     Length backgroundYPosition() const { return background->m_background.m_yPosition; }
1343     LengthSize backgroundSize() const { return background->m_background.m_backgroundSize; }
1344     BackgroundLayer* accessBackgroundLayers() { return &(background.access()->m_background); }
1345     const BackgroundLayer* backgroundLayers() const { return &(background->m_background); }
1346
1347     // returns true for collapsing borders, false for separate borders
1348     bool borderCollapse() const { return inherited_flags._border_collapse; }
1349     short horizontalBorderSpacing() const { return inherited->horizontal_border_spacing; }
1350     short verticalBorderSpacing() const { return inherited->vertical_border_spacing; }
1351     EEmptyCell emptyCells() const { return static_cast<EEmptyCell>(inherited_flags._empty_cells); }
1352     ECaptionSide captionSide() const { return static_cast<ECaptionSide>(inherited_flags._caption_side); }
1353
1354     short counterIncrement() const { return visual->counterIncrement; }
1355     short counterReset() const { return visual->counterReset; }
1356
1357     EListStyleType listStyleType() const { return static_cast<EListStyleType>(inherited_flags._list_style_type); }
1358     CachedImage *listStyleImage() const { return inherited->style_image; }
1359     EListStylePosition listStylePosition() const { return static_cast<EListStylePosition>(inherited_flags._list_style_position); }
1360
1361     Length marginTop() const { return surround->margin.top; }
1362     Length marginBottom() const {  return surround->margin.bottom; }
1363     Length marginLeft() const {  return surround->margin.left; }
1364     Length marginRight() const {  return surround->margin.right; }
1365
1366     Length paddingTop() const {  return surround->padding.top; }
1367     Length paddingBottom() const {  return surround->padding.bottom; }
1368     Length paddingLeft() const { return surround->padding.left; }
1369     Length paddingRight() const {  return surround->padding.right; }
1370
1371     ECursor cursor() const { return static_cast<ECursor>(inherited_flags._cursor_style); }
1372     
1373     CursorList* cursors() const { return inherited->cursorData.get(); }
1374
1375     short widows() const { return inherited->widows; }
1376     short orphans() const { return inherited->orphans; }
1377     EPageBreak pageBreakInside() const { return static_cast<EPageBreak>(inherited->page_break_inside); }
1378     EPageBreak pageBreakBefore() const { return static_cast<EPageBreak>(noninherited_flags._page_break_before); }
1379     EPageBreak pageBreakAfter() const { return static_cast<EPageBreak>(noninherited_flags._page_break_after); }
1380     
1381     // CSS3 Getter Methods
1382 #ifdef XBL_SUPPORT
1383     BindingURI* bindingURIs() const { return css3NonInheritedData->bindingURI; }
1384 #endif
1385     int outlineOffset() const { 
1386         if (background->m_outline.style() == BNONE || background->m_outline.style() == BHIDDEN)
1387             return 0;
1388         return background->m_outline._offset;
1389     }
1390     ShadowData* textShadow() const { return css3InheritedData->textShadow; }
1391     float opacity() const { return css3NonInheritedData->opacity; }
1392     EAppearance appearance() const { return static_cast<EAppearance>(css3NonInheritedData->m_appearance); }
1393     EBoxAlignment boxAlign() const { return static_cast<EBoxAlignment>(css3NonInheritedData->flexibleBox->align); }
1394     EBoxDirection boxDirection() const { return static_cast<EBoxDirection>(inherited_flags._box_direction); }
1395     float boxFlex() { return css3NonInheritedData->flexibleBox->flex; }
1396     unsigned int boxFlexGroup() const { return css3NonInheritedData->flexibleBox->flex_group; }
1397     EBoxLines boxLines() { return static_cast<EBoxLines>(css3NonInheritedData->flexibleBox->lines); }
1398     unsigned int boxOrdinalGroup() const { return css3NonInheritedData->flexibleBox->ordinal_group; }
1399     EBoxOrient boxOrient() const { return static_cast<EBoxOrient>(css3NonInheritedData->flexibleBox->orient); }
1400     EBoxAlignment boxPack() const { return static_cast<EBoxAlignment>(css3NonInheritedData->flexibleBox->pack); }
1401     EBoxSizing boxSizing() const { return static_cast<EBoxSizing>(box->boxSizing); }
1402     Length marqueeIncrement() const { return css3NonInheritedData->marquee->increment; }
1403     int marqueeSpeed() const { return css3NonInheritedData->marquee->speed; }
1404     int marqueeLoopCount() const { return css3NonInheritedData->marquee->loops; }
1405     EMarqueeBehavior marqueeBehavior() const { return static_cast<EMarqueeBehavior>(css3NonInheritedData->marquee->behavior); }
1406     EMarqueeDirection marqueeDirection() const { return static_cast<EMarqueeDirection>(css3NonInheritedData->marquee->direction); }
1407     EUserModify userModify() const { return static_cast<EUserModify>(css3InheritedData->userModify); }
1408     EUserDrag userDrag() const { return static_cast<EUserDrag>(css3NonInheritedData->userDrag); }
1409     EUserSelect userSelect() const { return static_cast<EUserSelect>(css3NonInheritedData->userSelect); }
1410     bool textOverflow() const { return css3NonInheritedData->textOverflow; }
1411     EMarginCollapse marginTopCollapse() const { return static_cast<EMarginCollapse>(css3NonInheritedData->marginTopCollapse); }
1412     EMarginCollapse marginBottomCollapse() const { return static_cast<EMarginCollapse>(css3NonInheritedData->marginBottomCollapse); }
1413     EWordWrap wordWrap() const { return static_cast<EWordWrap>(css3InheritedData->wordWrap); }
1414     ENBSPMode nbspMode() const { return static_cast<ENBSPMode>(css3InheritedData->nbspMode); }
1415     EKHTMLLineBreak khtmlLineBreak() const { return static_cast<EKHTMLLineBreak>(css3InheritedData->khtmlLineBreak); }
1416     EMatchNearestMailBlockquoteColor matchNearestMailBlockquoteColor() const { return static_cast<EMatchNearestMailBlockquoteColor>(css3NonInheritedData->matchNearestMailBlockquoteColor); }
1417     const AtomicString& highlight() const { return css3InheritedData->highlight; }
1418     EResize resize() const { return static_cast<EResize>(css3InheritedData->resize); }
1419     // End CSS3 Getters
1420
1421     // Apple-specific property getter methods
1422     int lineClamp() const { return css3NonInheritedData->lineClamp; }
1423     bool textSizeAdjust() const { return css3InheritedData->textSizeAdjust; }
1424     ETextSecurity textSecurity() const { return static_cast<ETextSecurity>(css3InheritedData->textSecurity); }
1425
1426 // attribute setter methods
1427
1428     void setDisplay(EDisplay v) {  noninherited_flags._effectiveDisplay = v; }
1429     void setOriginalDisplay(EDisplay v) {  noninherited_flags._originalDisplay = v; }
1430     void setPosition(EPosition v) {  noninherited_flags._position = v; }
1431     void setFloating(EFloat v) {  noninherited_flags._floating = v; }
1432
1433     void setLeft(Length v)  {  SET_VAR(surround,offset.left,v) }
1434     void setRight(Length v) {  SET_VAR(surround,offset.right,v) }
1435     void setTop(Length v)   {  SET_VAR(surround,offset.top,v) }
1436     void setBottom(Length v){  SET_VAR(surround,offset.bottom,v) }
1437
1438     void setWidth(Length v)  { SET_VAR(box,width,v) }
1439     void setHeight(Length v) { SET_VAR(box,height,v) }
1440
1441     void setMinWidth(Length v)  { SET_VAR(box,min_width,v) }
1442     void setMaxWidth(Length v)  { SET_VAR(box,max_width,v) }
1443     void setMinHeight(Length v) { SET_VAR(box,min_height,v) }
1444     void setMaxHeight(Length v) { SET_VAR(box,max_height,v) }
1445
1446     Vector<StyleDashboardRegion> dashboardRegions() const { return css3NonInheritedData->m_dashboardRegions; }
1447     void setDashboardRegions(Vector<StyleDashboardRegion> regions) { SET_VAR(css3NonInheritedData,m_dashboardRegions,regions); }
1448     void setDashboardRegion(int type, const String& label, Length t, Length r, Length b, Length l, bool append) {
1449         StyleDashboardRegion region;
1450         region.label = label;
1451         region.offset.top  = t;
1452         region.offset.right = r;
1453         region.offset.bottom = b;
1454         region.offset.left = l;
1455         region.type = type;
1456         if (!append)
1457             css3NonInheritedData.access()->m_dashboardRegions.clear();
1458         css3NonInheritedData.access()->m_dashboardRegions.append(region);
1459     }
1460
1461     void resetBorder() { resetBorderImage(); resetBorderTop(); resetBorderRight(); resetBorderBottom(); resetBorderLeft(); resetBorderRadius(); }
1462     void resetBorderTop() { SET_VAR(surround, border.top, BorderValue()) }
1463     void resetBorderRight() { SET_VAR(surround, border.right, BorderValue()) }
1464     void resetBorderBottom() { SET_VAR(surround, border.bottom, BorderValue()) }
1465     void resetBorderLeft() { SET_VAR(surround, border.left, BorderValue()) }
1466     void resetBorderImage() { SET_VAR(surround, border.image, BorderImage()) }
1467     void resetBorderRadius() { resetBorderTopLeftRadius(); resetBorderTopRightRadius(); resetBorderBottomLeftRadius(); resetBorderBottomRightRadius(); }
1468     void resetBorderTopLeftRadius() { SET_VAR(surround, border.topLeft, initialBorderRadius()) }
1469     void resetBorderTopRightRadius() { SET_VAR(surround, border.topRight, initialBorderRadius()) }
1470     void resetBorderBottomLeftRadius() { SET_VAR(surround, border.bottomLeft, initialBorderRadius()) }
1471     void resetBorderBottomRightRadius() { SET_VAR(surround, border.bottomRight, initialBorderRadius()) }
1472     
1473     void resetOutline() { SET_VAR(background, m_outline, OutlineValue()) }
1474     
1475     void setBackgroundColor(const Color& v)    { SET_VAR(background, m_color, v) }
1476
1477     void setBorderImage(const BorderImage& b)   { SET_VAR(surround, border.image, b) }
1478
1479     void setBorderTopLeftRadius(const IntSize& s) { SET_VAR(surround, border.topLeft, s) }
1480     void setBorderTopRightRadius(const IntSize& s) { SET_VAR(surround, border.topRight, s) }
1481     void setBorderBottomLeftRadius(const IntSize& s) { SET_VAR(surround, border.bottomLeft, s) }
1482     void setBorderBottomRightRadius(const IntSize& s) { SET_VAR(surround, border.bottomRight, s) }
1483     void setBorderRadius(const IntSize& s) { 
1484         setBorderTopLeftRadius(s); setBorderTopRightRadius(s); setBorderBottomLeftRadius(s); setBorderBottomRightRadius(s);
1485     }
1486
1487     void setBorderLeftWidth(unsigned short v)   {  SET_VAR(surround, border.left.width, v) }
1488     void setBorderLeftStyle(EBorderStyle v)     {  SET_VAR(surround, border.left.m_style, v) }
1489     void setBorderLeftColor(const Color & v)   {  SET_VAR(surround, border.left.color, v) }
1490     void setBorderRightWidth(unsigned short v)  {  SET_VAR(surround, border.right.width, v) }
1491     void setBorderRightStyle(EBorderStyle v)    {  SET_VAR(surround, border.right.m_style, v) }
1492     void setBorderRightColor(const Color & v)  {  SET_VAR(surround, border.right.color, v) }
1493     void setBorderTopWidth(unsigned short v)    {  SET_VAR(surround, border.top.width, v) }
1494     void setBorderTopStyle(EBorderStyle v)      {  SET_VAR(surround, border.top.m_style, v) }
1495     void setBorderTopColor(const Color & v)    {  SET_VAR(surround, border.top.color, v) }    
1496     void setBorderBottomWidth(unsigned short v) {  SET_VAR(surround, border.bottom.width, v) }
1497     void setBorderBottomStyle(EBorderStyle v)   {  SET_VAR(surround, border.bottom.m_style, v) }
1498     void setBorderBottomColor(const Color & v) {  SET_VAR(surround, border.bottom.color, v) }
1499     void setOutlineWidth(unsigned short v) {  SET_VAR(background, m_outline.width, v) }
1500     void setOutlineStyle(EBorderStyle v, bool isAuto = false)   
1501     {  
1502         SET_VAR(background, m_outline.m_style, v)
1503         SET_VAR(background, m_outline._auto, isAuto)
1504     }
1505     void setOutlineColor(const Color & v) {  SET_VAR(background,m_outline.color,v) }
1506
1507     void setOverflowX(EOverflow v) { noninherited_flags._overflowX = v; }
1508     void setOverflowY(EOverflow v) { noninherited_flags._overflowY = v; }
1509     void setVisibility(EVisibility v) { inherited_flags._visibility = v; }
1510     void setVerticalAlign(EVerticalAlign v) { noninherited_flags._vertical_align = v; }
1511     void setVerticalAlignLength(Length l) { SET_VAR(box, vertical_align, l ) }
1512
1513     void setHasClip(bool b = true) { SET_VAR(visual,hasClip,b) }
1514     void setClipLeft(Length v) { SET_VAR(visual,clip.left,v) }
1515     void setClipRight(Length v) { SET_VAR(visual,clip.right,v) }
1516     void setClipTop(Length v) { SET_VAR(visual,clip.top,v) }
1517     void setClipBottom(Length v) { SET_VAR(visual,clip.bottom,v) }
1518     void setClip( Length top, Length right, Length bottom, Length left );
1519     
1520     void setUnicodeBidi( EUnicodeBidi b ) { noninherited_flags._unicodeBidi = b; }
1521
1522     void setClear(EClear v) {  noninherited_flags._clear = v; }
1523     void setTableLayout(ETableLayout v) {  noninherited_flags._table_layout = v; }
1524     void ssetColSpan(short v) { SET_VAR(visual,colspan,v) }
1525
1526     bool setFontDescription(const FontDescription& v) {
1527         if (inherited->font.fontDescription() != v) {
1528             inherited.access()->font = Font(v, inherited->font.letterSpacing(), inherited->font.wordSpacing());
1529             return true;
1530         }
1531         return false;
1532     }
1533
1534     void setColor(const Color & v) { SET_VAR(inherited,color,v) }
1535     void setTextIndent(Length v) { SET_VAR(inherited,indent,v) }
1536     void setTextAlign(ETextAlign v) { inherited_flags._text_align = v; }
1537     void setTextTransform(ETextTransform v) { inherited_flags._text_transform = v; }
1538     void addToTextDecorationsInEffect(int v) { inherited_flags._text_decorations |= v; }
1539     void setTextDecorationsInEffect(int v) { inherited_flags._text_decorations = v; }
1540     void setTextDecoration(int v) { SET_VAR(visual, textDecoration, v); }
1541     void setDirection(TextDirection v) { inherited_flags._direction = v; }
1542     void setLineHeight(Length v) { SET_VAR(inherited,line_height,v) }
1543
1544     void setWhiteSpace(EWhiteSpace v) { inherited_flags._white_space = v; }
1545
1546     void setWordSpacing(int v) { inherited.access()->font.setWordSpacing(v); }
1547     void setLetterSpacing(int v) { inherited.access()->font.setLetterSpacing(v); }
1548
1549     void clearBackgroundLayers() { background.access()->m_background = BackgroundLayer(); }
1550     void inheritBackgroundLayers(const BackgroundLayer& parent) { background.access()->m_background = parent; }
1551     void adjustBackgroundLayers();
1552
1553     void setBorderCollapse(bool collapse) { inherited_flags._border_collapse = collapse; }
1554     void setHorizontalBorderSpacing(short v) { SET_VAR(inherited,horizontal_border_spacing,v) }
1555     void setVerticalBorderSpacing(short v) { SET_VAR(inherited,vertical_border_spacing,v) }
1556     void setEmptyCells(EEmptyCell v) { inherited_flags._empty_cells = v; }
1557     void setCaptionSide(ECaptionSide v) { inherited_flags._caption_side = v; }
1558
1559
1560     void setCounterIncrement(short v) {  SET_VAR(visual,counterIncrement,v) }
1561     void setCounterReset(short v) {  SET_VAR(visual,counterReset,v) }
1562
1563     void setListStyleType(EListStyleType v) { inherited_flags._list_style_type = v; }
1564     void setListStyleImage(CachedImage *v) {  SET_VAR(inherited,style_image,v)}
1565     void setListStylePosition(EListStylePosition v) { inherited_flags._list_style_position = v; }
1566
1567     void resetMargin() { SET_VAR(surround, margin, LengthBox(Fixed)) }
1568     void setMarginTop(Length v)     {  SET_VAR(surround,margin.top,v) }
1569     void setMarginBottom(Length v)  {  SET_VAR(surround,margin.bottom,v) }
1570     void setMarginLeft(Length v)    {  SET_VAR(surround,margin.left,v) }
1571     void setMarginRight(Length v)   {  SET_VAR(surround,margin.right,v) }
1572
1573     void resetPadding() { SET_VAR(surround, padding, LengthBox(Auto)) }
1574     void setPaddingTop(Length v)    {  SET_VAR(surround,padding.top,v) }
1575     void setPaddingBottom(Length v) {  SET_VAR(surround,padding.bottom,v) }
1576     void setPaddingLeft(Length v)   {  SET_VAR(surround,padding.left,v) }
1577     void setPaddingRight(Length v)  {  SET_VAR(surround,padding.right,v) }
1578
1579     void setCursor( ECursor c ) { inherited_flags._cursor_style = c; }
1580     void addCursor(CachedImage*, const IntPoint& = IntPoint());
1581     void addSVGCursor(const String&);
1582     void setCursorList(PassRefPtr<CursorList>);
1583     void clearCursorList();
1584
1585     bool forceBackgroundsToWhite() const { return inherited_flags._force_backgrounds_to_white; }
1586     void setForceBackgroundsToWhite(bool b=true) { inherited_flags._force_backgrounds_to_white = b; }
1587
1588     bool htmlHacks() const { return inherited_flags._htmlHacks; }
1589     void setHtmlHacks(bool b=true) { inherited_flags._htmlHacks = b; }
1590
1591     bool hasAutoZIndex() { return box->z_auto; }
1592     void setHasAutoZIndex() { SET_VAR(box, z_auto, true); SET_VAR(box, z_index, 0) }
1593     int zIndex() const { return box->z_index; }
1594     void setZIndex(int v) { SET_VAR(box, z_auto, false); SET_VAR(box, z_index, v) }
1595
1596     void setWidows(short w) { SET_VAR(inherited, widows, w); }
1597     void setOrphans(short o) { SET_VAR(inherited, orphans, o); }
1598     void setPageBreakInside(EPageBreak b) { SET_VAR(inherited, page_break_inside, b); }
1599     void setPageBreakBefore(EPageBreak b) { noninherited_flags._page_break_before = b; }
1600     void setPageBreakAfter(EPageBreak b) { noninherited_flags._page_break_after = b; }
1601     
1602     // CSS3 Setters
1603 #ifdef XBL_SUPPORT
1604     void deleteBindingURIs() { 
1605         delete css3NonInheritedData->bindingURI; 
1606         SET_VAR(css3NonInheritedData, bindingURI, (BindingURI*) 0);
1607     }
1608     void inheritBindingURIs(BindingURI* other) {
1609         SET_VAR(css3NonInheritedData, bindingURI, other->copy());
1610     }
1611     void addBindingURI(StringImpl* uri);
1612 #endif
1613     void setOutlineOffset(int v) { SET_VAR(background, m_outline._offset, v) }
1614     void setTextShadow(ShadowData* val, bool add=false);
1615     void setOpacity(float f) { SET_VAR(css3NonInheritedData, opacity, f); }
1616     void setAppearance(EAppearance a) { SET_VAR(css3NonInheritedData, m_appearance, a); }
1617     void setBoxAlign(EBoxAlignment a) { SET_VAR(css3NonInheritedData.access()->flexibleBox, align, a); }
1618     void setBoxDirection(EBoxDirection d) { inherited_flags._box_direction = d; }
1619     void setBoxFlex(float f) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex, f); }
1620     void setBoxFlexGroup(unsigned int fg) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex_group, fg); }
1621     void setBoxLines(EBoxLines l) { SET_VAR(css3NonInheritedData.access()->flexibleBox, lines, l); }
1622     void setBoxOrdinalGroup(unsigned int og) { SET_VAR(css3NonInheritedData.access()->flexibleBox, ordinal_group, og); }
1623     void setBoxOrient(EBoxOrient o) { SET_VAR(css3NonInheritedData.access()->flexibleBox, orient, o); }
1624     void setBoxPack(EBoxAlignment p) { SET_VAR(css3NonInheritedData.access()->flexibleBox, pack, p); }
1625     void setBoxSizing(EBoxSizing s) { SET_VAR(box, boxSizing, s); }
1626     void setMarqueeIncrement(const Length& f) { SET_VAR(css3NonInheritedData.access()->marquee, increment, f); }
1627     void setMarqueeSpeed(int f) { SET_VAR(css3NonInheritedData.access()->marquee, speed, f); }
1628     void setMarqueeDirection(EMarqueeDirection d) { SET_VAR(css3NonInheritedData.access()->marquee, direction, d); }
1629     void setMarqueeBehavior(EMarqueeBehavior b) { SET_VAR(css3NonInheritedData.access()->marquee, behavior, b); }
1630     void setMarqueeLoopCount(int i) { SET_VAR(css3NonInheritedData.access()->marquee, loops, i); }
1631     void setUserModify(EUserModify u) { SET_VAR(css3InheritedData, userModify, u); }
1632     void setUserDrag(EUserDrag d) { SET_VAR(css3NonInheritedData, userDrag, d); }
1633     void setUserSelect(EUserSelect s) { SET_VAR(css3NonInheritedData, userSelect, s); }
1634     void setTextOverflow(bool b) { SET_VAR(css3NonInheritedData, textOverflow, b); }
1635     void setMarginTopCollapse(EMarginCollapse c) { SET_VAR(css3NonInheritedData, marginTopCollapse, c); }
1636     void setMarginBottomCollapse(EMarginCollapse c) { SET_VAR(css3NonInheritedData, marginBottomCollapse, c); }
1637     void setWordWrap(EWordWrap b) { SET_VAR(css3InheritedData, wordWrap, b); }
1638     void setNBSPMode(ENBSPMode b) { SET_VAR(css3InheritedData, nbspMode, b); }
1639     void setKHTMLLineBreak(EKHTMLLineBreak b) { SET_VAR(css3InheritedData, khtmlLineBreak, b); }
1640     void setMatchNearestMailBlockquoteColor(EMatchNearestMailBlockquoteColor c)  { SET_VAR(css3NonInheritedData, matchNearestMailBlockquoteColor, c); }
1641     void setHighlight(const AtomicString& h) { SET_VAR(css3InheritedData, highlight, h); }
1642     void setResize(EResize r) { SET_VAR(css3InheritedData, resize, r); }
1643     // End CSS3 Setters
1644    
1645     // Apple-specific property setters
1646     void setLineClamp(int c) { SET_VAR(css3NonInheritedData, lineClamp, c); }
1647     void setTextSizeAdjust(bool b) { SET_VAR(css3InheritedData, textSizeAdjust, b); }
1648     void setTextSecurity(ETextSecurity aTextSecurity) { SET_VAR(css3InheritedData, textSecurity, aTextSecurity); } 
1649
1650 #ifdef SVG_SUPPORT
1651     const SVGRenderStyle* svgStyle() const { return m_svgStyle.get(); }
1652     SVGRenderStyle* accessSVGStyle() { return m_svgStyle.access(); }
1653 #endif
1654
1655     ContentData* contentData() { return content; }
1656     bool contentDataEquivalent(const RenderStyle *otherStyle) const;
1657     void setContent(StringImpl* s, bool add = false);
1658     void setContent(CachedResource* o, bool add = false);
1659     void setContent(CounterData*, bool add = false);
1660
1661     bool counterDataEquivalent(RenderStyle*);
1662     void setCounterResetList(PassRefPtr<CSSValueList> l) { counterResetList = l; }
1663     void setCounterIncrementList(PassRefPtr<CSSValueList> l) { counterIncrementList = l; }
1664     bool hasCounterReset(const String&) const;
1665     bool hasCounterIncrement(const String&) const;
1666     int counterReset(const String&) const;
1667     int counterIncrement(const String&) const;
1668     CSSValueList* counterResetValueList() { return counterResetList.get(); }
1669     CSSValueList* counterIncrementValueList() { return counterIncrementList.get(); }
1670
1671     bool inheritedNotEqual( RenderStyle *other ) const;
1672
1673     // The difference between two styles.  The following values are used:
1674     // (1) Equal - The two styles are identical
1675     // (2) Repaint - The object just needs to be repainted.
1676     // (3) RepaintLayer - The layer and its descendant layers needs to be repainted.
1677     // (4) Layout - A layout is required.
1678     enum Diff { Equal, Repaint, RepaintLayer, Layout };
1679     Diff diff( const RenderStyle *other ) const;
1680
1681     bool isDisplayReplacedType() {
1682         return display() == INLINE_BLOCK || display() == INLINE_BOX || display() == INLINE_TABLE;
1683     }
1684     bool isDisplayInlineType() {
1685         return display() == INLINE || isDisplayReplacedType();
1686     }
1687     bool isOriginalDisplayInlineType() {
1688         return originalDisplay() == INLINE || originalDisplay() == INLINE_BLOCK ||
1689                originalDisplay() == INLINE_BOX || originalDisplay() == INLINE_TABLE;
1690     }
1691     
1692     // To obtain at any time the pseudo state for a given link.
1693     PseudoState pseudoState() const { return static_cast<PseudoState>(m_pseudoState); }
1694     void setPseudoState(PseudoState s) { m_pseudoState = s; }
1695     
1696     // To tell if this style matched attribute selectors. This makes it impossible to share.
1697     bool affectedByAttributeSelectors() const { return m_affectedByAttributeSelectors; }
1698     void setAffectedByAttributeSelectors() { m_affectedByAttributeSelectors = true; }
1699
1700     bool unique() const { return m_unique; }
1701     void setUnique() { m_unique = true; }
1702
1703     // Initial values for all the properties
1704     static bool initialBackgroundAttachment() { return true; }
1705     static EBackgroundBox initialBackgroundClip() { return BGBORDER; }
1706     static EBackgroundBox initialBackgroundOrigin() { return BGPADDING; }
1707     static EBackgroundRepeat initialBackgroundRepeat() { return REPEAT; }
1708     static CompositeOperator initialBackgroundComposite() { return CompositeSourceOver; }
1709     static LengthSize initialBackgroundSize() { return LengthSize(); }
1710     static bool initialBorderCollapse() { return false; }
1711     static EBorderStyle initialBorderStyle() { return BNONE; }
1712     static BorderImage initialBorderImage() { return BorderImage(); }
1713     static IntSize initialBorderRadius() { return IntSize(0,0); }
1714     static ECaptionSide initialCaptionSide() { return CAPTOP; }
1715     static EClear initialClear() { return CNONE; }
1716     static TextDirection initialDirection() { return LTR; }
1717     static EDisplay initialDisplay() { return INLINE; }
1718     static EEmptyCell initialEmptyCells() { return SHOW; }
1719     static EFloat initialFloating() { return FNONE; }
1720     static EListStylePosition initialListStylePosition() { return OUTSIDE; }
1721     static EListStyleType initialListStyleType() { return DISC; }
1722     static EOverflow initialOverflowX() { return OVISIBLE; }
1723     static EOverflow initialOverflowY() { return OVISIBLE; }
1724     static EPageBreak initialPageBreak() { return PBAUTO; }
1725     static EPosition initialPosition() { return StaticPosition; }
1726     static ETableLayout initialTableLayout() { return TAUTO; }
1727     static EUnicodeBidi initialUnicodeBidi() { return UBNormal; }
1728     static ETextTransform initialTextTransform() { return TTNONE; }
1729     static EVisibility initialVisibility() { return VISIBLE; }
1730     static EWhiteSpace initialWhiteSpace() { return NORMAL; }
1731     static Length initialBackgroundXPosition() { return Length(); }
1732     static Length initialBackgroundYPosition() { return Length(); }
1733     static short initialHorizontalBorderSpacing() { return 0; }
1734     static short initialVerticalBorderSpacing() { return 0; }
1735     static ECursor initialCursor() { return CURSOR_AUTO; }
1736     static Color initialColor() { return Color::black; }
1737     static CachedImage* initialBackgroundImage() { return 0; }
1738     static CachedImage* initialListStyleImage() { return 0; }
1739     static unsigned short initialBorderWidth() { return 3; }
1740     static int initialLetterWordSpacing() { return 0; }
1741     static Length initialSize() { return Length(); }
1742     static Length initialMinSize() { return Length(0, Fixed); }
1743     static Length initialMaxSize() { return Length(undefinedLength, Fixed); }
1744     static Length initialOffset() { return Length(); }
1745     static Length initialMargin() { return Length(Fixed); }
1746     static Length initialPadding() { return Length(Auto); }
1747     static Length initialTextIndent() { return Length(Fixed); }
1748     static EVerticalAlign initialVerticalAlign() { return BASELINE; }
1749     static int initialWidows() { return 2; }
1750     static int initialOrphans() { return 2; }
1751     static Length initialLineHeight() { return Length(-100, Percent); }
1752     static ETextAlign initialTextAlign() { return TAAUTO; }
1753     static ETextDecoration initialTextDecoration() { return TDNONE; }
1754     static int initialOutlineOffset() { return 0; }
1755     static float initialOpacity() { return 1.0f; }
1756     static EBoxAlignment initialBoxAlign() { return BSTRETCH; }
1757     static EBoxDirection initialBoxDirection() { return BNORMAL; }
1758     static EBoxLines initialBoxLines() { return SINGLE; }
1759     static EBoxOrient initialBoxOrient() { return HORIZONTAL; }
1760     static EBoxAlignment initialBoxPack() { return BSTART; }
1761     static float initialBoxFlex() { return 0.0f; }
1762     static int initialBoxFlexGroup() { return 1; }
1763     static int initialBoxOrdinalGroup() { return 1; }
1764     static EBoxSizing initialBoxSizing() { return CONTENT_BOX; }
1765     static int initialMarqueeLoopCount() { return -1; }
1766     static int initialMarqueeSpeed() { return 85; }
1767     static Length initialMarqueeIncrement() { return Length(6, Fixed); }
1768     static EMarqueeBehavior initialMarqueeBehavior() { return MSCROLL; }
1769     static EMarqueeDirection initialMarqueeDirection() { return MAUTO; }
1770     static EUserModify initialUserModify() { return READ_ONLY; }
1771     static EUserDrag initialUserDrag() { return DRAG_AUTO; }
1772     static EUserSelect initialUserSelect() { return SELECT_AUTO; }
1773     static bool initialTextOverflow() { return false; }
1774     static EMarginCollapse initialMarginTopCollapse() { return MCOLLAPSE; }
1775     static EMarginCollapse initialMarginBottomCollapse() { return MCOLLAPSE; }
1776     static EWordWrap initialWordWrap() { return WBNORMAL; }
1777     static ENBSPMode initialNBSPMode() { return NBNORMAL; }
1778     static EKHTMLLineBreak initialKHTMLLineBreak() { return LBNORMAL; }
1779     static EMatchNearestMailBlockquoteColor initialMatchNearestMailBlockquoteColor() { return BCNORMAL; }
1780     static const AtomicString& initialHighlight() { return nullAtom; }
1781     static EResize initialResize() { return RESIZE_NONE; }
1782     static EAppearance initialAppearance() { return NoAppearance; }
1783     static bool initialVisuallyOrdered() { return false; }
1784
1785     // Keep these at the end.
1786     static int initialLineClamp() { return -1; }
1787     static bool initialTextSizeAdjust() { return true; }
1788     static ETextSecurity initialTextSecurity() { return TSNONE; }
1789     static const Vector<StyleDashboardRegion>& initialDashboardRegions();
1790     static const Vector<StyleDashboardRegion>& noneDashboardRegions();
1791 };
1792
1793 } // namespace WebCore
1794
1795 #endif