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