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