Skip to content

Commit 1dc6982

Browse files
committed
[@Property] Container units are not computationally independent
https://bugs.webkit.org/show_bug.cgi?id=251084 rdar://104550943 Reviewed by Alan Baradlay. They depend on container dimensions and so should not be allowed in initial-value descriptors. * LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-units-computational-independence-expected.txt: * LayoutTests/fast/css/custom-properties/at-property-cqi-crash-expected.txt: Added. * LayoutTests/fast/css/custom-properties/at-property-cqi-crash.html: Added. * Source/WebCore/css/CSSPrimitiveValue.cpp: (WebCore::CSSPrimitiveValue::collectComputedStyleDependencies const): Set a bit indicating there are container dimension dependencies. * Source/WebCore/css/CSSValue.h: (WebCore::ComputedStyleDependencies::isEmpty const): Canonical link: https://commits.webkit.org/259298@main
1 parent f94dc3f commit 1dc6982

File tree

5 files changed

+101
-20
lines changed

5 files changed

+101
-20
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This test passes if it doesn't crash.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
<style>
3+
@property --v {
4+
syntax: '<length-percentage>';
5+
inherits: false;
6+
initial-value: calc(min(0px, 0cqi) * 0 + 1mm + 0%);
7+
}
8+
body {
9+
width: var(--v);
10+
}
11+
</style>
12+
<script>
13+
if (window.testRunner)
14+
testRunner.dumpAsText();
15+
</script>
16+
This test passes if it doesn't crash.
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,8 @@
11

2-
FAIL Container relative unit cqw is not computationally independent assert_throws_dom: function "() => {
3-
CSS.registerProperty({ name: '--x', inherits: false, syntax: '<length>', initialValue: `1${unit}` });
4-
}" did not throw
5-
FAIL Container relative unit cqh is not computationally independent assert_throws_dom: function "() => {
6-
CSS.registerProperty({ name: '--x', inherits: false, syntax: '<length>', initialValue: `1${unit}` });
7-
}" threw object "InvalidModificationError: This property has already been registered." that is not a DOMException SyntaxError: property "code" is equal to 13, expected 12
8-
FAIL Container relative unit cqi is not computationally independent assert_throws_dom: function "() => {
9-
CSS.registerProperty({ name: '--x', inherits: false, syntax: '<length>', initialValue: `1${unit}` });
10-
}" threw object "InvalidModificationError: This property has already been registered." that is not a DOMException SyntaxError: property "code" is equal to 13, expected 12
11-
FAIL Container relative unit cqb is not computationally independent assert_throws_dom: function "() => {
12-
CSS.registerProperty({ name: '--x', inherits: false, syntax: '<length>', initialValue: `1${unit}` });
13-
}" threw object "InvalidModificationError: This property has already been registered." that is not a DOMException SyntaxError: property "code" is equal to 13, expected 12
14-
FAIL Container relative unit cqmin is not computationally independent assert_throws_dom: function "() => {
15-
CSS.registerProperty({ name: '--x', inherits: false, syntax: '<length>', initialValue: `1${unit}` });
16-
}" threw object "InvalidModificationError: This property has already been registered." that is not a DOMException SyntaxError: property "code" is equal to 13, expected 12
17-
FAIL Container relative unit cqmax is not computationally independent assert_throws_dom: function "() => {
18-
CSS.registerProperty({ name: '--x', inherits: false, syntax: '<length>', initialValue: `1${unit}` });
19-
}" threw object "InvalidModificationError: This property has already been registered." that is not a DOMException SyntaxError: property "code" is equal to 13, expected 12
2+
PASS Container relative unit cqw is not computationally independent
3+
PASS Container relative unit cqh is not computationally independent
4+
PASS Container relative unit cqi is not computationally independent
5+
PASS Container relative unit cqb is not computationally independent
6+
PASS Container relative unit cqmin is not computationally independent
7+
PASS Container relative unit cqmax is not computationally independent
208

