diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
commit | 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch) | |
tree | 988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebCore/css/CSSProperty.cpp | |
parent | dd91e772430dc294e3bf478c119ef8d43c0a3358 (diff) | |
download | qtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz |
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/WebCore/css/CSSProperty.cpp')
-rw-r--r-- | Source/WebCore/css/CSSProperty.cpp | 258 |
1 files changed, 117 insertions, 141 deletions
diff --git a/Source/WebCore/css/CSSProperty.cpp b/Source/WebCore/css/CSSProperty.cpp index 01e7077bf..ad8797aec 100644 --- a/Source/WebCore/css/CSSProperty.cpp +++ b/Source/WebCore/css/CSSProperty.cpp @@ -21,40 +21,55 @@ #include "config.h" #include "CSSProperty.h" -#include "CSSPropertyNames.h" +#include "CSSValueList.h" #include "PlatformString.h" #include "RenderStyleConstants.h" +#include "StylePropertyShorthand.h" namespace WebCore { +struct SameSizeAsCSSProperty { + uint32_t bitfields; + void* value; +}; + +COMPILE_ASSERT(sizeof(CSSProperty) == sizeof(SameSizeAsCSSProperty), CSSProperty_should_stay_small); + String CSSProperty::cssText() const { - return String(getPropertyName(static_cast<CSSPropertyID>(id()))) + ": " + m_value->cssText() + (isImportant() ? " !important" : "") + "; "; + return String(getPropertyName(id())) + ": " + m_value->cssText() + (isImportant() ? " !important" : "") + "; "; +} + +void CSSProperty::wrapValueInCommaSeparatedList() +{ + RefPtr<CSSValue> value = m_value.release(); + m_value = CSSValueList::createCommaSeparated(); + static_cast<CSSValueList*>(m_value.get())->append(value.release()); } enum LogicalBoxSide { BeforeSide, EndSide, AfterSide, StartSide }; enum PhysicalBoxSide { TopSide, RightSide, BottomSide, LeftSide }; -static int resolveToPhysicalProperty(TextDirection direction, WritingMode writingMode, LogicalBoxSide logicalSide, const int* properties) +static CSSPropertyID resolveToPhysicalProperty(TextDirection direction, WritingMode writingMode, LogicalBoxSide logicalSide, const StylePropertyShorthand& shorthand) { if (direction == LTR) { if (writingMode == TopToBottomWritingMode) { // The common case. The logical and physical box sides match. // Left = Start, Right = End, Before = Top, After = Bottom - return properties[logicalSide]; + return shorthand.properties()[logicalSide]; } if (writingMode == BottomToTopWritingMode) { // Start = Left, End = Right, Before = Bottom, After = Top. switch (logicalSide) { case StartSide: - return properties[LeftSide]; + return shorthand.properties()[LeftSide]; case EndSide: - return properties[RightSide]; + return shorthand.properties()[RightSide]; case BeforeSide: - return properties[BottomSide]; + return shorthand.properties()[BottomSide]; default: - return properties[TopSide]; + return shorthand.properties()[TopSide]; } } @@ -62,26 +77,26 @@ static int resolveToPhysicalProperty(TextDirection direction, WritingMode writin // Start = Top, End = Bottom, Before = Left, After = Right. switch (logicalSide) { case StartSide: - return properties[TopSide]; + return shorthand.properties()[TopSide]; case EndSide: - return properties[BottomSide]; + return shorthand.properties()[BottomSide]; case BeforeSide: - return properties[LeftSide]; + return shorthand.properties()[LeftSide]; default: - return properties[RightSide]; + return shorthand.properties()[RightSide]; } } // Start = Top, End = Bottom, Before = Right, After = Left switch (logicalSide) { case StartSide: - return properties[TopSide]; + return shorthand.properties()[TopSide]; case EndSide: - return properties[BottomSide]; + return shorthand.properties()[BottomSide]; case BeforeSide: - return properties[RightSide]; + return shorthand.properties()[RightSide]; default: - return properties[LeftSide]; + return shorthand.properties()[LeftSide]; } } @@ -89,13 +104,13 @@ static int resolveToPhysicalProperty(TextDirection direction, WritingMode writin // Start = Right, End = Left, Before = Top, After = Bottom switch (logicalSide) { case StartSide: - return properties[RightSide]; + return shorthand.properties()[RightSide]; case EndSide: - return properties[LeftSide]; + return shorthand.properties()[LeftSide]; case BeforeSide: - return properties[TopSide]; + return shorthand.properties()[TopSide]; default: - return properties[BottomSide]; + return shorthand.properties()[BottomSide]; } } @@ -103,13 +118,13 @@ static int resolveToPhysicalProperty(TextDirection direction, WritingMode writin // Start = Right, End = Left, Before = Bottom, After = Top switch (logicalSide) { case StartSide: - return properties[RightSide]; + return shorthand.properties()[RightSide]; case EndSide: - return properties[LeftSide]; + return shorthand.properties()[LeftSide]; case BeforeSide: - return properties[BottomSide]; + return shorthand.properties()[BottomSide]; default: - return properties[TopSide]; + return shorthand.properties()[TopSide]; } } @@ -117,159 +132,118 @@ static int resolveToPhysicalProperty(TextDirection direction, WritingMode writin // Start = Bottom, End = Top, Before = Left, After = Right switch (logicalSide) { case StartSide: - return properties[BottomSide]; + return shorthand.properties()[BottomSide]; case EndSide: - return properties[TopSide]; + return shorthand.properties()[TopSide]; case BeforeSide: - return properties[LeftSide]; + return shorthand.properties()[LeftSide]; default: - return properties[RightSide]; + return shorthand.properties()[RightSide]; } } // Start = Bottom, End = Top, Before = Right, After = Left switch (logicalSide) { case StartSide: - return properties[BottomSide]; + return shorthand.properties()[BottomSide]; case EndSide: - return properties[TopSide]; + return shorthand.properties()[TopSide]; case BeforeSide: - return properties[RightSide]; + return shorthand.properties()[RightSide]; default: - return properties[LeftSide]; + return shorthand.properties()[LeftSide]; } } enum LogicalExtent { LogicalWidth, LogicalHeight }; -static int resolveToPhysicalProperty(WritingMode writingMode, LogicalExtent logicalSide, const int* properties) +static CSSPropertyID resolveToPhysicalProperty(WritingMode writingMode, LogicalExtent logicalSide, const CSSPropertyID* properties) { if (writingMode == TopToBottomWritingMode || writingMode == BottomToTopWritingMode) return properties[logicalSide]; return logicalSide == LogicalWidth ? properties[1] : properties[0]; } -int CSSProperty::resolveDirectionAwareProperty(int propertyID, TextDirection direction, WritingMode writingMode) +static const StylePropertyShorthand& borderDirections() { - switch (static_cast<CSSPropertyID>(propertyID)) { - case CSSPropertyWebkitMarginEnd: { - const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft }; - return resolveToPhysicalProperty(direction, writingMode, EndSide, properties); - } - case CSSPropertyWebkitMarginStart: { - const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft }; - return resolveToPhysicalProperty(direction, writingMode, StartSide, properties); - } - case CSSPropertyWebkitMarginBefore: { - const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft }; - return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties); - } - case CSSPropertyWebkitMarginAfter: { - const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft }; - return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties); - } - case CSSPropertyWebkitPaddingEnd: { - const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft }; - return resolveToPhysicalProperty(direction, writingMode, EndSide, properties); - } - case CSSPropertyWebkitPaddingStart: { - const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft }; - return resolveToPhysicalProperty(direction, writingMode, StartSide, properties); - } - case CSSPropertyWebkitPaddingBefore: { - const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft }; - return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties); - } - case CSSPropertyWebkitPaddingAfter: { - const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft }; - return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties); - } - case CSSPropertyWebkitBorderEnd: { - const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft }; - return resolveToPhysicalProperty(direction, writingMode, EndSide, properties); - } - case CSSPropertyWebkitBorderStart: { - const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft }; - return resolveToPhysicalProperty(direction, writingMode, StartSide, properties); - } - case CSSPropertyWebkitBorderBefore: { - const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft }; - return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties); - } - case CSSPropertyWebkitBorderAfter: { - const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft }; - return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties); - } - case CSSPropertyWebkitBorderEndColor: { - const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor }; - return resolveToPhysicalProperty(direction, writingMode, EndSide, properties); - } - case CSSPropertyWebkitBorderStartColor: { - const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor }; - return resolveToPhysicalProperty(direction, writingMode, StartSide, properties); - } - case CSSPropertyWebkitBorderBeforeColor: { - const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor }; - return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties); - } - case CSSPropertyWebkitBorderAfterColor: { - const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor }; - return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties); - } - case CSSPropertyWebkitBorderEndStyle: { - const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle }; - return resolveToPhysicalProperty(direction, writingMode, EndSide, properties); - } - case CSSPropertyWebkitBorderStartStyle: { - const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle }; - return resolveToPhysicalProperty(direction, writingMode, StartSide, properties); - } - case CSSPropertyWebkitBorderBeforeStyle: { - const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle }; - return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties); - } - case CSSPropertyWebkitBorderAfterStyle: { - const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle }; - return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties); - } - case CSSPropertyWebkitBorderEndWidth: { - const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth }; - return resolveToPhysicalProperty(direction, writingMode, EndSide, properties); - } - case CSSPropertyWebkitBorderStartWidth: { - const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth }; - return resolveToPhysicalProperty(direction, writingMode, StartSide, properties); - } - case CSSPropertyWebkitBorderBeforeWidth: { - const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth }; - return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties); - } - case CSSPropertyWebkitBorderAfterWidth: { - const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth }; - return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties); - } + static const CSSPropertyID properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft }; + DEFINE_STATIC_LOCAL(StylePropertyShorthand, borderDirections, (properties, WTF_ARRAY_LENGTH(properties))); + return borderDirections; +} + +CSSPropertyID CSSProperty::resolveDirectionAwareProperty(CSSPropertyID propertyID, TextDirection direction, WritingMode writingMode) +{ + switch (propertyID) { + case CSSPropertyWebkitMarginEnd: + return resolveToPhysicalProperty(direction, writingMode, EndSide, marginShorthand()); + case CSSPropertyWebkitMarginStart: + return resolveToPhysicalProperty(direction, writingMode, StartSide, marginShorthand()); + case CSSPropertyWebkitMarginBefore: + return resolveToPhysicalProperty(direction, writingMode, BeforeSide, marginShorthand()); + case CSSPropertyWebkitMarginAfter: + return resolveToPhysicalProperty(direction, writingMode, AfterSide, marginShorthand()); + case CSSPropertyWebkitPaddingEnd: + return resolveToPhysicalProperty(direction, writingMode, EndSide, paddingShorthand()); + case CSSPropertyWebkitPaddingStart: + return resolveToPhysicalProperty(direction, writingMode, StartSide, paddingShorthand()); + case CSSPropertyWebkitPaddingBefore: + return resolveToPhysicalProperty(direction, writingMode, BeforeSide, paddingShorthand()); + case CSSPropertyWebkitPaddingAfter: + return resolveToPhysicalProperty(direction, writingMode, AfterSide, paddingShorthand()); + case CSSPropertyWebkitBorderEnd: + return resolveToPhysicalProperty(direction, writingMode, EndSide, borderDirections()); + case CSSPropertyWebkitBorderStart: + return resolveToPhysicalProperty(direction, writingMode, StartSide, borderDirections()); + case CSSPropertyWebkitBorderBefore: + return resolveToPhysicalProperty(direction, writingMode, BeforeSide, borderDirections()); + case CSSPropertyWebkitBorderAfter: + return resolveToPhysicalProperty(direction, writingMode, AfterSide, borderDirections()); + case CSSPropertyWebkitBorderEndColor: + return resolveToPhysicalProperty(direction, writingMode, EndSide, borderColorShorthand()); + case CSSPropertyWebkitBorderStartColor: + return resolveToPhysicalProperty(direction, writingMode, StartSide, borderColorShorthand()); + case CSSPropertyWebkitBorderBeforeColor: + return resolveToPhysicalProperty(direction, writingMode, BeforeSide, borderColorShorthand()); + case CSSPropertyWebkitBorderAfterColor: + return resolveToPhysicalProperty(direction, writingMode, AfterSide, borderColorShorthand()); + case CSSPropertyWebkitBorderEndStyle: + return resolveToPhysicalProperty(direction, writingMode, EndSide, borderStyleShorthand()); + case CSSPropertyWebkitBorderStartStyle: + return resolveToPhysicalProperty(direction, writingMode, StartSide, borderStyleShorthand()); + case CSSPropertyWebkitBorderBeforeStyle: + return resolveToPhysicalProperty(direction, writingMode, BeforeSide, borderStyleShorthand()); + case CSSPropertyWebkitBorderAfterStyle: + return resolveToPhysicalProperty(direction, writingMode, AfterSide, borderStyleShorthand()); + case CSSPropertyWebkitBorderEndWidth: + return resolveToPhysicalProperty(direction, writingMode, EndSide, borderWidthShorthand()); + case CSSPropertyWebkitBorderStartWidth: + return resolveToPhysicalProperty(direction, writingMode, StartSide, borderWidthShorthand()); + case CSSPropertyWebkitBorderBeforeWidth: + return resolveToPhysicalProperty(direction, writingMode, BeforeSide, borderWidthShorthand()); + case CSSPropertyWebkitBorderAfterWidth: + return resolveToPhysicalProperty(direction, writingMode, AfterSide, borderWidthShorthand()); case CSSPropertyWebkitLogicalWidth: { - const int properties[2] = { CSSPropertyWidth, CSSPropertyHeight }; + const CSSPropertyID properties[2] = { CSSPropertyWidth, CSSPropertyHeight }; return resolveToPhysicalProperty(writingMode, LogicalWidth, properties); } case CSSPropertyWebkitLogicalHeight: { - const int properties[2] = { CSSPropertyWidth, CSSPropertyHeight }; + const CSSPropertyID properties[2] = { CSSPropertyWidth, CSSPropertyHeight }; return resolveToPhysicalProperty(writingMode, LogicalHeight, properties); } case CSSPropertyWebkitMinLogicalWidth: { - const int properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight }; + const CSSPropertyID properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight }; return resolveToPhysicalProperty(writingMode, LogicalWidth, properties); } case CSSPropertyWebkitMinLogicalHeight: { - const int properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight }; + const CSSPropertyID properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight }; return resolveToPhysicalProperty(writingMode, LogicalHeight, properties); } case CSSPropertyWebkitMaxLogicalWidth: { - const int properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight }; + const CSSPropertyID properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight }; return resolveToPhysicalProperty(writingMode, LogicalWidth, properties); } case CSSPropertyWebkitMaxLogicalHeight: { - const int properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight }; + const CSSPropertyID properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight }; return resolveToPhysicalProperty(writingMode, LogicalHeight, properties); } default: @@ -277,9 +251,9 @@ int CSSProperty::resolveDirectionAwareProperty(int propertyID, TextDirection dir } } -bool CSSProperty::isInheritedProperty(unsigned propertyID) +bool CSSProperty::isInheritedProperty(CSSPropertyID propertyID) { - switch (static_cast<CSSPropertyID>(propertyID)) { + switch (propertyID) { case CSSPropertyBorderCollapse: case CSSPropertyBorderSpacing: case CSSPropertyCaptionSide: @@ -562,12 +536,14 @@ bool CSSProperty::isInheritedProperty(unsigned propertyID) #if ENABLE(CSS_FILTERS) case CSSPropertyWebkitFilter: #endif + case CSSPropertyWebkitFlex: case CSSPropertyWebkitFlexOrder: case CSSPropertyWebkitFlexPack: case CSSPropertyWebkitFlexAlign: case CSSPropertyWebkitFlexItemAlign: case CSSPropertyWebkitFlexDirection: case CSSPropertyWebkitFlexFlow: + case CSSPropertyWebkitFlexLinePack: case CSSPropertyWebkitFlexWrap: case CSSPropertyWebkitFontSizeDelta: #if ENABLE(CSS_GRID_LAYOUT) @@ -649,8 +625,8 @@ bool CSSProperty::isInheritedProperty(unsigned propertyID) case CSSPropertyWebkitWrapFlow: case CSSPropertyWebkitWrapMargin: case CSSPropertyWebkitWrapPadding: - case CSSPropertyWebkitWrapShapeInside: - case CSSPropertyWebkitWrapShapeOutside: + case CSSPropertyWebkitShapeInside: + case CSSPropertyWebkitShapeOutside: case CSSPropertyWebkitWrapThrough: #if ENABLE(SVG) case CSSPropertyClipPath: |