Modified: trunk/Source/WebCore/css/CSSStyleApplyProperty.cpp (102187 => 102188)
--- trunk/Source/WebCore/css/CSSStyleApplyProperty.cpp 2011-12-06 23:49:19 UTC (rev 102187)
+++ trunk/Source/WebCore/css/CSSStyleApplyProperty.cpp 2011-12-07 00:26:59 UTC (rev 102188)
@@ -631,6 +631,80 @@
}
};
+enum BorderImageModifierType { Outset, Repeat, Slice, Width };
+template <BorderImageType type, BorderImageModifierType modifier>
+class ApplyPropertyBorderImageModifier {
+private:
+ static inline const NinePieceImage& getValue(RenderStyle* style) { return type == Image ? style->borderImage() : style->maskBoxImage(); }
+ static inline void setValue(RenderStyle* style, const NinePieceImage& value) { return type == Image ? style->setBorderImage(value) : style->setMaskBoxImage(value); }
+public:
+ static void applyInheritValue(CSSStyleSelector* selector)
+ {
+ NinePieceImage image(getValue(selector->style()));
+ switch (modifier) {
+ case Outset:
+ image.copyOutsetFrom(getValue(selector->parentStyle()));
+ break;
+ case Repeat:
+ image.copyRepeatFrom(getValue(selector->parentStyle()));
+ break;
+ case Slice:
+ image.copyImageSlicesFrom(getValue(selector->parentStyle()));
+ break;
+ case Width:
+ image.copyBorderSlicesFrom(getValue(selector->parentStyle()));
+ break;
+ }
+ setValue(selector->style(), image);
+ }
+
+ static void applyInitialValue(CSSStyleSelector* selector)
+ {
+ NinePieceImage image(getValue(selector->style()));
+ switch (modifier) {
+ case Outset:
+ image.setOutset(LengthBox());
+ break;
+ case Repeat:
+ image.setHorizontalRule(StretchImageRule);
+ image.setVerticalRule(StretchImageRule);
+ break;
+ case Slice:
+ // Masks have a different initial value for slices. Preserve the value of 0 for backwards compatibility.
+ image.setImageSlices(type == Image ? LengthBox(Length(100, Percent), Length(100, Percent), Length(100, Percent), Length(100, Percent)) : LengthBox());
+ image.setFill(false);
+ break;
+ case Width:
+ // Masks have a different initial value for widths. They use an 'auto' value rather than trying to fit to the border.
+ image.setBorderSlices(type == Image ? LengthBox(Length(1, Relative), Length(1, Relative), Length(1, Relative), Length(1, Relative)) : LengthBox());
+ break;
+ }
+ setValue(selector->style(), image);
+ }
+
+ static void applyValue(CSSStyleSelector* selector, CSSValue* value)
+ {
+ NinePieceImage image(getValue(selector->style()));
+ switch (modifier) {
+ case Outset:
+ image.setOutset(selector->mapNinePieceImageQuad(value));
+ break;
+ case Repeat:
+ selector->mapNinePieceImageRepeat(value, image);
+ break;
+ case Slice:
+ selector->mapNinePieceImageSlice(value, image);
+ break;
+ case Width:
+ image.setBorderSlices(selector->mapNinePieceImageQuad(value));
+ break;
+ }
+ setValue(selector->style(), image);
+ }
+
+ static PropertyHandler createHandler() { return PropertyHandler(&applyInheritValue, &applyInitialValue, &applyValue); }
+};
+
enum CounterBehavior {Increment = 0, Reset};
template <CounterBehavior counterBehavior>
class ApplyPropertyCounter {
@@ -1280,6 +1354,15 @@
setPropertyHandler(CSSPropertyWebkitBorderImage, ApplyPropertyBorderImage<Image, CSSPropertyWebkitBorderImage, &RenderStyle::borderImage, &RenderStyle::setBorderImage, &CSSStyleSelector::mapNinePieceImage>::createHandler());
setPropertyHandler(CSSPropertyWebkitMaskBoxImage, ApplyPropertyBorderImage<Mask, CSSPropertyWebkitMaskBoxImage, &RenderStyle::maskBoxImage, &RenderStyle::setMaskBoxImage, &CSSStyleSelector::mapNinePieceImage>::createHandler());
+ setPropertyHandler(CSSPropertyBorderImageOutset, ApplyPropertyBorderImageModifier<Image, Outset>::createHandler());
+ setPropertyHandler(CSSPropertyWebkitMaskBoxImageOutset, ApplyPropertyBorderImageModifier<Mask, Outset>::createHandler());
+ setPropertyHandler(CSSPropertyBorderImageRepeat, ApplyPropertyBorderImageModifier<Image, Repeat>::createHandler());
+ setPropertyHandler(CSSPropertyWebkitMaskBoxImageRepeat, ApplyPropertyBorderImageModifier<Mask, Repeat>::createHandler());
+ setPropertyHandler(CSSPropertyBorderImageSlice, ApplyPropertyBorderImageModifier<Image, Slice>::createHandler());
+ setPropertyHandler(CSSPropertyWebkitMaskBoxImageSlice, ApplyPropertyBorderImageModifier<Mask, Slice>::createHandler());
+ setPropertyHandler(CSSPropertyBorderImageWidth, ApplyPropertyBorderImageModifier<Image, Width>::createHandler());
+ setPropertyHandler(CSSPropertyWebkitMaskBoxImageWidth, ApplyPropertyBorderImageModifier<Mask, Width>::createHandler());
+
setPropertyHandler(CSSPropertyBorderTopLeftRadius, ApplyPropertyBorderRadius<&RenderStyle::borderTopLeftRadius, &RenderStyle::setBorderTopLeftRadius, &RenderStyle::initialBorderRadius>::createHandler());
setPropertyHandler(CSSPropertyBorderTopRightRadius, ApplyPropertyBorderRadius<&RenderStyle::borderTopRightRadius, &RenderStyle::setBorderTopRightRadius, &RenderStyle::initialBorderRadius>::createHandler());
setPropertyHandler(CSSPropertyBorderBottomLeftRadius, ApplyPropertyBorderRadius<&RenderStyle::borderBottomLeftRadius, &RenderStyle::setBorderBottomLeftRadius, &RenderStyle::initialBorderRadius>::createHandler());
Modified: trunk/Source/WebCore/css/CSSStyleSelector.cpp (102187 => 102188)
--- trunk/Source/WebCore/css/CSSStyleSelector.cpp 2011-12-06 23:49:19 UTC (rev 102187)
+++ trunk/Source/WebCore/css/CSSStyleSelector.cpp 2011-12-07 00:26:59 UTC (rev 102188)
@@ -3170,78 +3170,6 @@
case CSSPropertyWebkitAppearance:
HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(appearance, Appearance)
return;
- case CSSPropertyBorderImageOutset:
- case CSSPropertyWebkitMaskBoxImageOutset: {
- bool isBorderImage = id == CSSPropertyBorderImageOutset;
- NinePieceImage image(isBorderImage ? m_style->borderImage() : m_style->maskBoxImage());
- if (isInherit)
- image.copyOutsetFrom(isBorderImage ? m_parentStyle->borderImage() : m_parentStyle->maskBoxImage());
- else if (isInitial)
- image.setOutset(LengthBox());
- else
- image.setOutset(mapNinePieceImageQuad(value));
-
- if (isBorderImage)
- m_style->setBorderImage(image);
- else
- m_style->setMaskBoxImage(image);
- return;
- }
- case CSSPropertyBorderImageRepeat:
- case CSSPropertyWebkitMaskBoxImageRepeat: {
- bool isBorderImage = id == CSSPropertyBorderImageRepeat;
- NinePieceImage image(isBorderImage ? m_style->borderImage() : m_style->maskBoxImage());
- if (isInherit)
- image.copyRepeatFrom(isBorderImage ? m_parentStyle->borderImage() : m_parentStyle->maskBoxImage());
- else if (isInitial) {
- image.setHorizontalRule(StretchImageRule);
- image.setVerticalRule(StretchImageRule);
- } else
- mapNinePieceImageRepeat(value, image);
-
- if (isBorderImage)
- m_style->setBorderImage(image);
- else
- m_style->setMaskBoxImage(image);
- return;
- }
- case CSSPropertyBorderImageSlice:
- case CSSPropertyWebkitMaskBoxImageSlice: {
- bool isBorderImage = id == CSSPropertyBorderImageSlice;
- NinePieceImage image(isBorderImage ? m_style->borderImage() : m_style->maskBoxImage());
- if (isInherit)
- image.copyImageSlicesFrom(isBorderImage ? m_parentStyle->borderImage() : m_parentStyle->maskBoxImage());
- else if (isInitial) {
- // Masks have a different initial value for slices. Preserve the value of 0 for backwards compatibility.
- image.setImageSlices(isBorderImage ? LengthBox(Length(100, Percent), Length(100, Percent), Length(100, Percent), Length(100, Percent)) : LengthBox());
- image.setFill(false);
- } else
- mapNinePieceImageSlice(value, image);
-
- if (isBorderImage)
- m_style->setBorderImage(image);
- else
- m_style->setMaskBoxImage(image);
- return;
- }
- case CSSPropertyBorderImageWidth:
- case CSSPropertyWebkitMaskBoxImageWidth: {
- bool isBorderImage = id == CSSPropertyBorderImageWidth;
- NinePieceImage image(isBorderImage ? m_style->borderImage() : m_style->maskBoxImage());
- if (isInherit)
- image.copyBorderSlicesFrom(isBorderImage ? m_parentStyle->borderImage() : m_parentStyle->maskBoxImage());
- else if (isInitial) {
- // Masks have a different initial value for slices. They use an 'auto' value rather than trying to fit to the border.
- image.setBorderSlices(isBorderImage ? LengthBox(Length(1, Relative), Length(1, Relative), Length(1, Relative), Length(1, Relative)) : LengthBox());
- } else
- image.setBorderSlices(mapNinePieceImageQuad(value));
-
- if (isBorderImage)
- m_style->setBorderImage(image);
- else
- m_style->setMaskBoxImage(image);
- return;
- }
case CSSPropertyImageRendering:
HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(imageRendering, ImageRendering);
return;
@@ -3872,6 +3800,14 @@
case CSSPropertyBorderImage:
case CSSPropertyWebkitBorderImage:
case CSSPropertyWebkitMaskBoxImage:
+ case CSSPropertyBorderImageOutset:
+ case CSSPropertyWebkitMaskBoxImageOutset:
+ case CSSPropertyBorderImageRepeat:
+ case CSSPropertyWebkitMaskBoxImageRepeat:
+ case CSSPropertyBorderImageSlice:
+ case CSSPropertyWebkitMaskBoxImageSlice:
+ case CSSPropertyBorderImageWidth:
+ case CSSPropertyWebkitMaskBoxImageWidth:
case CSSPropertyBorderTop:
case CSSPropertyBorderRight:
case CSSPropertyBorderBottom:
Modified: trunk/Source/WebCore/css/CSSStyleSelector.h (102187 => 102188)
--- trunk/Source/WebCore/css/CSSStyleSelector.h 2011-12-06 23:49:19 UTC (rev 102187)
+++ trunk/Source/WebCore/css/CSSStyleSelector.h 2011-12-07 00:26:59 UTC (rev 102188)
@@ -330,11 +330,12 @@
void mapAnimationProperty(Animation*, CSSValue*);
void mapAnimationTimingFunction(Animation*, CSSValue*);
+public:
void mapNinePieceImage(CSSPropertyID, CSSValue*, NinePieceImage&);
void mapNinePieceImageSlice(CSSValue*, NinePieceImage&);
LengthBox mapNinePieceImageQuad(CSSValue*);
void mapNinePieceImageRepeat(CSSValue*, NinePieceImage&);
-
+private:
bool canShareStyleWithControl(StyledElement*) const;
void applyProperty(int id, CSSValue*);