Title: [129579] trunk
Revision
129579
Author
[email protected]
Date
2012-09-25 18:17:50 -0700 (Tue, 25 Sep 2012)

Log Message

Ensure variables are resolved for specialized CSS primitive value types.
https://bugs.webkit.org/show_bug.cgi?id=95930

Reviewed by Tony Chang.

Source/WebCore:

Sometimes CSSPrimitiveValue contains a collection of other CSSPrimitiveValues (eg. 2, 4 or n).
This patch makes sure any variables contained inside those child values are resolved.

Tests: fast/css/variables/root-background-size.html
       fast/css/variables/var-inside-pair.html
       fast/css/variables/var-inside-quad.html
       fast/css/variables/var-inside-shape.html

* css/CSSBasicShapes.cpp:
(WebCore::buildRectangleString):
(WebCore::CSSBasicShapeRectangle::cssText):
(WebCore):
(WebCore::CSSBasicShapeRectangle::serializeResolvingVariables):
Generates a string representation of this value with variables resolved from the provided HashMap of variables.
(WebCore::CSSBasicShapeRectangle::hasVariableReference):
Returns true if any of the values used to describe the rectange depend on the value of a variable.
(WebCore::buildCircleString):
(WebCore::CSSBasicShapeCircle::cssText):
(WebCore::CSSBasicShapeCircle::serializeResolvingVariables):
(WebCore::CSSBasicShapeCircle::hasVariableReference):
(WebCore::buildEllipseString):
(WebCore::CSSBasicShapeEllipse::cssText):
(WebCore::CSSBasicShapeEllipse::serializeResolvingVariables):
(WebCore::CSSBasicShapeEllipse::hasVariableReference):
(WebCore::CSSBasicShapePolygon::serializeResolvingVariables):
(WebCore::CSSBasicShapePolygon::hasVariableReference):
* css/CSSBasicShapes.h:
(CSSBasicShapeRectangle):
(CSSBasicShapeCircle):
(CSSBasicShapeEllipse):
(CSSBasicShapePolygon):
* css/CSSPrimitiveValue.cpp:
(WebCore::CSSPrimitiveValue::customCssText):
Move the logic for generating the strings for Rects, Quads, Pairs and Shapes into their respective classes.
(WebCore::CSSPrimitiveValue::customSerializeResolvingVariables):
Handle Rects, Quads, Pairs and Shapes when they contain variables, by calling their serializeResolvingVariables method.
(WebCore):
(WebCore::CSSPrimitiveValue::hasVariableReference):
Handle Rects, Quads, Pairs and Shapes by calling their respective hasVariableReference methods.
* css/CSSPrimitiveValue.h:
(CSSPrimitiveValue):
* css/Pair.h:
(WebCore::Pair::pairString):
(Pair):
(WebCore::Pair::cssText):
(WebCore::Pair::serializeResolvingVariables):
(WebCore::Pair::hasVariableReference):
* css/Rect.h:
(RectBase):
(WebCore::RectBase::hasVariableReference):
(WebCore::Rect::rectString):
(Rect):
(WebCore::Rect::cssText):
(WebCore::Rect::serializeResolvingVariables):
(WebCore::Quad::quadString):
(Quad):
(WebCore::Quad::cssText):
(WebCore::Quad::serializeResolvingVariables):
* css/StyleResolver.cpp:
(WebCore::StyleResolver::collectMatchingRulesForList):

LayoutTests:

Add tests that use specialized CSS values (eg. pairs, quads, rectangle, circle, ellipse etc.).

* fast/css/variables/root-background-size-expected.html: Added.
* fast/css/variables/root-background-size.html: Added.
* fast/css/variables/var-inside-pair-expected.html: Added.
* fast/css/variables/var-inside-pair.html: Added.
* fast/css/variables/var-inside-quad-expected.html: Added.
* fast/css/variables/var-inside-quad.html: Added.
* fast/css/variables/var-inside-shape-expected.html: Added.
* fast/css/variables/var-inside-shape.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (129578 => 129579)


