Diff
Modified: trunk/LayoutTests/ChangeLog (110933 => 110934)
--- trunk/LayoutTests/ChangeLog 2012-03-16 03:13:28 UTC (rev 110933)
+++ trunk/LayoutTests/ChangeLog 2012-03-16 03:14:35 UTC (rev 110934)
@@ -1,3 +1,17 @@
+2012-03-15 Mike Lawther <[email protected]>
+
+ CSS3 calc: mixed percent/absolute expressions for gradients
+ https://bugs.webkit.org/show_bug.cgi?id=81182
+
+ Reviewed by Ojan Vafai.
+
+ Add new tests for mixed percent/absolute expressions.
+
+ * css3/calc/css3-radial-gradients-expected.html:
+ * css3/calc/css3-radial-gradients.html:
+ * css3/calc/gradient-color-stops-expected.html:
+ * css3/calc/gradient-color-stops.html:
+
2012-03-15 David Grogan <[email protected]>
IndexedDB Tests: use self instead of window
Modified: trunk/LayoutTests/css3/calc/css3-radial-gradients-expected.html (110933 => 110934)
--- trunk/LayoutTests/css3/calc/css3-radial-gradients-expected.html 2012-03-16 03:13:28 UTC (rev 110933)
+++ trunk/LayoutTests/css3/calc/css3-radial-gradients-expected.html 2012-03-16 03:14:35 UTC (rev 110934)
@@ -42,6 +42,11 @@
background-image: -webkit-radial-gradient(20% 20%, circle closest-corner, red -50%, green, blue 150%);
background-image: -moz-radial-gradient(20% 20%, circle closest-corner, red -50%, green, blue 150%);
}
+
+.gradient8 {
+ background-image: -webkit-radial-gradient(circle closest-side, red, green 40px, blue);
+ background-image: -moz-radial-gradient(circle closest-side, red, green 40px, blue);
+}
</style>
<body>
<div class="gradient1 box"></div>
@@ -53,4 +58,5 @@
<div class="gradient6 box"></div>
<br>
<div class="gradient7 box"></div>
+ <div class="gradient8 box"></div>
</body>
Modified: trunk/LayoutTests/css3/calc/css3-radial-gradients.html (110933 => 110934)
--- trunk/LayoutTests/css3/calc/css3-radial-gradients.html 2012-03-16 03:13:28 UTC (rev 110933)
+++ trunk/LayoutTests/css3/calc/css3-radial-gradients.html 2012-03-16 03:14:35 UTC (rev 110934)
@@ -42,6 +42,11 @@
background-image: -webkit-radial-gradient(-webkit-calc(20%) -webkit-calc(20%), circle closest-corner, red -50%, green, blue -webkit-calc(150%));
background-image: -moz-radial-gradient(-webkit-calc(20%) -webkit-calc(20%), circle closest-corner, red -50%, green, blue -webkit-calc(150%));
}
+
+.gradient8 {
+ background-image: -webkit-radial-gradient(circle closest-side, red, green -webkit-calc(50% + 10px), blue);
+ background-image: -moz-radial-gradient(circle closest-side, red, green -moz-calc(50% + 10px), blue);
+}
</style>
<body>
<div class="gradient1 box"></div>
@@ -53,4 +58,5 @@
<div class="gradient6 box"></div>
<br>
<div class="gradient7 box"></div>
+ <div class="gradient8 box"></div>
</body>
Modified: trunk/LayoutTests/css3/calc/gradient-color-stops-expected.html (110933 => 110934)
--- trunk/LayoutTests/css3/calc/gradient-color-stops-expected.html 2012-03-16 03:13:28 UTC (rev 110933)
+++ trunk/LayoutTests/css3/calc/gradient-color-stops-expected.html 2012-03-16 03:14:35 UTC (rev 110934)
@@ -33,6 +33,12 @@
background-image: -webkit-linear-gradient(left, red, green 120%, blue);
background-image: -moz-linear-gradient(left, red, green 120%, blue);
}
+
+.linear6 {
+ background-image: -webkit-linear-gradient(left, red, green 120px, blue);
+ background-image: -moz-linear-gradient(left, red, green 120px, blue);
+}
+
</style>
<body>
<div class="linear1 box"></div>
@@ -41,4 +47,5 @@
<br>
<div class="linear4 box"></div>
<div class="linear5 box"></div>
+ <div class="linear6 box"></div>
</body>
Modified: trunk/LayoutTests/css3/calc/gradient-color-stops.html (110933 => 110934)
--- trunk/LayoutTests/css3/calc/gradient-color-stops.html 2012-03-16 03:13:28 UTC (rev 110933)
+++ trunk/LayoutTests/css3/calc/gradient-color-stops.html 2012-03-16 03:14:35 UTC (rev 110934)
@@ -33,6 +33,11 @@
background-image: -webkit-linear-gradient(left, red, green -webkit-calc(120%), blue);
background-image: -moz-linear-gradient(left, red, green -webkit-calc(120%), blue);
}
+
+.linear6 {
+ background-image: -webkit-linear-gradient(left, red, green -webkit-calc(50% + 20px), blue);
+ background-image: -moz-linear-gradient(left, red, green -moz-calc(50% + 20px), blue);
+}
</style>
<body>
<div class="linear1 box"></div>
@@ -41,4 +46,5 @@
<br>
<div class="linear4 box"></div>
<div class="linear5 box"></div>
+ <div class="linear6 box"></div>
</body>
Modified: trunk/Source/WebCore/ChangeLog (110933 => 110934)
--- trunk/Source/WebCore/ChangeLog 2012-03-16 03:13:28 UTC (rev 110933)
+++ trunk/Source/WebCore/ChangeLog 2012-03-16 03:14:35 UTC (rev 110934)
@@ -1,3 +1,14 @@
+2012-03-15 Mike Lawther <[email protected]>
+
+ CSS3 calc: mixed percent/absolute expressions for gradients
+ https://bugs.webkit.org/show_bug.cgi?id=81182
+
+ Reviewed by Ojan Vafai.
+
+ * css/CSSGradientValue.cpp:
+ (WebCore::CSSGradientValue::addStops):
+ (WebCore::positionFromValue):
+
2012-03-15 Leo Yang <[email protected]>
[BlackBerry] Sync up MIMETypeRegistry.cpp
Modified: trunk/Source/WebCore/css/CSSGradientValue.cpp (110933 => 110934)
--- trunk/Source/WebCore/css/CSSGradientValue.cpp 2012-03-16 03:13:28 UTC (rev 110933)
+++ trunk/Source/WebCore/css/CSSGradientValue.cpp 2012-03-16 03:14:35 UTC (rev 110934)
@@ -26,6 +26,7 @@
#include "config.h"
#include "CSSGradientValue.h"
+#include "CSSCalculationValue.h"
#include "CSSStyleSelector.h"
#include "CSSValueKeywords.h"
#include "GeneratorGeneratedImage.h"
@@ -152,12 +153,16 @@
if (stop.m_position) {
if (stop.m_position->isPercentage())
stops[i].offset = stop.m_position->getFloatValue(CSSPrimitiveValue::CSS_PERCENTAGE) / 100;
- else if (stop.m_position->isLength()) {
- float length = stop.m_position->computeLength<float>(style, rootStyle, style->effectiveZoom());
+ else if (stop.m_position->isLength() || stop.m_position->isCalculatedPercentageWithLength()) {
if (!computedGradientLength) {
FloatSize gradientSize(gradientStart - gradientEnd);
gradientLength = gradientSize.diagonalLength();
}
+ float length;
+ if (stop.m_position->isLength())
+ length = stop.m_position->computeLength<float>(style, rootStyle, style->effectiveZoom());
+ else
+ length = stop.m_position->cssCalcValue()->toCalcValue(style, rootStyle, style->effectiveZoom())->evaluate(gradientLength);
stops[i].offset = (gradientLength > 0) ? length / gradientLength : 0;
} else {
ASSERT_NOT_REACHED();
@@ -365,9 +370,13 @@
if (value->isNumber())
return value->getFloatValue() * zoomFactor;
+ int edgeDistance = isHorizontal ? size.width() : size.height();
if (value->isPercentage())
- return value->getFloatValue() / 100.f * (isHorizontal ? size.width() : size.height());
+ return value->getFloatValue() / 100.f * edgeDistance;
+ if (value->isCalculatedPercentageWithLength())
+ return value->cssCalcValue()->toCalcValue(style, rootStyle, style->effectiveZoom())->evaluate(edgeDistance);
+
switch (value->getIdent()) {
case CSSValueTop:
ASSERT(!isHorizontal);