Title: [292117] trunk
Revision
292117
Author
[email protected]
Date
2022-03-30 13:20:21 -0700 (Wed, 30 Mar 2022)

Log Message

[CSS Container Queries] Keep colon syntax when serializing container condition
https://bugs.webkit.org/show_bug.cgi?id=238542

Reviewed by Tim Nguyen.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-contain/container-queries/at-container-serialization-expected.txt:
* web-platform-tests/css/css-contain/container-queries/at-container-serialization.html:

Source/WebCore:

Don't switch to the range syntax when serializing (min-width: 100px) and similar.

* css/ContainerQuery.cpp:
(WebCore::CQ::serialize):

Add an enum that remembers the syntax used and use it when deciding how to serialize.

* css/ContainerQuery.h:
* css/ContainerQueryParser.cpp:
(WebCore::consumeFeatureName):
(WebCore::ContainerQueryParser::consumePlainSizeFeature):

Also fix a bug where plain size feature names were not lowercased.

(WebCore::ContainerQueryParser::consumeRangeSizeFeature):

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (292116 => 292117)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-03-30 19:14:24 UTC (rev 292116)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-03-30 20:20:21 UTC (rev 292117)
@@ -1,3 +1,13 @@
+2022-03-30  Antti Koivisto  <[email protected]>
+
+        [CSS Container Queries] Keep colon syntax when serializing container condition
+        https://bugs.webkit.org/show_bug.cgi?id=238542
+
+        Reviewed by Tim Nguyen.
+
+        * web-platform-tests/css/css-contain/container-queries/at-container-serialization-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/at-container-serialization.html:
+
 2022-03-30  Youenn Fablet  <[email protected]>
 
         Implement ServiceWorker WindowClient.ancestorOrigins

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-serialization-expected.txt (292116 => 292117)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-serialization-expected.txt	2022-03-30 19:14:24 UTC (rev 292116)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-serialization-expected.txt	2022-03-30 20:20:21 UTC (rev 292117)
@@ -2,4 +2,7 @@
 PASS Serialization of conditionText
 PASS Serialization of inner @container rule
 PASS Serialization of nested @container rule
+PASS Serialization of boolean condition syntax
+PASS Serialization of colon condition syntax
+PASS Serialization of range condition syntax
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-serialization.html (292116 => 292117)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-serialization.html	2022-03-30 19:14:24 UTC (rev 292116)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-serialization.html	2022-03-30 20:20:21 UTC (rev 292117)
@@ -12,6 +12,18 @@
     }
     #id { color: green }
   }
+  @container (  wiDTh  ) { }
+  @container (width:100px) { }
+  @container (min-width:  100px) { }
+  @container (   MAX-WIDTH:100px  ) { }
+  @container (width > 100px) { }
+  @container (width < 100px) { }
+  @container (widTH >= 100px) { }
+  @container (width <= 100px) { }
+  @container (10px < width < 100px) { }
+  @container (10px <=  width  <=  100px) { }
+  @container (100px>WIDTH>10px) { }
+  @container (  100px >= width >= 10px  ) { }
 </style>
 <script>
   setup(() => assert_implements_container_queries());
@@ -19,7 +31,7 @@
   let rules = testSheet.sheet.cssRules;
 
   test(() => {
-    assert_equals(rules.length, 1);
+    assert_equals(rules.length, 13);
     assert_equals(rules[0].cssRules.length, 2);
 
     assert_equals(rules[0].conditionText, "(width = 100px)");
@@ -34,4 +46,24 @@
     assert_equals(rules[0].cssText, "@container (width = 100px) {\n  @container \\!-name (inline-size > 200px) {\n  #id { color: lime; }\n}\n  #id { color: green; }\n}");
   }, "Serialization of nested @container rule");
 
+  test(() => {
+    assert_equals(rules[1].conditionText, "(width)");
+  }, "Serialization of boolean condition syntax");
+
+  test(() => {
+    assert_equals(rules[2].conditionText, "(width: 100px)");
+    assert_equals(rules[3].conditionText, "(min-width: 100px)");
+    assert_equals(rules[4].conditionText, "(max-width: 100px)");
+  }, "Serialization of colon condition syntax");
+
+  test(() => {
+    assert_equals(rules[5].conditionText, "(width > 100px)");
+    assert_equals(rules[6].conditionText, "(width < 100px)");
+    assert_equals(rules[7].conditionText, "(width >= 100px)");
+    assert_equals(rules[8].conditionText, "(width <= 100px)");
+    assert_equals(rules[9].conditionText, "(10px < width < 100px)");
+    assert_equals(rules[10].conditionText, "(10px <= width <= 100px)");
+    assert_equals(rules[11].conditionText, "(100px > width > 10px)");
+    assert_equals(rules[12].conditionText, "(100px >= width >= 10px)");
+  }, "Serialization of range condition syntax");
 </script>

