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