Source/WebCore/css/CSSPrimitiveValue.cpp

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1690,10 +1690,85 @@ void CSSPrimitiveValue::collectComputedStyleDependencies(ComputedStyleDependenci
16901690
dependencies.properties.appendIfNotContains(CSSPropertyFontSize);
16911691
dependencies.properties.appendIfNotContains(CSSPropertyLineHeight);
16921692
break;
1693+
case CSSUnitType::CSS_CQW:
1694+
case CSSUnitType::CSS_CQH:
1695+
case CSSUnitType::CSS_CQI:
1696+
case CSSUnitType::CSS_CQB:
1697+
case CSSUnitType::CSS_CQMIN:
1698+
case CSSUnitType::CSS_CQMAX:
1699+
dependencies.containerDimensions = true;
1700+
break;
16931701
case CSSUnitType::CSS_CALC:
16941702
m_value.calc->collectComputedStyleDependencies(dependencies);
16951703
break;
1696-
default:
1704+
case CSSUnitType::CSS_NUMBER:
1705+
case CSSUnitType::CSS_INTEGER:
1706+
case CSSUnitType::CSS_PERCENTAGE:
1707+
case CSSUnitType::CSS_PX:
1708+
case CSSUnitType::CSS_CM:
1709+
case CSSUnitType::CSS_MM:
1710+
case CSSUnitType::CSS_IN:
1711+
case CSSUnitType::CSS_PT:
1712+
case CSSUnitType::CSS_PC:
1713+
case CSSUnitType::CSS_DEG:
1714+
case CSSUnitType::CSS_RAD:
1715+
case CSSUnitType::CSS_GRAD:
1716+
case CSSUnitType::CSS_TURN:
1717+
case CSSUnitType::CSS_MS:
1718+
case CSSUnitType::CSS_S:
1719+
case CSSUnitType::CSS_HZ:
1720+
case CSSUnitType::CSS_KHZ:
1721+
case CSSUnitType::CSS_DIMENSION:
1722+
case CSSUnitType::CSS_VW:
1723+
case CSSUnitType::CSS_VH:
1724+
case CSSUnitType::CSS_VMIN:
1725+
case CSSUnitType::CSS_VMAX:
1726+
case CSSUnitType::CSS_VB:
1727+
case CSSUnitType::CSS_VI:
1728+
case CSSUnitType::CSS_SVW:
1729+
case CSSUnitType::CSS_SVH:
1730+
case CSSUnitType::CSS_SVMIN:
1731+
case CSSUnitType::CSS_SVMAX:
1732+
case CSSUnitType::CSS_SVB:
1733+
case CSSUnitType::CSS_SVI:
1734+
case CSSUnitType::CSS_LVW:
1735+
case CSSUnitType::CSS_LVH:
1736+
case CSSUnitType::CSS_LVMIN:
1737+
case CSSUnitType::CSS_LVMAX:
1738+
case CSSUnitType::CSS_LVB:
1739+
case CSSUnitType::CSS_LVI:
1740+
case CSSUnitType::CSS_DVW:
1741+
case CSSUnitType::CSS_DVH:
1742+
case CSSUnitType::CSS_DVMIN:
1743+
case CSSUnitType::CSS_DVMAX:
1744+
case CSSUnitType::CSS_DVB:
1745+
case CSSUnitType::CSS_DVI:
1746+
case CSSUnitType::CSS_DPPX:
1747+
case CSSUnitType::CSS_X:
1748+
case CSSUnitType::CSS_DPI:
1749+
case CSSUnitType::CSS_DPCM:
1750+
case CSSUnitType::CSS_FR:
1751+
case CSSUnitType::CSS_Q:
1752+
case CSSUnitType::CSS_UNKNOWN:
1753+
case CSSUnitType::CSS_STRING:
1754+
case CSSUnitType::CSS_FONT_FAMILY:
1755+
case CSSUnitType::CSS_URI:
1756+
case CSSUnitType::CSS_IDENT:
1757+
case CSSUnitType::CustomIdent:
1758+
case CSSUnitType::CSS_ATTR:
1759+
case CSSUnitType::CSS_COUNTER:
1760+
case CSSUnitType::CSS_RECT:
1761+
case CSSUnitType::CSS_RGBCOLOR:
1762+
case CSSUnitType::CSS_PAIR:
1763+
case CSSUnitType::CSS_UNICODE_RANGE:
1764+
case CSSUnitType::CSS_COUNTER_NAME:
1765+
case CSSUnitType::CSS_SHAPE:
1766+
case CSSUnitType::CSS_QUAD:
1767+
case CSSUnitType::CSS_CALC_PERCENTAGE_WITH_NUMBER:
1768+
case CSSUnitType::CSS_CALC_PERCENTAGE_WITH_LENGTH:
1769+
case CSSUnitType::CSS_UNRESOLVED_COLOR:
1770+
case CSSUnitType::CSS_PROPERTY_ID:
1771+
case CSSUnitType::CSS_VALUE_ID:
16971772
break;
16981773
}
16991774
}

Source/WebCore/css/CSSValue.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ enum CSSPropertyID : uint16_t;
3737
struct ComputedStyleDependencies {
3838
Vector<CSSPropertyID> properties;
3939
Vector<CSSPropertyID> rootProperties;
40+
bool containerDimensions { false };
4041

41-
bool isEmpty() const { return properties.isEmpty() && rootProperties.isEmpty(); }
42+
bool isEmpty() const { return properties.isEmpty() && rootProperties.isEmpty() && !containerDimensions; }
4243
};
4344

4445
DECLARE_ALLOCATOR_WITH_HEAP_IDENTIFIER(CSSValue);

0 commit comments

Comments
 (0)