Commit 37a9256b authored by zoltan@webkit.org's avatar zoltan@webkit.org

[CSS Shapes] Support inset parsing

https://bugs.webkit.org/show_bug.cgi?id=124903

Reviewed by David Hyatt.

Source/WebCore:

In this patch I added support for inset shape parsing for CSS Shapes. Inset is defined
by CSS Shapes Level 1 (http://dev.w3.org/csswg/css-shapes-1/#supported-basic-shapes).
Inset is going to be used by shape-outside (bug #124905), and eventually by shape-inside.

No new tests, I updated existing tests to cover the changes.

* css/BasicShapeFunctions.cpp:
(WebCore::valueForBasicShape): Add support for inset.
(WebCore::basicShapeForValue): Add support for inset.
* css/CSSBasicShapes.cpp:
(WebCore::buildInsetString): Create inset css string.
(WebCore::CSSBasicShapeInset::cssText): Convert inset shape to a CSS string.
(WebCore::CSSBasicShapeInset::equals): Compare two inset rectangles.
(WebCore::CSSBasicShapeInset::serializeResolvingVariables): Create an inset string, with CSS variables resolved.
(WebCore::CSSBasicShapeInset::hasVariableReference): Determine if this inset has any CSS Variable references.
* css/CSSBasicShapes.h: Add inset class.
(WebCore::CSSBasicShapeInset::create):
(WebCore::CSSBasicShapeInset::top):
(WebCore::CSSBasicShapeInset::right):
(WebCore::CSSBasicShapeInset::bottom):
(WebCore::CSSBasicShapeInset::left):
(WebCore::CSSBasicShapeInset::topLeftRadius):
(WebCore::CSSBasicShapeInset::topRightRadius):
(WebCore::CSSBasicShapeInset::bottomRightRadius):
(WebCore::CSSBasicShapeInset::bottomLeftRadius):
(WebCore::CSSBasicShapeInset::setTop):
(WebCore::CSSBasicShapeInset::setRight):
(WebCore::CSSBasicShapeInset::setBottom):
(WebCore::CSSBasicShapeInset::setLeft):
(WebCore::CSSBasicShapeInset::setTopLeftRadius):
(WebCore::CSSBasicShapeInset::setTopRightRadius):
(WebCore::CSSBasicShapeInset::setBottomRightRadius):
(WebCore::CSSBasicShapeInset::setBottomLeftRadius):
(WebCore::CSSBasicShapeInset::CSSBasicShapeInset):
* css/CSSParser.cpp:
(WebCore::completeBorderRadii): Move static function before parseInsetBorderRadius.
(WebCore::CSSParser::parseInsetRoundedCorners): I added this helper function for parsing the rounded corners
(WebCore::CSSParser::parseBasicShapeInset): Parse inset.
(WebCore::CSSParser::parseBasicShape): Add call to parse inset.
* css/CSSParser.h:
* css/CSSPrimitiveValue.cpp:
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Add constructor for LengthSize.
(WebCore::CSSPrimitiveValue::init): Initialize LengthSize.
* css/CSSPrimitiveValue.h:
(WebCore::CSSPrimitiveValue::create): Add support for creating PrimitiveValue from LengthSize.
* css/CSSValuePool.h:
(WebCore::CSSValuePool::createValue): Add support for LengthSize.
* platform/LengthSize.h:
(WebCore::LengthSize::blend): Add blend for LengthSize.
* rendering/shapes/ShapeInsideInfo.cpp:
(WebCore::ShapeInsideInfo::isEnabledFor): Keep inset disabled for shape-inside now.
* rendering/style/BasicShapes.cpp:
(WebCore::BasicShapeInset::path): Calculate path for an inset.
(WebCore::BasicShapeInset::blend): Blend two insets.
* rendering/style/BasicShapes.h: Add higher level inset.
(WebCore::BasicShapeInset::create):
(WebCore::BasicShapeInset::top):
(WebCore::BasicShapeInset::right):
(WebCore::BasicShapeInset::bottom):
(WebCore::BasicShapeInset::left):
(WebCore::BasicShapeInset::topLeftRadius):
(WebCore::BasicShapeInset::topRightRadius):
(WebCore::BasicShapeInset::bottomRightRadius):
(WebCore::BasicShapeInset::bottomLeftRadius):
(WebCore::BasicShapeInset::setTop):
(WebCore::BasicShapeInset::setRight):
(WebCore::BasicShapeInset::setBottom):
(WebCore::BasicShapeInset::setLeft):
(WebCore::BasicShapeInset::setTopLeftRadius):
(WebCore::BasicShapeInset::setTopRightRadius):
(WebCore::BasicShapeInset::setBottomRightRadius):
(WebCore::BasicShapeInset::setBottomLeftRadius):
(WebCore::BasicShapeInset::BasicShapeInset):

LayoutTests:

* fast/shapes/parsing/parsing-shape-inside-expected.txt:
* fast/shapes/parsing/parsing-shape-lengths-expected.txt:
* fast/shapes/parsing/parsing-shape-lengths.html:
* fast/shapes/parsing/parsing-shape-outside-expected.txt:
* fast/shapes/parsing/parsing-test-utils.js:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@159968 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 65218ec0
2013-12-02 Zoltan Horvath <zoltan@webkit.org>
[CSS Shapes] Support inset parsing
https://bugs.webkit.org/show_bug.cgi?id=124903
Reviewed by David Hyatt.
* fast/shapes/parsing/parsing-shape-inside-expected.txt:
* fast/shapes/parsing/parsing-shape-lengths-expected.txt:
* fast/shapes/parsing/parsing-shape-lengths.html:
* fast/shapes/parsing/parsing-shape-outside-expected.txt:
* fast/shapes/parsing/parsing-test-utils.js:
2013-12-02 Alexey Proskuryakov <ap@apple.com>
Support WebCrypto AES-KW
......
......@@ -17,6 +17,12 @@ PASS getCSSText("-webkit-shape-inside", "inset-rectangle(10px, 20px, 30px, 40px,
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(10px, 20px, 30px, 40px, 5px)") is "inset-rectangle(10px, 20px, 30px, 40px, 5px, 5px)"
PASS getCSSText("-webkit-shape-inside", "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)") is "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)"
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)") is "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)"
PASS getCSSText("-webkit-shape-inside", "inset(10px 20px 30px 40px)") is "inset(10px 20px 30px 40px)"
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px 20px 30px 40px)") is "inset(10px 20px 30px 40px round 0px 0px 0px 0px / 0px 0px 0px 0px)"
PASS getCSSText("-webkit-shape-inside", "inset(10px 20px 30px 40px round 5px 6px)") is "inset(10px 20px 30px 40px round 5px 6px 5px 6px / 5px 6px 5px 6px)"
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px 20px 30px 40px round 5px 6px)") is "inset(10px 20px 30px 40px round 5px 6px 5px 6px / 5px 6px 5px 6px)"
PASS getCSSText("-webkit-shape-inside", "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)") is "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)"
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)") is "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)"
PASS getCSSText("-webkit-shape-inside", "circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
PASS getComputedStyleValue("-webkit-shape-inside", "circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
PASS getCSSText("-webkit-shape-inside", "circle()") is "circle()"
......@@ -137,6 +143,36 @@ PASS getCSSText("-webkit-shape-inside", "inset-rectangle(10px 20px 30px 40px)")
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(10px 20px 30px 40px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset-rectangle(10px, 20px, 30px, 40px, 50px, 60px, 70px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(10px, 20px, 30px, 40px, 50px, 60px, 70px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset()") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset()") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px, 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px, 10px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px 20px, 30px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px 20px, 30px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px, 20px 30px 40px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px, 20px 30px 40px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px 20px 30px 40px 50px 60px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px 20px 30px 40px 50px 60px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(round)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(round)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(round 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(round 10px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px round)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px round)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px round 10px /)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px round 10px /)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px round 20px 30px 40px 50px 60px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px round 20px 30px 40px 50px 60px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px round /)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px round /)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(10px round / 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(10px round / 10px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(/)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(/)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(/ 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(/ 10px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "inset(round /)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "inset(round /)") is "auto"
PASS getCSSText("-webkit-shape-inside", "circle(10px, 20px)") is ""
PASS getComputedStyleValue("-webkit-shape-inside", "circle(10px, 20px)") is "auto"
PASS getCSSText("-webkit-shape-inside", "circle(10px 20px 30px)") is ""
......
......@@ -9,6 +9,7 @@ PASS getStyleValue("-webkit-shape-inside", "circle(-1.5px, +1.5px, 1.5px)") is "
PASS getStyleValue("-webkit-shape-inside", "circle(-.5px, +.5px, .5px)") is "circle(-0.5px, 0.5px, 0.5px)"
PASS getStyleValue("-webkit-shape-inside", "rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)") is "rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)"
PASS getStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)") is "inset-rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)"
PASS getStyleValue("-webkit-shape-inside", "inset(1cm 1mm 1in 1px round 1pt 1pc)") is "inset(1cm 1mm 1in 1px round 1pt 1pc 1pt 1pc / 1pt 1pc 1pt 1pc)"
PASS getStyleValue("-webkit-shape-inside", "circle(-1em, +1em, 1em)") is "circle(-1em, 1em, 1em)"
PASS getStyleValue("-webkit-shape-inside", "circle(-1.5em, +1.5em, 1.5em)") is "circle(-1.5em, 1.5em, 1.5em)"
PASS getStyleValue("-webkit-shape-inside", "circle(-.5em, +.5em, .5em)") is "circle(-0.5em, 0.5em, 0.5em)"
......@@ -25,11 +26,13 @@ PASS getComputedStyleValue("-webkit-shape-inside", "circle(.5vmin, 1vmin, 1.5vmi
PASS getStyleValue("-webkit-shape-inside", "circle(100%, 100%, 100%)") is "circle(100%, 100%, 100%)"
PASS getStyleValue("-webkit-shape-inside", "rectangle(45%, 45%, 90%, 60%, 25%, 10%)") is "rectangle(45%, 45%, 90%, 60%, 25%, 10%)"
PASS getStyleValue("-webkit-shape-inside", "inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)") is "inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)"
PASS getStyleValue("-webkit-shape-inside", "inset(45% 45% 90% 60% round 25% 10%)") is "inset(45% 45% 90% 60% round 25% 10% 25% 10% / 25% 10% 25% 10%)"
PASS getStyleValue("-webkit-shape-inside", "ellipse(100%, 100%, 100%, 100%)") is "ellipse(100%, 100%, 100%, 100%)"
PASS getStyleValue("-webkit-shape-inside", "polygon(10% 20%, 30% 40%, 40% 50%)") is "polygon(nonzero, 10% 20%, 30% 40%, 40% 50%)"
PASS getComputedStyleValue("-webkit-shape-inside", "circle(50%, 100%, 150%)") is "circle(50%, 100%, 150%)"
PASS getComputedStyleValue("-webkit-shape-inside", "rectangle(45%, 45%, 90%, 60%, 25%, 10%)") is "rectangle(45%, 45%, 90%, 60%, 25%, 10%)"
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)") is "inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)"
PASS getComputedStyleValue("-webkit-shape-inside", "inset(45% 45% 90% 60% round 25% 10%)") is "inset(45% 45% 90% 60% round 25% 10% 25% 10% / 25% 10% 25% 10%)"
PASS getComputedStyleValue("-webkit-shape-inside", "ellipse(100%, 100%, 100%, 100%)") is "ellipse(100%, 100%, 100%, 100%)"
PASS getComputedStyleValue("-webkit-shape-inside", "polygon(10% 20%, 30% 40%, 40% 50%)") is "polygon(nonzero, 10% 20%, 30% 40%, 40% 50%)"
PASS getStyleValue("-webkit-shape-inside", "circle(1px, 1px, 1)") is null
......@@ -50,6 +53,8 @@ PASS getStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, 1px,
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, 1px, -1pt, 1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, 1px, 1pt, -1pc)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, 1px, 1pt, -1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "inset(1cm 1mm 1in 1px round 1pt -1pc)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "inset(1cm 1mm 1in 1px round 1pt -1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "ellipse(1em, 1em, -1em, 1em)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "ellipse(1em, 1em, -1em, 1em)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "ellipse(1em, 1em, 1em, -1em)") is null
......@@ -66,6 +71,14 @@ PASS getStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, -1in, 1px,
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, -1in, 1px, 1pt, 1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, -1px, 1pt, 1pc)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, -1px, 1pt, 1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "inset(-1cm, 1mm, 1in, 1px, 1pt, 1pc)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "inset(-1cm, 1mm, 1in, 1px, 1pt, 1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "inset(1cm, -1mm, 1in, 1px, 1pt, 1pc)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "inset(1cm, -1mm, 1in, 1px, 1pt, 1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "inset(1cm, 1mm, -1in, 1px, 1pt, 1pc)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "inset(1cm, 1mm, -1in, 1px, 1pt, 1pc)") is "auto"
PASS getStyleValue("-webkit-shape-inside", "inset(1cm, 1mm, 1in, -1px, 1pt, 1pc)") is null
PASS getComputedStyleValue("-webkit-shape-inside", "inset(1cm, 1mm, 1in, -1px, 1pt, 1pc)") is "auto"
PASS successfullyParsed is true
TEST COMPLETE
......
......@@ -43,6 +43,7 @@ testStyleValue("circle(-.5px, +.5px, .5px)", "circle(-0.5px, 0.5px, 0.5px)");
testStyleValue("rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)", "rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)");
testStyleValue("inset-rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)", "inset-rectangle(1cm, 1mm, 1in, 1px, 1pt, 1pc)");
testStyleValue("inset(1cm 1mm 1in 1px round 1pt 1pc)", "inset(1cm 1mm 1in 1px round 1pt 1pc 1pt 1pc / 1pt 1pc 1pt 1pc)");
// font-relative lengths - number serialization, units, resolution
testStyleValue("circle(-1em, +1em, 1em)", "circle(-1em, 1em, 1em)");
......@@ -69,12 +70,14 @@ testComputedStyleValue("circle(.5vmin, 1vmin, 1.5vmin)", "circle(0.5vmin, 1vmin,
testStyleValue("circle(100%, 100%, 100%)", "circle(100%, 100%, 100%)");
testStyleValue("rectangle(45%, 45%, 90%, 60%, 25%, 10%)", "rectangle(45%, 45%, 90%, 60%, 25%, 10%)");
testStyleValue("inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)", "inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)");
testStyleValue("inset(45% 45% 90% 60% round 25% 10%)", "inset(45% 45% 90% 60% round 25% 10% 25% 10% / 25% 10% 25% 10%)");
testStyleValue("ellipse(100%, 100%, 100%, 100%)", "ellipse(100%, 100%, 100%, 100%)");
testStyleValue("polygon(10% 20%, 30% 40%, 40% 50%)", "polygon(nonzero, 10% 20%, 30% 40%, 40% 50%)");
testComputedStyleValue("circle(50%, 100%, 150%)", "circle(50%, 100%, 150%)");
testComputedStyleValue("rectangle(45%, 45%, 90%, 60%, 25%, 10%)", "rectangle(45%, 45%, 90%, 60%, 25%, 10%)");
testComputedStyleValue("inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)", "inset-rectangle(45%, 45%, 90%, 60%, 25%, 10%)");
testComputedStyleValue("inset(45% 45% 90% 60% round 25% 10%)", "inset(45% 45% 90% 60% round 25% 10% 25% 10% / 25% 10% 25% 10%)");
testComputedStyleValue("ellipse(100%, 100%, 100%, 100%)", "ellipse(100%, 100%, 100%, 100%)");
testComputedStyleValue("polygon(10% 20%, 30% 40%, 40% 50%)", "polygon(nonzero, 10% 20%, 30% 40%, 40% 50%)");
......@@ -90,6 +93,7 @@ testInvalidValue("-webkit-shape-inside", "rectangle(1cm, 1mm, 1in, 1px, -1pt, 1p
testInvalidValue("-webkit-shape-inside", "rectangle(1cm, 1mm, 1in, 1px, 1pt, -1pc)");
testInvalidValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, 1px, -1pt, 1pc)");
testInvalidValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, 1px, 1pt, -1pc)");
testInvalidValue("-webkit-shape-inside", "inset(1cm 1mm 1in 1px round 1pt -1pc)");
testInvalidValue("-webkit-shape-inside", "ellipse(1em, 1em, -1em, 1em)");
testInvalidValue("-webkit-shape-inside", "ellipse(1em, 1em, 1em, -1em)");
......@@ -102,6 +106,13 @@ testInvalidValue("-webkit-shape-inside", "inset-rectangle(-1cm, 1mm, 1in, 1px, 1
testInvalidValue("-webkit-shape-inside", "inset-rectangle(1cm, -1mm, 1in, 1px, 1pt, 1pc)");
testInvalidValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, -1in, 1px, 1pt, 1pc)");
testInvalidValue("-webkit-shape-inside", "inset-rectangle(1cm, 1mm, 1in, -1px, 1pt, 1pc)");
// reject negative top, right, bottom, and left
testInvalidValue("-webkit-shape-inside", "inset(-1cm, 1mm, 1in, 1px, 1pt, 1pc)");
testInvalidValue("-webkit-shape-inside", "inset(1cm, -1mm, 1in, 1px, 1pt, 1pc)");
testInvalidValue("-webkit-shape-inside", "inset(1cm, 1mm, -1in, 1px, 1pt, 1pc)");
testInvalidValue("-webkit-shape-inside", "inset(1cm, 1mm, 1in, -1px, 1pt, 1pc)");
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
......
......@@ -17,6 +17,12 @@ PASS getCSSText("-webkit-shape-outside", "inset-rectangle(10px, 20px, 30px, 40px
PASS getComputedStyleValue("-webkit-shape-outside", "inset-rectangle(10px, 20px, 30px, 40px, 5px)") is "inset-rectangle(10px, 20px, 30px, 40px, 5px, 5px)"
PASS getCSSText("-webkit-shape-outside", "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)") is "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)"
PASS getComputedStyleValue("-webkit-shape-outside", "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)") is "inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)"
PASS getCSSText("-webkit-shape-outside", "inset(10px 20px 30px 40px)") is "inset(10px 20px 30px 40px)"
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px 20px 30px 40px)") is "inset(10px 20px 30px 40px round 0px 0px 0px 0px / 0px 0px 0px 0px)"
PASS getCSSText("-webkit-shape-outside", "inset(10px 20px 30px 40px round 5px 6px)") is "inset(10px 20px 30px 40px round 5px 6px 5px 6px / 5px 6px 5px 6px)"
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px 20px 30px 40px round 5px 6px)") is "inset(10px 20px 30px 40px round 5px 6px 5px 6px / 5px 6px 5px 6px)"
PASS getCSSText("-webkit-shape-outside", "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)") is "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)"
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)") is "inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)"
PASS getCSSText("-webkit-shape-outside", "circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
PASS getComputedStyleValue("-webkit-shape-outside", "circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
PASS getCSSText("-webkit-shape-outside", "circle()") is "circle()"
......@@ -135,6 +141,36 @@ PASS getCSSText("-webkit-shape-outside", "inset-rectangle(10px 20px 30px 40px)")
PASS getComputedStyleValue("-webkit-shape-outside", "inset-rectangle(10px 20px 30px 40px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset-rectangle(10px, 20px, 30px, 40px, 50px, 60px, 70px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset-rectangle(10px, 20px, 30px, 40px, 50px, 60px, 70px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset()") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset()") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px, 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px, 10px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px 20px, 30px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px 20px, 30px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px, 20px 30px 40px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px, 20px 30px 40px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px 20px 30px 40px 50px 60px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px 20px 30px 40px 50px 60px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(round)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(round)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(round 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(round 10px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px round)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px round)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px round 10px /)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px round 10px /)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px round 20px 30px 40px 50px 60px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px round 20px 30px 40px 50px 60px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px round /)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px round /)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(10px round / 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(10px round / 10px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(/)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(/)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(/ 10px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(/ 10px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "inset(round /)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "inset(round /)") is "auto"
PASS getCSSText("-webkit-shape-outside", "circle(10px, 20px)") is ""
PASS getComputedStyleValue("-webkit-shape-outside", "circle(10px, 20px)") is "auto"
PASS getCSSText("-webkit-shape-outside", "circle(10px 20px 30px)") is ""
......
......@@ -14,6 +14,10 @@ var validShapeValues = [
["inset-rectangle(10px, 20px, 30px, 40px, 5px)", "inset-rectangle(10px, 20px, 30px, 40px, 5px)", "inset-rectangle(10px, 20px, 30px, 40px, 5px, 5px)"],
"inset-rectangle(10px, 20px, 30px, 40px, 5px, 10px)",
["inset(10px 20px 30px 40px)", "inset(10px 20px 30px 40px)", "inset(10px 20px 30px 40px round 0px 0px 0px 0px / 0px 0px 0px 0px)"],
["inset(10px 20px 30px 40px round 5px 6px)", "inset(10px 20px 30px 40px round 5px 6px 5px 6px / 5px 6px 5px 6px)", "inset(10px 20px 30px 40px round 5px 6px 5px 6px / 5px 6px 5px 6px)"],
"inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)",
"circle(10px, 20px, 30px)", // FIXME: Remove this test once we do not support the deprecated CSS Shapes syntax anymore.
["circle()", "circle()", "circle(closest-side at 50% 50%)"],
......@@ -87,6 +91,22 @@ var invalidShapeValues = [
"inset-rectangle(10px 20px 30px 40px)",
"inset-rectangle(10px, 20px, 30px, 40px, 50px, 60px, 70px)",
"inset()",
"inset(10px, 10px)",
"inset(10px 20px, 30px)",
"inset(10px, 20px 30px 40px)",
"inset(10px 20px 30px 40px 50px 60px)",
"inset(round)",
"inset(round 10px)",
"inset(10px round)",
"inset(10px round 10px /)",
"inset(10px round 20px 30px 40px 50px 60px)",
"inset(10px round /)",
"inset(10px round / 10px)",
"inset(/)",
"inset(/ 10px)",
"inset(round /)",
"circle(10px, 20px)", // FIXME: Remove this test once we do not support the deprecated CSS Shapes syntax anymore.
"circle(10px 20px 30px)", // FIXME: Remove this test once we do not support the deprecated CSS Shapes syntax anymore.
"circle(10px, 20px, 30px, 40px)", // FIXME: Remove this test once we do not support the deprecated CSS Shapes syntax anymore.
......
2013-12-02 Zoltan Horvath <zoltan@webkit.org>
[CSS Shapes] Support inset parsing
https://bugs.webkit.org/show_bug.cgi?id=124903
Reviewed by David Hyatt.
In this patch I added support for inset shape parsing for CSS Shapes. Inset is defined
by CSS Shapes Level 1 (http://dev.w3.org/csswg/css-shapes-1/#supported-basic-shapes).
Inset is going to be used by shape-outside (bug #124905), and eventually by shape-inside.
No new tests, I updated existing tests to cover the changes.
* css/BasicShapeFunctions.cpp:
(WebCore::valueForBasicShape): Add support for inset.
(WebCore::basicShapeForValue): Add support for inset.
* css/CSSBasicShapes.cpp:
(WebCore::buildInsetString): Create inset css string.
(WebCore::CSSBasicShapeInset::cssText): Convert inset shape to a CSS string.
(WebCore::CSSBasicShapeInset::equals): Compare two inset rectangles.
(WebCore::CSSBasicShapeInset::serializeResolvingVariables): Create an inset string, with CSS variables resolved.
(WebCore::CSSBasicShapeInset::hasVariableReference): Determine if this inset has any CSS Variable references.
* css/CSSBasicShapes.h: Add inset class.
(WebCore::CSSBasicShapeInset::create):
(WebCore::CSSBasicShapeInset::top):
(WebCore::CSSBasicShapeInset::right):
(WebCore::CSSBasicShapeInset::bottom):
(WebCore::CSSBasicShapeInset::left):
(WebCore::CSSBasicShapeInset::topLeftRadius):
(WebCore::CSSBasicShapeInset::topRightRadius):
(WebCore::CSSBasicShapeInset::bottomRightRadius):
(WebCore::CSSBasicShapeInset::bottomLeftRadius):
(WebCore::CSSBasicShapeInset::setTop):
(WebCore::CSSBasicShapeInset::setRight):
(WebCore::CSSBasicShapeInset::setBottom):
(WebCore::CSSBasicShapeInset::setLeft):
(WebCore::CSSBasicShapeInset::setTopLeftRadius):
(WebCore::CSSBasicShapeInset::setTopRightRadius):
(WebCore::CSSBasicShapeInset::setBottomRightRadius):
(WebCore::CSSBasicShapeInset::setBottomLeftRadius):
(WebCore::CSSBasicShapeInset::CSSBasicShapeInset):
* css/CSSParser.cpp:
(WebCore::completeBorderRadii): Move static function before parseInsetBorderRadius.
(WebCore::CSSParser::parseInsetRoundedCorners): I added this helper function for parsing the rounded corners
(WebCore::CSSParser::parseBasicShapeInset): Parse inset.
(WebCore::CSSParser::parseBasicShape): Add call to parse inset.
* css/CSSParser.h:
* css/CSSPrimitiveValue.cpp:
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Add constructor for LengthSize.
(WebCore::CSSPrimitiveValue::init): Initialize LengthSize.
* css/CSSPrimitiveValue.h:
(WebCore::CSSPrimitiveValue::create): Add support for creating PrimitiveValue from LengthSize.
* css/CSSValuePool.h:
(WebCore::CSSValuePool::createValue): Add support for LengthSize.
* platform/LengthSize.h:
(WebCore::LengthSize::blend): Add blend for LengthSize.
* rendering/shapes/ShapeInsideInfo.cpp:
(WebCore::ShapeInsideInfo::isEnabledFor): Keep inset disabled for shape-inside now.
* rendering/style/BasicShapes.cpp:
(WebCore::BasicShapeInset::path): Calculate path for an inset.
(WebCore::BasicShapeInset::blend): Blend two insets.
* rendering/style/BasicShapes.h: Add higher level inset.
(WebCore::BasicShapeInset::create):
(WebCore::BasicShapeInset::top):
(WebCore::BasicShapeInset::right):
(WebCore::BasicShapeInset::bottom):
(WebCore::BasicShapeInset::left):
(WebCore::BasicShapeInset::topLeftRadius):
(WebCore::BasicShapeInset::topRightRadius):
(WebCore::BasicShapeInset::bottomRightRadius):
(WebCore::BasicShapeInset::bottomLeftRadius):
(WebCore::BasicShapeInset::setTop):
(WebCore::BasicShapeInset::setRight):
(WebCore::BasicShapeInset::setBottom):
(WebCore::BasicShapeInset::setLeft):
(WebCore::BasicShapeInset::setTopLeftRadius):
(WebCore::BasicShapeInset::setTopRightRadius):
(WebCore::BasicShapeInset::setBottomRightRadius):
(WebCore::BasicShapeInset::setBottomLeftRadius):
(WebCore::BasicShapeInset::BasicShapeInset):
2013-12-02 Alexey Proskuryakov <ap@apple.com>
Support WebCrypto AES-KW
......@@ -205,6 +205,23 @@ PassRefPtr<CSSValue> valueForBasicShape(const RenderStyle* style, const BasicSha
basicShapeValue = rectangleValue.release();
break;
}
case BasicShape::BasicShapeInsetType: {
const BasicShapeInset* inset = static_cast<const BasicShapeInset*>(basicShape);
RefPtr<CSSBasicShapeInset> insetValue = CSSBasicShapeInset::create();
insetValue->setTop(pool.createValue(inset->top()));
insetValue->setRight(pool.createValue(inset->right()));
insetValue->setBottom(pool.createValue(inset->bottom()));
insetValue->setLeft(pool.createValue(inset->left()));
insetValue->setTopLeftRadius(pool.createValue(inset->topLeftRadius()));
insetValue->setTopRightRadius(pool.createValue(inset->topRightRadius()));
insetValue->setBottomRightRadius(pool.createValue(inset->bottomRightRadius()));
insetValue->setBottomLeftRadius(pool.createValue(inset->bottomLeftRadius()));
basicShapeValue = insetValue.release();
break;
}
default:
break;
}
......@@ -383,6 +400,48 @@ PassRefPtr<BasicShape> basicShapeForValue(const RenderStyle* style, const Render
basicShape = rect.release();
break;
}
case CSSBasicShape::CSSBasicShapeInsetType: {
const CSSBasicShapeInset* rectValue = static_cast<const CSSBasicShapeInset* >(basicShapeValue);
RefPtr<BasicShapeInset> rect = BasicShapeInset::create();
if (rectValue->left())
rect->setTop(convertToLength(style, rootStyle, rectValue->top()));
else
return rect;
if (rectValue->right())
rect->setRight(convertToLength(style, rootStyle, rectValue->right()));
if (rectValue->bottom())
rect->setBottom(convertToLength(style, rootStyle, rectValue->bottom()));
if (rectValue->left())
rect->setLeft(convertToLength(style, rootStyle, rectValue->left()));
if (rectValue->topLeftRadius()) {
Pair* topLeftRadius = rectValue->topLeftRadius()->getPairValue();
rect->setTopLeftRadius(LengthSize(convertToLength(style, rootStyle, topLeftRadius->first()), convertToLength(style, rootStyle, topLeftRadius->second())));
} else
rect->setTopLeftRadius(LengthSize(Length(0, Fixed), Length(0, Fixed)));
if (rectValue->topRightRadius()) {
Pair* topRightRadius = rectValue->topRightRadius()->getPairValue();
rect->setTopRightRadius(LengthSize(convertToLength(style, rootStyle, topRightRadius->first()), convertToLength(style, rootStyle, topRightRadius->second())));
} else
rect->setTopRightRadius(LengthSize(Length(0, Fixed), Length(0, Fixed)));
if (rectValue->bottomRightRadius()) {
Pair* bottomRightRadius = rectValue->bottomRightRadius()->getPairValue();
rect->setBottomRightRadius(LengthSize(convertToLength(style, rootStyle, bottomRightRadius->first()), convertToLength(style, rootStyle, bottomRightRadius->second())));
} else
rect->setBottomRightRadius(LengthSize(Length(0, Fixed), Length(0, Fixed)));
if (rectValue->topLeftRadius()) {
Pair* bottomLeftRadius = rectValue->bottomLeftRadius()->getPairValue();
rect->setBottomLeftRadius(LengthSize(convertToLength(style, rootStyle, bottomLeftRadius->first()), convertToLength(style, rootStyle, bottomLeftRadius->second())));
} else
rect->setBottomLeftRadius(LengthSize(Length(0, Fixed), Length(0, Fixed)));
basicShape = rect.release();
break;
}
default:
break;
}
......
......@@ -32,7 +32,7 @@
#include "CSSBasicShapes.h"
#include "CSSPrimitiveValueMappings.h"
#include "Pair.h"
#include <wtf/text/StringBuilder.h>
using namespace WTF;
......@@ -403,5 +403,205 @@ bool CSSBasicShapeInsetRectangle::equals(const CSSBasicShape& shape) const
&& compareCSSValuePtr(m_box, other.m_box);
}
static String buildInsetString(const String& top, const String& right, const String& bottom, const String& left,
const String& topLeftRadiusWidth, const String& topLeftRadiusHeight,
const String& topRightRadiusWidth, const String& topRightRadiusHeight,
const String& bottomRightRadiusWidth, const String& bottomRightRadiusHeight,
const String& bottomLeftRadiusWidth, const String& bottomLeftRadiusHeight,
const String& box)
{
char opening[] = "inset(";
char separator[] = " ";
char cornersSeparator[] = "round";
char radiusSeparator[] = "/";
StringBuilder result;
// Compute the required capacity in advance to reduce allocations.
result.reserveCapacity((sizeof(opening) - 1) + (13 * (sizeof(separator) - 1)) + (sizeof(cornersSeparator) - 1) + (sizeof(radiusSeparator) - 1) + 1
+ top.length() + right.length() + bottom.length() + left.length()
+ topLeftRadiusWidth.length() + topRightRadiusWidth.length() + bottomRightRadiusWidth.length() + bottomLeftRadiusWidth.length() +
+ topLeftRadiusHeight.length() + topRightRadiusHeight.length() + bottomRightRadiusHeight.length() + bottomLeftRadiusHeight.length() +
+ (box.length() ? box.length() + 1 : 0));
result.appendLiteral(opening);
result.append(top);
result.appendLiteral(separator);
result.append(right);
result.appendLiteral(separator);
result.append(bottom);
result.appendLiteral(separator);
result.append(left);
if (!topLeftRadiusWidth.isNull() && !topLeftRadiusHeight.isNull()) {
result.appendLiteral(separator);
result.appendLiteral(cornersSeparator);
result.appendLiteral(separator);
result.append(topLeftRadiusWidth);
result.appendLiteral(separator);
result.append(topRightRadiusWidth);
result.appendLiteral(separator);
result.append(bottomRightRadiusWidth);
result.appendLiteral(separator);
result.append(bottomLeftRadiusWidth);
result.appendLiteral(separator);
result.append(radiusSeparator);
result.appendLiteral(separator);
result.append(topLeftRadiusHeight);
result.appendLiteral(separator);
result.append(topRightRadiusHeight);
result.appendLiteral(separator);
result.append(bottomRightRadiusHeight);
result.appendLiteral(separator);
result.append(bottomLeftRadiusHeight);
}
result.append(')');
if (box.length()) {
result.append(' ');
result.append(box);
}
return result.toString();
}
String CSSBasicShapeInset::cssText() const
{
String topLeftRadiusWidth;
String topLeftRadiusHeight;
if (topLeftRadius()) {
Pair* topLeftRadius = m_topLeftRadius->getPairValue();
topLeftRadiusWidth = topLeftRadius->first() ? topLeftRadius->first()->cssText() : String("0");
if (topLeftRadius->second())
topLeftRadiusHeight = topLeftRadius->second()->cssText();
}
String topRightRadiusWidth;
String topRightRadiusHeight;
if (topRightRadius()) {
Pair* topRightRadius = m_topRightRadius->getPairValue();
if (topRightRadius->first())
topRightRadiusWidth = topRightRadius->first()->cssText();
if (topRightRadius->second())
topRightRadiusHeight = topRightRadius->second()->cssText();
}
String bottomRightRadiusWidth;
String bottomRightRadiusHeight;
if (bottomRightRadius()) {
Pair* bottomRightRadius = m_bottomRightRadius->getPairValue();
if (bottomRightRadius->first())
bottomRightRadiusWidth = bottomRightRadius->first()->cssText();
if (bottomRightRadius->second())
bottomRightRadiusHeight = bottomRightRadius->second()->cssText();
}
String bottomLeftRadiusWidth;
String bottomLeftRadiusHeight;
if (bottomLeftRadius()) {
Pair* bottomLeftRadius = m_bottomLeftRadius->getPairValue();
if (bottomLeftRadius->first())
bottomLeftRadiusWidth = bottomLeftRadius->first()->cssText();
if (bottomLeftRadius->second())
bottomLeftRadiusHeight = bottomLeftRadius->second()->cssText();
}
return buildInsetString(m_top ? m_top->cssText() : String(),
m_right ? m_right->cssText() : String(),
m_bottom ? m_bottom->cssText() : String(),
m_left ? m_left->cssText() : String(),
topLeftRadiusWidth,
topLeftRadiusHeight,
topRightRadiusWidth,
topRightRadiusHeight,
bottomRightRadiusWidth,
bottomRightRadiusHeight,
bottomLeftRadiusWidth,
bottomLeftRadiusHeight,
m_box ? m_box->cssText() : String());
}
bool CSSBasicShapeInset::equals(const CSSBasicShape& shape) const
{
if (shape.type() != CSSBasicShapeInsetType)
return false;
const CSSBasicShapeInset& other = static_cast<const CSSBasicShapeInset&>(shape);
return compareCSSValuePtr(m_top, other.m_top)
&& compareCSSValuePtr(m_right, other.m_right)
&& compareCSSValuePtr(m_bottom, other.m_bottom)
&& compareCSSValuePtr(m_left, other.m_left)
&& compareCSSValuePtr(m_topLeftRadius, other.m_topLeftRadius)
&& compareCSSValuePtr(m_topRightRadius, other.m_topRightRadius)
&& compareCSSValuePtr(m_bottomRightRadius, other.m_bottomRightRadius)
&& compareCSSValuePtr(m_bottomLeftRadius, other.m_bottomLeftRadius);
}
#if ENABLE(CSS_VARIABLES)
String CSSBasicShapeInset::serializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
{
String topLeftRadiusWidth;
String topLeftRadiusHeight;
if (topLeftRadius()) {
if (m_topLeftRadius->getPairValue()->first())
topLeftRadiusWidth = m_topLeftRadius->getPairValue()->first()->serializeResolvingVariables(variables);
if (m_topLeftRadius->getPairValue()->second())
topLeftRadiusHeight = m_topLeftRadius->getPairValue()->second()->serializeResolvingVariables(variables);
}
String topRightRadiusWidth;
String topRightRadiusHeight;
if (topRightRadius()) {
if (m_topRightRadius->getPairValue()->first())
topRightRadiusWidth = m_topRightRadius->getPairValue()->first()->serializeResolvingVariables(variables);
if (m_topRightRadius->getPairValue()->second())
topRightRadiusHeight = m_topRightRadius->getPairValue()->second()->serializeResolvingVariables(variables);
}
String bottomRightRadiusWidth;
String bottomRightRadiusHeight;
if (bottomRightRadius()) {
if (m_bottomRightRadius->getPairValue()->first())
bottomRightRadiusWidth = m_bottomRightRadius->getPairValue()->first()->serializeResolvingVariables(variables);
if (m_bottomRightRadius->getPairValue()->second())
bottomRightRadiusHeight = m_bottomRightRadius->getPairValue()->second()->serializeResolvingVariables(variables);
}
String bottomLeftRadiusWidth;
String bottomLeftRadiusHeight;
if (bottomLeftRadius()) {
if (m_bottomLeftRadius->getPairValue()->first())
bottomLeftRadiusWidth = m_bottomLeftRadius->getPairValue()->first()->serializeResolvingVariables(variables);
if (m_bottomLeftRadius->getPairValue()->second())
bottomLeftRadiusHeight = m_bottomLeftRadius->getPairValue()->second()->serializeResolvingVariables(variables);
}
return buildInsetString(m_top->serializeResolvingVariables(variables),
m_right->serializeResolvingVariables(variables),
m_bottom->serializeResolvingVariables(variables),
m_left->serializeResolvingVariables(variables),
topLeftRadiusWidth,
topLeftRadiusHeight,
topRightRadiusWidth,
topRightRadiusHeight,
bottomRightRadiusWidth,
bottomRightRadiusHeight,
bottomLeftRadiusWidth,
bottomLeftRadiusHeight,
m_box ? m_box->serializeResolvingVariables(variables) : String());
}
bool CSSBasicShapeInset::hasVariableReference() const
{
return m_top->hasVariableReference()
|| m_right->hasVariableReference()
|| m_bottom->hasVariableReference()
|| m_left->hasVariableReference()
|| (topLeftRadius() && m_topLeftRadius->hasVariableReference())
|| (topRightRadius() && m_topRightRadius->hasVariableReference())
|| (bottomRightRadius() && m_bottomRightRadius->hasVariableReference())
|| (bottomLeftRadius() && m_bottomLeftRadius->hasVariableReference())
|| (m_box && m_box->hasVariableReference());
}
#endif