Browse Source

LibWeb/CSS: Resolve NumericCalculationNode to percentage when requested

When the caller of NumericCalculationNode::resolve() does not provide
a percentage_basis, it expects the method to return a raw percentage
value.

Fixes crashing on https://discord.com/login
Aliaksandr Kalenik 1 year ago
parent
commit
225ed58f7e

+ 1 - 0
Tests/LibWeb/Text/expected/css/css-hsl-with-calc.txt

@@ -0,0 +1 @@
+ rgb(30, 31, 34)

+ 11 - 0
Tests/LibWeb/Text/input/css/css-hsl-with-calc.html

@@ -0,0 +1,11 @@
+<!doctype html><script src="../include.js"></script><style>    
+    body {    
+      --saturation-factor: 1;  
+      background: hsl(225, calc(var(--saturation-factor, 1) * 6.3%), 12.5%);  
+    }    
+</style><body></body><script>
+test(() => {
+    const bodyStyle = window.getComputedStyle(document.body);
+    println(bodyStyle.backgroundColor);
+});
+</script>

+ 3 - 1
Userland/Libraries/LibWeb/CSS/StyleValues/CalculatedStyleValue.cpp

@@ -220,9 +220,11 @@ bool NumericCalculationNode::contains_percentage() const
 CalculatedStyleValue::CalculationResult NumericCalculationNode::resolve(Optional<Length::ResolutionContext const&>, CalculatedStyleValue::PercentageBasis const& percentage_basis) const
 {
     if (m_value.has<Percentage>()) {
+        // NOTE: Depending on whether percentage_basis is set, the caller of resolve() is expecting a raw percentage or
+        //       resolved length.
         return percentage_basis.visit(
             [&](Empty const&) -> CalculatedStyleValue::CalculationResult {
-                VERIFY_NOT_REACHED();
+                return m_value;
             },
             [&](auto const& value) {
                 return CalculatedStyleValue::CalculationResult(value.percentage_of(m_value.get<Percentage>()));