--- trunk/LayoutTests/ChangeLog	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/LayoutTests/ChangeLog	2012-09-26 01:17:50 UTC (rev 129579)
@@ -1,3 +1,21 @@
+2012-09-25  Luke Macpherson   <[email protected]>
+
+        Ensure variables are resolved for specialized CSS primitive value types.
+        https://bugs.webkit.org/show_bug.cgi?id=95930
+
+        Reviewed by Tony Chang.
+
+        Add tests that use specialized CSS values (eg. pairs, quads, rectangle, circle, ellipse etc.).
+
+        * fast/css/variables/root-background-size-expected.html: Added.
+        * fast/css/variables/root-background-size.html: Added.
+        * fast/css/variables/var-inside-pair-expected.html: Added.
+        * fast/css/variables/var-inside-pair.html: Added.
+        * fast/css/variables/var-inside-quad-expected.html: Added.
+        * fast/css/variables/var-inside-quad.html: Added.
+        * fast/css/variables/var-inside-shape-expected.html: Added.
+        * fast/css/variables/var-inside-shape.html: Added.
+
 2012-09-25  Mike West  <[email protected]>
 
         CSP logging: Be more developer-friendly when 'default-src' is violated.

Added: trunk/LayoutTests/fast/css/variables/root-background-size-expected.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/root-background-size-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/root-background-size-expected.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<html>
+This test is successful if it does not crash.
+</html>

Added: trunk/LayoutTests/fast/css/variables/root-background-size.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/root-background-size.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/root-background-size.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<script>
+if (window.internals)
+    internals.settings.setCSSVariablesEnabled(true);
+</script>
+<style>
+:root {
+  -webkit-background-size: -webkit-calc(-webkit-var(a));
+}
+</style>
+<style></style>
+This test is successful if it does not crash.
+</html>

Added: trunk/LayoutTests/fast/css/variables/var-inside-pair-expected.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/var-inside-pair-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/var-inside-pair-expected.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<style>
+body {
+    border: 1px solid green;
+    border-top-left-radius: 3px 6px;
+}
+</style>
+This text should be surrounded by a green border with a rounded top left corner.
+</html>

Added: trunk/LayoutTests/fast/css/variables/var-inside-pair.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/var-inside-pair.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/var-inside-pair.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<script>
+if (window.internals)
+    internals.settings.setCSSVariablesEnabled(true);
+</script>
+<style>
+body {
+    border: 1px solid green;
+    border-top-left-radius: -webkit-var(a) -webkit-var(b);
+    -webkit-var-a: 3px;
+    -webkit-var-b: 6px;
+}
+</style>
+This text should be surrounded by a green border with a rounded top left corner.
+</html>

Added: trunk/LayoutTests/fast/css/variables/var-inside-quad-expected.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/var-inside-quad-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/var-inside-quad-expected.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+<style>
+body {
+    border-color: green;
+    border-width: 1px 2px 3px 4px;
+    border-style: solid;
+}
+</style>
+This text should be surrounded by a green border with 1px top, 2px right, 3px bottom, 4px left.
+</html>

Added: trunk/LayoutTests/fast/css/variables/var-inside-quad.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/var-inside-quad.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/var-inside-quad.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<script>
+if (window.internals)
+    internals.settings.setCSSVariablesEnabled(true);
+</script>
+<style>
+body {
+    border-color: green;
+    border-width: -webkit-var(a) -webkit-var(b) -webkit-var(c) -webkit-var(d);
+    border-style: solid;
+    -webkit-var-a: 1px;
+    -webkit-var-b: 2px;
+    -webkit-var-c: 3px;
+    -webkit-var-d: 4px;
+}
+</style>
+This text should be surrounded by a green border with 1px top, 2px right, 3px bottom, 4px left.
+</html>

Added: trunk/LayoutTests/fast/css/variables/var-inside-shape-expected.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/var-inside-shape-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/var-inside-shape-expected.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<style>
+.a {
+    -webkit-shape-inside: ellipse(100px, 100px, 100px, 100px);
+}
+.b {
+    -webkit-shape-inside: circle(100px, 100px, 100px);
+}
+.c {
+    -webkit-shape-inside: rectange(100px);
+}
+.d {
+    -webkit-shape-inside: polygon(100px, 100px, 100px, 100px, 100px);
+}
+</style>
+<div class="a">
+Some text.
+</div>
+<div class="b">
+Some text.
+</div>
+<div class="c">
+Some text.
+</div>
+<div class="d">
+Some text.
+</div>
+</html>

Added: trunk/LayoutTests/fast/css/variables/var-inside-shape.html (0 => 129579)


--- trunk/LayoutTests/fast/css/variables/var-inside-shape.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/variables/var-inside-shape.html	2012-09-26 01:17:50 UTC (rev 129579)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<script>
+if (window.internals)
+    internals.settings.setCSSVariablesEnabled(true);
+</script>
+<style>
+:root {
+    -webkit-var-a: 100px;
+}
+.a {
+    -webkit-shape-inside: ellipse(-webkit-var(a), -webkit-var(a), -webkit-var(a), -webkit-var(a));
+}
+.b {
+    -webkit-shape-inside: circle(-webkit-var(a), -webkit-var(a), -webkit-var(a)));
+}
+.c {
+    -webkit-shape-inside: rectange(-webkit-var(a));
+}
+.d {
+    -webkit-shape-inside: polygon(-webkit-var(a), -webkit-var(a), -webkit-var(a), -webkit-var(a));
+}
+</style>
+<div class="a">
+Some text.
+</div>
+<div class="b">
+Some text.
+</div>
+<div class="c">
+Some text.
+</div>
+<div class="d">
+Some text.
+</div>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (129578 => 129579)


--- trunk/Source/WebCore/ChangeLog	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/ChangeLog	2012-09-26 01:17:50 UTC (rev 129579)
@@ -1,3 +1,71 @@
+2012-09-25  Luke Macpherson   <[email protected]>
+
+        Ensure variables are resolved for specialized CSS primitive value types.
+        https://bugs.webkit.org/show_bug.cgi?id=95930
+
+        Reviewed by Tony Chang.
+
+        Sometimes CSSPrimitiveValue contains a collection of other CSSPrimitiveValues (eg. 2, 4 or n).
+        This patch makes sure any variables contained inside those child values are resolved.
+
+        Tests: fast/css/variables/root-background-size.html
+               fast/css/variables/var-inside-pair.html
+               fast/css/variables/var-inside-quad.html
+               fast/css/variables/var-inside-shape.html
+
+        * css/CSSBasicShapes.cpp:
+        (WebCore::buildRectangleString):
+        (WebCore::CSSBasicShapeRectangle::cssText):
+        (WebCore):
+        (WebCore::CSSBasicShapeRectangle::serializeResolvingVariables):
+        Generates a string representation of this value with variables resolved from the provided HashMap of variables.
+        (WebCore::CSSBasicShapeRectangle::hasVariableReference):
+        Returns true if any of the values used to describe the rectange depend on the value of a variable.
+        (WebCore::buildCircleString):
+        (WebCore::CSSBasicShapeCircle::cssText):
+        (WebCore::CSSBasicShapeCircle::serializeResolvingVariables):
+        (WebCore::CSSBasicShapeCircle::hasVariableReference):
+        (WebCore::buildEllipseString):
+        (WebCore::CSSBasicShapeEllipse::cssText):
+        (WebCore::CSSBasicShapeEllipse::serializeResolvingVariables):
+        (WebCore::CSSBasicShapeEllipse::hasVariableReference):
+        (WebCore::CSSBasicShapePolygon::serializeResolvingVariables):
+        (WebCore::CSSBasicShapePolygon::hasVariableReference):
+        * css/CSSBasicShapes.h:
+        (CSSBasicShapeRectangle):
+        (CSSBasicShapeCircle):
+        (CSSBasicShapeEllipse):
+        (CSSBasicShapePolygon):
+        * css/CSSPrimitiveValue.cpp:
+        (WebCore::CSSPrimitiveValue::customCssText):
+        Move the logic for generating the strings for Rects, Quads, Pairs and Shapes into their respective classes.
+        (WebCore::CSSPrimitiveValue::customSerializeResolvingVariables):
+        Handle Rects, Quads, Pairs and Shapes when they contain variables, by calling their serializeResolvingVariables method.
+        (WebCore):
+        (WebCore::CSSPrimitiveValue::hasVariableReference):
+        Handle Rects, Quads, Pairs and Shapes by calling their respective hasVariableReference methods.
+        * css/CSSPrimitiveValue.h:
+        (CSSPrimitiveValue):
+        * css/Pair.h:
+        (WebCore::Pair::pairString):
+        (Pair):
+        (WebCore::Pair::cssText):
+        (WebCore::Pair::serializeResolvingVariables):
+        (WebCore::Pair::hasVariableReference):
+        * css/Rect.h:
+        (RectBase):
+        (WebCore::RectBase::hasVariableReference):
+        (WebCore::Rect::rectString):
+        (Rect):
+        (WebCore::Rect::cssText):
+        (WebCore::Rect::serializeResolvingVariables):
+        (WebCore::Quad::quadString):
+        (Quad):
+        (WebCore::Quad::cssText):
+        (WebCore::Quad::serializeResolvingVariables):
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::collectMatchingRulesForList):
+
 2012-09-25  Filip Pizlo  <[email protected]>
 
         JSC bindings appear to sometimes ignore the possibility of arrays being in sparse mode

