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())