Modified: trunk/Source/WebCore/ChangeLog (292116 => 292117)


--- trunk/Source/WebCore/ChangeLog	2022-03-30 19:14:24 UTC (rev 292116)
+++ trunk/Source/WebCore/ChangeLog	2022-03-30 20:20:21 UTC (rev 292117)
@@ -1,3 +1,26 @@
+2022-03-30  Antti Koivisto  <[email protected]>
+
+        [CSS Container Queries] Keep colon syntax when serializing container condition
+        https://bugs.webkit.org/show_bug.cgi?id=238542
+
+        Reviewed by Tim Nguyen.
+
+        Don't switch to the range syntax when serializing (min-width: 100px) and similar.
+
+        * css/ContainerQuery.cpp:
+        (WebCore::CQ::serialize):
+
+        Add an enum that remembers the syntax used and use it when deciding how to serialize.
+
+        * css/ContainerQuery.h:
+        * css/ContainerQueryParser.cpp:
+        (WebCore::consumeFeatureName):
+        (WebCore::ContainerQueryParser::consumePlainSizeFeature):
+
+        Also fix a bug where plain size feature names were not lowercased.
+
+        (WebCore::ContainerQueryParser::consumeRangeSizeFeature):
+
 2022-03-30  Youenn Fablet  <[email protected]>
 
         Implement persistent notification handling

Modified: trunk/Source/WebCore/css/ContainerQuery.cpp (292116 => 292117)


