summaryrefslogtreecommitdiff
path: root/Source/WebCore/css/CSSProperty.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
commit2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch)
tree988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebCore/css/CSSProperty.cpp
parentdd91e772430dc294e3bf478c119ef8d43c0a3358 (diff)
downloadqtwebkit-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.cpp258
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: