From bace0152eadfd73175279d4a6d7904612f7e4ee7 Mon Sep 17 00:00:00 2001 From: ggarand Date: Fri, 5 Sep 2008 00:41:05 +0000 Subject: [PATCH] fix inheritance of border color patch by Maksim Orlovich and Anatoli Papirovski BUG: 170089 git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs@857212 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- khtml/css/cssstyleselector.cpp | 45 ++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/khtml/css/cssstyleselector.cpp b/khtml/css/cssstyleselector.cpp index 3cf6f513c..0d30514fa 100644 --- a/khtml/css/cssstyleselector.cpp +++ b/khtml/css/cssstyleselector.cpp @@ -186,6 +186,15 @@ if (id == propID) \ return;\ } +#define HANDLE_INHERIT_COND_WITH_BACKUP(propID, prop, propAlt, Prop) \ +if (id == propID) { \ + if (parentStyle->prop().isValid()) \ + style->set##Prop(parentStyle->prop()); \ + else \ + style->set##Prop(parentStyle->propAlt()); \ + return; \ +} + #define HANDLE_INITIAL_COND(propID, Prop) \ if (id == propID) \ {\ @@ -2091,6 +2100,16 @@ static inline int nextFontSize(const QVector& a, int v, bool smaller) return smaller ? a[r] : a[l]; } +// If we're explicitly inheriting an initial border-color, its computed value is based +// on the parents' computed value of color, not ours. +static QColor inheritedBorderColor( RenderStyle* parentStyle, const QColor& value ) +{ + if ( value.isValid() ) + return value; + else + return parentStyle->color(); +} + void CSSStyleSelector::applyRule( int id, DOM::CSSValueImpl *value ) { // kDebug( 6080 ) << "applying property " << getPropertyName(id); @@ -2719,12 +2738,12 @@ void CSSStyleSelector::applyRule( int id, DOM::CSSValueImpl *value ) if (id != CSS_PROP_COLOR) style->setInheritedNoninherited(true); HANDLE_INHERIT_COND(CSS_PROP_BACKGROUND_COLOR, backgroundColor, BackgroundColor) - HANDLE_INHERIT_COND(CSS_PROP_BORDER_TOP_COLOR, borderTopColor, BorderTopColor) - HANDLE_INHERIT_COND(CSS_PROP_BORDER_BOTTOM_COLOR, borderBottomColor, BorderBottomColor) - HANDLE_INHERIT_COND(CSS_PROP_BORDER_RIGHT_COLOR, borderRightColor, BorderRightColor) - HANDLE_INHERIT_COND(CSS_PROP_BORDER_LEFT_COLOR, borderLeftColor, BorderLeftColor) + HANDLE_INHERIT_COND_WITH_BACKUP(CSS_PROP_BORDER_TOP_COLOR, borderTopColor, color, BorderTopColor) + HANDLE_INHERIT_COND_WITH_BACKUP(CSS_PROP_BORDER_BOTTOM_COLOR, borderBottomColor, color, BorderBottomColor) + HANDLE_INHERIT_COND_WITH_BACKUP(CSS_PROP_BORDER_RIGHT_COLOR, borderRightColor, color, BorderRightColor) + HANDLE_INHERIT_COND_WITH_BACKUP(CSS_PROP_BORDER_LEFT_COLOR, borderLeftColor, color, BorderLeftColor) HANDLE_INHERIT_COND(CSS_PROP_COLOR, color, Color) - HANDLE_INHERIT_COND(CSS_PROP_OUTLINE_COLOR, outlineColor, OutlineColor) + HANDLE_INHERIT_COND_WITH_BACKUP(CSS_PROP_OUTLINE_COLOR, outlineColor, color, OutlineColor) return; } else if (isInitial) { // The border/outline colors will just map to the invalid color |col| above. This will have the @@ -3608,10 +3627,10 @@ void CSSStyleSelector::applyRule( int id, DOM::CSSValueImpl *value ) if(id == CSS_PROP_BORDER || id == CSS_PROP_BORDER_COLOR) { if (isInherit) { - style->setBorderTopColor(parentStyle->borderTopColor()); - style->setBorderBottomColor(parentStyle->borderBottomColor()); - style->setBorderLeftColor(parentStyle->borderLeftColor()); - style->setBorderRightColor(parentStyle->borderRightColor()); + style->setBorderTopColor(inheritedBorderColor(parentStyle, parentStyle->borderTopColor())); + style->setBorderBottomColor(inheritedBorderColor(parentStyle, parentStyle->borderBottomColor())); + style->setBorderLeftColor(inheritedBorderColor(parentStyle, parentStyle->borderLeftColor())); + style->setBorderRightColor(inheritedBorderColor(parentStyle, parentStyle->borderRightColor())); } else if (isInitial) { style->setBorderTopColor(QColor()); // Reset to invalid color so currentColor is used instead. @@ -3654,7 +3673,7 @@ void CSSStyleSelector::applyRule( int id, DOM::CSSValueImpl *value ) case CSS_PROP_BORDER_TOP: if ( isInherit ) { style->setInheritedNoninherited(true); - style->setBorderTopColor(parentStyle->borderTopColor()); + style->setBorderTopColor(inheritedBorderColor(parentStyle, parentStyle->borderTopColor())); style->setBorderTopStyle(parentStyle->borderTopStyle()); style->setBorderTopWidth(parentStyle->borderTopWidth()); } else if (isInitial) @@ -3663,7 +3682,7 @@ void CSSStyleSelector::applyRule( int id, DOM::CSSValueImpl *value ) case CSS_PROP_BORDER_RIGHT: if (isInherit) { style->setInheritedNoninherited(true); - style->setBorderRightColor(parentStyle->borderRightColor()); + style->setBorderRightColor(inheritedBorderColor(parentStyle,parentStyle->borderRightColor())); style->setBorderRightStyle(parentStyle->borderRightStyle()); style->setBorderRightWidth(parentStyle->borderRightWidth()); } @@ -3673,7 +3692,7 @@ void CSSStyleSelector::applyRule( int id, DOM::CSSValueImpl *value ) case CSS_PROP_BORDER_BOTTOM: if (isInherit) { style->setInheritedNoninherited(true); - style->setBorderBottomColor(parentStyle->borderBottomColor()); + style->setBorderBottomColor(inheritedBorderColor(parentStyle, parentStyle->borderBottomColor())); style->setBorderBottomStyle(parentStyle->borderBottomStyle()); style->setBorderBottomWidth(parentStyle->borderBottomWidth()); } @@ -3683,7 +3702,7 @@ void CSSStyleSelector::applyRule( int id, DOM::CSSValueImpl *value ) case CSS_PROP_BORDER_LEFT: if (isInherit) { style->setInheritedNoninherited(true); - style->setBorderLeftColor(parentStyle->borderLeftColor()); + style->setBorderLeftColor(inheritedBorderColor(parentStyle, parentStyle->borderLeftColor())); style->setBorderLeftStyle(parentStyle->borderLeftStyle()); style->setBorderLeftWidth(parentStyle->borderLeftWidth()); } -- 2.11.4.GIT