--- trunk/Source/WebCore/css/ContainerQuery.cpp	2022-03-30 19:14:24 UTC (rev 292116)
+++ trunk/Source/WebCore/css/ContainerQuery.cpp	2022-03-30 20:20:21 UTC (rev 292117)
@@ -114,7 +114,7 @@
 
 void serialize(StringBuilder& builder, const SizeFeature& sizeFeature)
 {
-    auto serializeComparisonOperator = [&](ComparisonOperator op) {
+    auto serializeRangeComparisonOperator = [&](ComparisonOperator op) {
         builder.append(' ');
         switch (op) {
         case ComparisonOperator::LessThan:
@@ -136,16 +136,45 @@
         builder.append(' ');
     };
 
-    if (sizeFeature.leftComparison) {
-        builder.append(sizeFeature.leftComparison->value->cssText());
-        serializeComparisonOperator(sizeFeature.leftComparison->op);
-    }
+    switch (sizeFeature.syntax) {
+    case Syntax::Boolean:
+        serializeIdentifier(sizeFeature.name, builder);
+        break;
 
-    serializeIdentifier(sizeFeature.name, builder);
+    case Syntax::Colon:
+        switch (sizeFeature.rightComparison->op) {
+        case ComparisonOperator::LessThanOrEqual:
+            builder.append("max-");
+            break;
+        case ComparisonOperator::Equal:
+            break;
+        case ComparisonOperator::GreaterThanOrEqual:
+            builder.append("min-");
+            break;
+        case ComparisonOperator::LessThan:
+        case ComparisonOperator::GreaterThan:
+            ASSERT_NOT_REACHED();
+            break;
+        }
+        serializeIdentifier(sizeFeature.name, builder);
 
-    if (sizeFeature.rightComparison) {
-        serializeComparisonOperator(sizeFeature.rightComparison->op);
+        builder.append(": ");
         builder.append(sizeFeature.rightComparison->value->cssText());
+        break;
+
+    case Syntax::Range:
+        if (sizeFeature.leftComparison) {
+            builder.append(sizeFeature.leftComparison->value->cssText());
+            serializeRangeComparisonOperator(sizeFeature.leftComparison->op);
+        }
+
+        serializeIdentifier(sizeFeature.name, builder);
+
+        if (sizeFeature.rightComparison) {
+            serializeRangeComparisonOperator(sizeFeature.rightComparison->op);
+            builder.append(sizeFeature.rightComparison->value->cssText());
+        }
+        break;
     }
 }
 

Modified: trunk/Source/WebCore/css/ContainerQuery.h (292116 => 292117)


--- trunk/Source/WebCore/css/ContainerQuery.h	2022-03-30 19:14:24 UTC (rev 292116)
+++ trunk/Source/WebCore/css/ContainerQuery.h	2022-03-30 20:20:21 UTC (rev 292117)
@@ -49,6 +49,7 @@
 
 enum class LogicalOperator : uint8_t { And, Or, Not };
 enum class ComparisonOperator : uint8_t { LessThan, LessThanOrEqual, Equal, GreaterThan, GreaterThanOrEqual };
+enum class Syntax : uint8_t { Boolean, Colon, Range };
 
 struct ContainerCondition {
     LogicalOperator logicalOperator { LogicalOperator::And };
@@ -67,6 +68,7 @@
 
 struct SizeFeature {
     AtomString name;
+    Syntax syntax;
     std::optional<Comparison> leftComparison;
     std::optional<Comparison> rightComparison;
 };

Modified: trunk/Source/WebCore/css/ContainerQueryParser.cpp (292116 => 292117)


--- trunk/Source/WebCore/css/ContainerQueryParser.cpp	2022-03-30 19:14:24 UTC (rev 292116)
+++ trunk/Source/WebCore/css/ContainerQueryParser.cpp	2022-03-30 20:20:21 UTC (rev 292117)
@@ -176,19 +176,25 @@
     return consumeRangeSizeFeature(range);
 }
 
+static String consumeFeatureName(CSSParserTokenRange& range)
+{
+    if (range.peek().type() != IdentToken)
+        return nullAtom();
+    return range.consumeIncludingWhitespace().value().convertToASCIILowercase();
+}
+
 std::optional<CQ::SizeFeature> ContainerQueryParser::consumePlainSizeFeature(CSSParserTokenRange& range)
 {
     auto consumePlainFeatureName = [&]() -> std::pair<AtomString, CQ::ComparisonOperator> {
-        if (range.peek().type() != IdentToken)
+        auto name = consumeFeatureName(range);
+        if (name.isEmpty())
             return { };
-        auto token = range.consumeIncludingWhitespace();
-        auto name = token.value();
         if (name.startsWith("min-"))
-            return { name.substring(4).toAtomString(), CQ::ComparisonOperator::GreaterThanOrEqual };
+            return { name.substring(4), CQ::ComparisonOperator::GreaterThanOrEqual };
         if (name.startsWith("max-"))
-            return { name.substring(4).toAtomString(), CQ::ComparisonOperator::LessThanOrEqual };
+            return { name.substring(4), CQ::ComparisonOperator::LessThanOrEqual };
 
-        return { name.toAtomString(), CQ::ComparisonOperator::Equal };
+        return { name, CQ::ComparisonOperator::Equal };
     };
 
     auto [featureName, op] = consumePlainFeatureName();
@@ -200,7 +206,7 @@
     if (range.atEnd()) {
         if (op != CQ::ComparisonOperator::Equal)
             return { };
-        return CQ::SizeFeature { featureName, { }, { } };
+        return CQ::SizeFeature { featureName, CQ::Syntax::Boolean, { }, { } };
     }
 
     if (range.peek().type() != ColonToken)
@@ -212,17 +218,11 @@
 
     auto value = consumeValue(range);
     
-    return CQ::SizeFeature { featureName, { }, CQ::Comparison { op, WTFMove(value) } };
+    return CQ::SizeFeature { featureName, CQ::Syntax::Colon, { }, CQ::Comparison { op, WTFMove(value) } };
 }
 
 std::optional<CQ::SizeFeature> ContainerQueryParser::consumeRangeSizeFeature(CSSParserTokenRange& range)
 {
-    auto consumeFeatureName = [&]() -> AtomString {
-        if (range.peek().type() != IdentToken)
-            return { };
-        return range.consumeIncludingWhitespace().value().toAtomString();
-    };
-
     auto consumeRangeOperator = [&]() -> std::optional<CQ::ComparisonOperator> {
         if (range.atEnd())
             return { };
@@ -275,7 +275,7 @@
 
     auto leftComparison = consumeLeftComparison();
 
-    auto featureName = consumeFeatureName();
+    auto featureName = consumeFeatureName(range);
     if (featureName.isEmpty())
         return { };
 
@@ -284,7 +284,7 @@
     if (!leftComparison && !rightComparison)
         return { };
 
-    return CQ::SizeFeature { WTFMove(featureName), WTFMove(leftComparison), WTFMove(rightComparison) };
+    return CQ::SizeFeature { WTFMove(featureName), CQ::Syntax::Range, WTFMove(leftComparison), WTFMove(rightComparison) };
 }
 
 RefPtr<CSSValue> ContainerQueryParser::consumeValue(CSSParserTokenRange& range)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to