Modified: trunk/Source/WebCore/css/CSSBasicShapes.cpp (129578 => 129579)


--- trunk/Source/WebCore/css/CSSBasicShapes.cpp	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/css/CSSBasicShapes.cpp	2012-09-26 01:17:50 UTC (rev 129579)
@@ -37,97 +37,132 @@
 
 namespace WebCore {
 
-String CSSBasicShapeRectangle::cssText() const
+static String buildRectangleString(const String& x, const String& y, const String& width, const String& height, const String& radiusX, const String& radiusY)
 {
     StringBuilder result;
-    result.reserveCapacity(32);
-
     result.appendLiteral("rectangle(");
-
-    result.append(m_x->cssText());
+    result.append(x);
     result.appendLiteral(", ");
-
-    result.append(m_y->cssText());
+    result.append(y);
     result.appendLiteral(", ");
-
-    result.append(m_width->cssText());
+    result.append(width);
     result.appendLiteral(", ");
-
-    result.append(m_height->cssText());
-
-    if (m_radiusX.get()) {
+    result.append(height);
+    if (!radiusX.isNull()) {
         result.appendLiteral(", ");
-        result.append(m_radiusX->cssText());
-
-        if (m_radiusY.get()) {
+        result.append(radiusX);
+        if (!radiusY.isNull()) {
             result.appendLiteral(", ");
-            result.append(m_radiusY->cssText());
+            result.append(radiusY);
         }
     }
-
     result.append(')');
-
     return result.toString();
 }
 
-String CSSBasicShapeCircle::cssText() const
+String CSSBasicShapeRectangle::cssText() const
 {
-    StringBuilder result;
-    result.reserveCapacity(32);
+    return buildRectangleString(m_x->cssText(),
+                                m_y->cssText(),
+                                m_width->cssText(),
+                                m_height->cssText(),
+                                m_radiusX.get() ? m_radiusX->cssText() : String(),
+                                m_radiusY.get() ? m_radiusY->cssText() : String());
+}
 
-    result.appendLiteral("circle(");
+#if ENABLE(CSS_VARIABLES)
+String CSSBasicShapeRectangle::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+{
+    return buildRectangleString(m_x->serializeResolvingVariables(variables),
+                                m_y->serializeResolvingVariables(variables),
+                                m_width->serializeResolvingVariables(variables),
+                                m_height->serializeResolvingVariables(variables),
+                                m_radiusX.get() ? m_radiusX->serializeResolvingVariables(variables) : String(),
+                                m_radiusY.get() ? m_radiusY->serializeResolvingVariables(variables) : String());
+}
 
-    result.append(m_centerX->cssText());
-    result.appendLiteral(", ");
+bool CSSBasicShapeRectangle::hasVariableReference() const
+{
+    return m_x->hasVariableReference()
+        || m_y->hasVariableReference()
+        || m_width->hasVariableReference()
+        || m_height->hasVariableReference()
+        || (m_radiusX.get() && m_radiusX->hasVariableReference())
+        || (m_radiusY.get() && m_radiusY->hasVariableReference());
+}
+#endif
 
-    result.append(m_centerY->cssText());
-    result.appendLiteral(", ");
+static String buildCircleString(const String& x, const String& y, const String& radius)
+{
+    return "circle(" + x + ", " + y + ", " + radius + ')';
+}
 
-    result.append(m_radius->cssText());
-    result.append(')');
+String CSSBasicShapeCircle::cssText() const
+{
+    return buildCircleString(m_centerX->cssText(), m_centerY->cssText(), m_radius->cssText());
+}
 
-    return result.toString();
+#if ENABLE(CSS_VARIABLES)
+String CSSBasicShapeCircle::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+{
+    return buildCircleString(m_centerX->serializeResolvingVariables(variables),
+                             m_centerY->serializeResolvingVariables(variables),
+                             m_radius->serializeResolvingVariables(variables));
 }
 
-String CSSBasicShapeEllipse::cssText() const
+bool CSSBasicShapeCircle::hasVariableReference() const
 {
-    StringBuilder result;
-    result.reserveCapacity(32);
-    result.appendLiteral("ellipse(");
+    return m_centerX->hasVariableReference()
+        || m_centerY->hasVariableReference()
+        || m_radius->hasVariableReference();
+}
+#endif
 
-    result.append(m_centerX->cssText());
-    result.appendLiteral(", ");
+static String buildEllipseString(const String& x, const String& y, const String& radiusX, const String& radiusY)
+{
+    return "ellipse(" + x + ", " + y + ", " + radiusX + ", " + radiusY + ')';
+}
 
-    result.append(m_centerY->cssText());
-    result.appendLiteral(", ");
+String CSSBasicShapeEllipse::cssText() const
+{
+    return buildEllipseString(m_centerX->cssText(), m_centerY->cssText(), m_radiusX->cssText(), m_radiusY->cssText());
+}
 
-    result.append(m_radiusX->cssText());
-    result.appendLiteral(", ");
+#if ENABLE(CSS_VARIABLES)
+String CSSBasicShapeEllipse::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+{
+    return buildEllipseString(m_centerX->serializeResolvingVariables(variables),
+                              m_centerY->serializeResolvingVariables(variables),
+                              m_radiusX->serializeResolvingVariables(variables),
+                              m_radiusY->serializeResolvingVariables(variables));
+}
 
-    result.append(m_radiusY->cssText());
-    result.append(')');
-
-    return result.toString();
+bool CSSBasicShapeEllipse::hasVariableReference() const
+{
+    return m_centerX->hasVariableReference()
+        || m_centerY->hasVariableReference()
+        || m_radiusX->hasVariableReference()
+        || m_radiusY->hasVariableReference();
 }
+#endif
 
-String CSSBasicShapePolygon::cssText() const
+static String buildPolygonString(const WindRule& windRule, const Vector<String>& points)
 {
     StringBuilder result;
-    result.reserveCapacity(32);
 
-    if (m_windRule == RULE_EVENODD)
+    if (windRule == RULE_EVENODD)
         result.appendLiteral("polygon(evenodd, ");
     else
         result.appendLiteral("polygon(nonzero, ");
 
-    ASSERT(!(m_values.size() % 2));
+    ASSERT(!(points.size() % 2));
 
-    for (unsigned i = 0; i < m_values.size(); i += 2) {
+    for (size_t i = 0; i < points.size(); i += 2) {
         if (i)
             result.appendLiteral(", ");
-        result.append(m_values.at(i)->cssText());
+        result.append(points[i]);
         result.append(' ');
-        result.append(m_values.at(i + 1)->cssText());
+        result.append(points[i + 1]);
     }
 
     result.append(')');
@@ -135,5 +170,38 @@
     return result.toString();
 }
 
+String CSSBasicShapePolygon::cssText() const
+{
+    Vector<String> points;
+    points.reserveInitialCapacity(m_values.size());
+
+    for (size_t i = 0; i < m_values.size(); ++i)
+        points.append(m_values.at(i)->cssText());
+
+    return buildPolygonString(m_windRule, points);
+}
+
+#if ENABLE(CSS_VARIABLES)
+String CSSBasicShapePolygon::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+{
+    Vector<String> points;
+    points.reserveInitialCapacity(m_values.size());
+
+    for (size_t i = 0; i < m_values.size(); ++i)
+        points.append(m_values.at(i)->serializeResolvingVariables(variables));
+
+    return buildPolygonString(m_windRule, points);
+}
+
+bool CSSBasicShapePolygon::hasVariableReference() const
+{
+    for (size_t i = 0; i < m_values.size(); ++i) {
+        if (m_values.at(i)->hasVariableReference())
+            return true;
+    }
+    return false;
+}
+#endif
+
 } // namespace WebCore
 

Modified: trunk/Source/WebCore/css/CSSBasicShapes.h (129578 => 129579)


--- trunk/Source/WebCore/css/CSSBasicShapes.h	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/css/CSSBasicShapes.h	2012-09-26 01:17:50 UTC (rev 129579)
@@ -50,6 +50,11 @@
     virtual Type type() const = 0;
     virtual String cssText() const = 0;
 
+#if ENABLE(CSS_VARIABLES)
+    virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const = 0;
+    virtual bool hasVariableReference() const = 0;
+#endif
+
 public:
     virtual ~CSSBasicShape() { }
 
@@ -78,6 +83,11 @@
     virtual Type type() const { return CSS_BASIC_SHAPE_RECTANGLE; }
     virtual String cssText() const;
 
+#if ENABLE(CSS_VARIABLES)
+    virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const;
+    virtual bool hasVariableReference() const;
+#endif
+
 private:
     CSSBasicShapeRectangle() { }
 
@@ -104,6 +114,11 @@
     virtual Type type() const { return CSS_BASIC_SHAPE_CIRCLE; }
     virtual String cssText() const;
 
+#if ENABLE(CSS_VARIABLES)
+    virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const;
+    virtual bool hasVariableReference() const;
+#endif
+
 private:
     CSSBasicShapeCircle() { }
 
@@ -129,6 +144,11 @@
     virtual Type type() const { return CSS_BASIC_SHAPE_ELLIPSE; }
     virtual String cssText() const;
 
+#if ENABLE(CSS_VARIABLES)
+    virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const;
+    virtual bool hasVariableReference() const;
+#endif
+
 private:
     CSSBasicShapeEllipse() { }
 
@@ -158,6 +178,11 @@
     virtual Type type() const { return CSS_BASIC_SHAPE_POLYGON; }
     virtual String cssText() const;
 
+#if ENABLE(CSS_VARIABLES)
+    virtual String serializeResolvingVariables(const HashMap<AtomicString, String>&) const;
+    virtual bool hasVariableReference() const;
+#endif
+
 private:
     CSSBasicShapePolygon()
         : m_windRule(RULE_NONZERO)

Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.cpp (129578 => 129579)


--- trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2012-09-26 01:17:50 UTC (rev 129579)
@@ -988,31 +988,12 @@
             text = result.toString();
             break;
         }
-        case CSS_RECT: {
-            Rect* rectVal = getRectValue();
-            text = "rect(" + rectVal->top()->cssText() + ' ' + rectVal->right()->cssText() + ' ' + rectVal->bottom()->cssText() + ' ' + rectVal->left()->cssText() + ')';
+        case CSS_RECT:
+            text = getRectValue()->cssText();
             break;
-        }
-        case CSS_QUAD: {
-            Quad* quadVal = getQuadValue();
-            Vector<UChar> result;
-            result.reserveInitialCapacity(32);
-            append(result, quadVal->top()->cssText());
-            if (quadVal->right() != quadVal->top() || quadVal->bottom() != quadVal->top() || quadVal->left() != quadVal->top()) {
-                result.append(' ');
-                append(result, quadVal->right()->cssText());
-                if (quadVal->bottom() != quadVal->top() || quadVal->right() != quadVal->left()) {
-                    result.append(' ');
-                    append(result, quadVal->bottom()->cssText());
-                    if (quadVal->left() != quadVal->right()) {
-                        result.append(' ');
-                        append(result, quadVal->left()->cssText());
-                    }
-                }
-            }
-            text = String::adopt(result);
+        case CSS_QUAD:
+            text = getQuadValue()->cssText();
             break;
-        }
         case CSS_RGBCOLOR:
         case CSS_PARSER_HEXCOLOR: {
             RGBA32 rgbColor = m_value.rgbcolor;
@@ -1047,16 +1028,9 @@
             text = String::adopt(result);
             break;
         }
-        case CSS_PAIR: {
-            StringBuilder result;
-            result.append(m_value.pair->first()->cssText());
-            if (m_value.pair->second() != m_value.pair->first()) {
-                result.append(' ');
-                result.append(m_value.pair->second()->cssText());
-            }
-            text = result.toString();
+        case CSS_PAIR:
+            text = getPairValue()->cssText();
             break;
-        }
 #if ENABLE(DASHBOARD_SUPPORT) || ENABLE(WIDGET_REGION)
         case CSS_DASHBOARD_REGION: {
             StringBuilder result;
@@ -1141,10 +1115,33 @@
 {
     if (isVariableName() && variables.contains(m_value.string))
         return variables.get(m_value.string);
-    if (isCalculated())
-        return cssCalcValue()->customSerializeResolvingVariables(variables);
+    if (CSSCalcValue* calcValue = cssCalcValue())
+        return calcValue->customSerializeResolvingVariables(variables);
+    if (Pair* pairValue = getPairValue())
+        return pairValue->serializeResolvingVariables(variables);
+    if (Rect* rectVal = getRectValue())
+        return rectVal->serializeResolvingVariables(variables);
+    if (Quad* quadVal = getQuadValue())
+        return quadVal->serializeResolvingVariables(variables);
+    if (CSSBasicShape* shapeValue = getShapeValue())
+        return shapeValue->serializeResolvingVariables(variables);
     return customCssText();
 }
+
+bool CSSPrimitiveValue::hasVariableReference() const
+{
+    if (CSSCalcValue* calcValue = cssCalcValue())
+        return calcValue->hasVariableReference();
+    if (Pair* pairValue = getPairValue())
+        return pairValue->hasVariableReference();
+    if (Quad* quadValue = getQuadValue())
+        return quadValue->hasVariableReference();
+    if (Rect* rectValue = getRectValue())
+        return rectValue->hasVariableReference();
+    if (CSSBasicShape* shapeValue = getShapeValue())
+        return shapeValue->hasVariableReference();
+    return isVariableName();
+}
 #endif
 
 void CSSPrimitiveValue::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const StyleSheetContents* styleSheet) const

Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.h (129578 => 129579)


--- trunk/Source/WebCore/css/CSSPrimitiveValue.h	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.h	2012-09-26 01:17:50 UTC (rev 129579)
@@ -299,6 +299,7 @@
     String customCssText() const;
 #if ENABLE(CSS_VARIABLES)
     String customSerializeResolvingVariables(const HashMap<AtomicString, String>&) const;
+    bool hasVariableReference() const;
 #endif
 
     bool isQuirkValue() { return m_isQuirkValue; }

Modified: trunk/Source/WebCore/css/Pair.h (129578 => 129579)


--- trunk/Source/WebCore/css/Pair.h	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/css/Pair.h	2012-09-26 01:17:50 UTC (rev 129579)
@@ -24,6 +24,7 @@
 #include <wtf/RefCounted.h>
 #include "CSSPrimitiveValue.h"
 #include <wtf/PassRefPtr.h>
+#include <wtf/text/StringBuilder.h>
 
 namespace WebCore {
 
@@ -49,11 +50,34 @@
     void setFirst(PassRefPtr<CSSPrimitiveValue> first) { m_first = first; }
     void setSecond(PassRefPtr<CSSPrimitiveValue> second) { m_second = second; }
 
+    String cssText() const
+    {
+    
+        return generateCSSString(first()->cssText(), second()->cssText());
+    }
+
+#if ENABLE(CSS_VARIABLES)
+    String serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+    {
+        return generateCSSString(first()->customSerializeResolvingVariables(variables),
+                                 second()->customSerializeResolvingVariables(variables));
+    }
+    
+    bool hasVariableReference() const { return first()->hasVariableReference() || second()->hasVariableReference(); }
+#endif
+
 private:
     Pair() : m_first(0), m_second(0) { }
     Pair(PassRefPtr<CSSPrimitiveValue> first, PassRefPtr<CSSPrimitiveValue> second)
         : m_first(first), m_second(second) { }
 
+    static String generateCSSString(const String& first, const String& second)
+    {
+        if (first == second)
+            return first;
+        return first + ' ' + second;
+    }
+
     RefPtr<CSSPrimitiveValue> m_first;
     RefPtr<CSSPrimitiveValue> m_second;
 };

Modified: trunk/Source/WebCore/css/Rect.h (129578 => 129579)


--- trunk/Source/WebCore/css/Rect.h	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/css/Rect.h	2012-09-26 01:17:50 UTC (rev 129579)
@@ -23,6 +23,7 @@
 
 #include "CSSPrimitiveValue.h"
 #include <wtf/RefPtr.h>
+#include <wtf/text/StringBuilder.h>
 
 namespace WebCore {
 
@@ -38,6 +39,16 @@
     void setBottom(PassRefPtr<CSSPrimitiveValue> bottom) { m_bottom = bottom; }
     void setLeft(PassRefPtr<CSSPrimitiveValue> left) { m_left = left; }
 
+#if ENABLE(CSS_VARIABLES)
+    bool hasVariableReference() const
+    {
+        return m_top->hasVariableReference()
+            || m_right->hasVariableReference()
+            || m_bottom->hasVariableReference()
+            || m_left->hasVariableReference();
+    }
+#endif
+
 protected:
     RectBase() { }
     RectBase(const RectBase& cloneFrom)
@@ -63,9 +74,28 @@
     
     PassRefPtr<Rect> cloneForCSSOM() const { return adoptRef(new Rect(*this)); }
 
+    String cssText() const
+    {
+        return generateCSSString(top()->cssText(), right()->cssText(), bottom()->cssText(), left()->cssText());
+    }
+
+#if ENABLE(CSS_VARIABLES)
+    String serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+    {
+        return generateCSSString(top()->customSerializeResolvingVariables(variables),
+                                 right()->customSerializeResolvingVariables(variables),
+                                 bottom()->customSerializeResolvingVariables(variables),
+                                 left()->customSerializeResolvingVariables(variables));
+    }
+#endif
+
 private:
     Rect() { }
     Rect(const Rect& cloneFrom) : RectBase(cloneFrom), RefCounted<Rect>() { }
+    static String generateCSSString(const String& top, const String& right, const String& bottom, const String& left)
+    {
+        return "rect(" + top + ' ' + right + ' ' + bottom + ' ' + left + ')';
+    }
 };
 
 class Quad : public RectBase, public RefCounted<Quad> {
@@ -74,9 +104,42 @@
     
     PassRefPtr<Quad> cloneForCSSOM() const { return adoptRef(new Quad(*this)); }
 
+    String cssText() const
+    {
+        return generateCSSString(top()->cssText(), right()->cssText(), bottom()->cssText(), left()->cssText());
+    }
+
+#if ENABLE(CSS_VARIABLES)
+    String serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
+    {
+        return generateCSSString(top()->customSerializeResolvingVariables(variables),
+                                 right()->customSerializeResolvingVariables(variables),
+                                 bottom()->customSerializeResolvingVariables(variables),
+                                 left()->customSerializeResolvingVariables(variables));
+    }
+#endif
+
 private:
     Quad() { }
     Quad(const Quad& cloneFrom) : RectBase(cloneFrom), RefCounted<Quad>() { }
+    static String generateCSSString(const String& top, const String& right, const String& bottom, const String& left)
+    {
+        StringBuilder result;
+        result.append(top);
+        if (right != top || bottom != top || left != top) {
+            result.append(' ');
+            result.append(right);
+            if (bottom != top || right != left) {
+                result.append(' ');
+                result.append(bottom);
+                if (left != right) {
+                    result.append(' ');
+                    result.append(left);
+                }
+            }
+        }
+        return result.toString();
+    }
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/css/StyleResolver.cpp (129578 => 129579)


--- trunk/Source/WebCore/css/StyleResolver.cpp	2012-09-26 00:24:02 UTC (rev 129578)
+++ trunk/Source/WebCore/css/StyleResolver.cpp	2012-09-26 01:17:50 UTC (rev 129579)
@@ -3359,9 +3359,7 @@
 {
     if (value->isPrimitiveValue()) {
         CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
-        if (CSSCalcValue* calcValue = primitiveValue->cssCalcValue())
-            return calcValue->hasVariableReference();
-        return primitiveValue->isVariableName();
+        return primitiveValue->hasVariableReference();
     }
 
     if (value->isCalculationValue())
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to