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