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