Title: [102188] trunk/Source/WebCore
Revision
102188
Author
[email protected]
Date
2011-12-06 16:26:59 -0800 (Tue, 06 Dec 2011)

Log Message

Implement remaining border-image and webkit-maskbox-image properties in CSSStyleApplyProperty.
https://bugs.webkit.org/show_bug.cgi?id=73391

Reviewed by Hajime Morita.

No new tests / refacoring only.

* css/CSSStyleApplyProperty.cpp:
(WebCore::ApplyPropertyBorderImageModifier::getValue):
(WebCore::ApplyPropertyBorderImageModifier::setValue):
(WebCore::ApplyPropertyBorderImageModifier::applyInheritValue):
(WebCore::ApplyPropertyBorderImageModifier::applyInitialValue):
(WebCore::ApplyPropertyBorderImageModifier::applyValue):
(WebCore::ApplyPropertyBorderImageModifier::createHandler):
(WebCore::CSSStyleApplyProperty::CSSStyleApplyProperty):
* css/CSSStyleSelector.cpp:
(WebCore::CSSStyleSelector::applyProperty):
* css/CSSStyleSelector.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (102187 => 102188)


--- trunk/Source/WebCore/ChangeLog	2011-12-06 23:49:19 UTC (rev 102187)
+++ trunk/Source/WebCore/ChangeLog	2011-12-07 00:26:59 UTC (rev 102188)
@@ -1,3 +1,24 @@
+2011-12-06  Luke Macpherson   <[email protected]>
+
+        Implement remaining border-image and webkit-maskbox-image properties in CSSStyleApplyProperty.
+        https://bugs.webkit.org/show_bug.cgi?id=73391
+
+        Reviewed by Hajime Morita.
+
+        No new tests / refacoring only.
+
+        * css/CSSStyleApplyProperty.cpp:
+        (WebCore::ApplyPropertyBorderImageModifier::getValue):
+        (WebCore::ApplyPropertyBorderImageModifier::setValue):
+        (WebCore::ApplyPropertyBorderImageModifier::applyInheritValue):
+        (WebCore::ApplyPropertyBorderImageModifier::applyInitialValue):
+        (WebCore::ApplyPropertyBorderImageModifier::applyValue):
+        (WebCore::ApplyPropertyBorderImageModifier::createHandler):
+        (WebCore::CSSStyleApplyProperty::CSSStyleApplyProperty):
+        * css/CSSStyleSelector.cpp:
+        (WebCore::CSSStyleSelector::applyProperty):
+        * css/CSSStyleSelector.h:
+
 2011-12-06  Pavel Feldman  <[email protected]>
 
         Web Inspector: introduce a memory agent stub.

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*);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to