LibWeb: Clamp CSS numeric token values to float range
This matches the behavior of other browsers. We did the equivalent
change for <integer> in b86377b
We continue to store these as doubles for the extra precision.
This commit is contained in:
parent
dbe0cb4b1d
commit
d6dbabdf0e
3 changed files with 32 additions and 3 deletions
|
|
@ -14,6 +14,17 @@
|
|||
|
||||
namespace Web::CSS::Parser {
|
||||
|
||||
inline static double clamp_to_single_precision(double value)
|
||||
{
|
||||
if (value > static_cast<double>(NumericLimits<float>::max()))
|
||||
return static_cast<double>(NumericLimits<float>::max());
|
||||
|
||||
if (value < static_cast<double>(NumericLimits<float>::lowest()))
|
||||
return static_cast<double>(NumericLimits<float>::lowest());
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
class WEB_API Token {
|
||||
public:
|
||||
enum class Type : u8 {
|
||||
|
|
@ -139,7 +150,7 @@ public:
|
|||
double number_value() const
|
||||
{
|
||||
VERIFY(m_type == Type::Number);
|
||||
return m_number_value.value();
|
||||
return clamp_to_single_precision(m_number_value.value());
|
||||
}
|
||||
i32 to_integer() const
|
||||
{
|
||||
|
|
@ -155,14 +166,14 @@ public:
|
|||
double dimension_value() const
|
||||
{
|
||||
VERIFY(m_type == Type::Dimension);
|
||||
return m_number_value.value();
|
||||
return clamp_to_single_precision(m_number_value.value());
|
||||
}
|
||||
i32 dimension_value_int() const { return m_number_value.integer_value(); }
|
||||
|
||||
double percentage() const
|
||||
{
|
||||
VERIFY(m_type == Type::Percentage);
|
||||
return m_number_value.value();
|
||||
return clamp_to_single_precision(m_number_value.value());
|
||||
}
|
||||
|
||||
Type mirror_variant() const;
|
||||
|
|
|
|||
12
Tests/LibWeb/CSSTokenizer/expected/numeric-clamping.txt
Normal file
12
Tests/LibWeb/CSSTokenizer/expected/numeric-clamping.txt
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
Percentage(value=3.4028234663852886e+38, number_type=Number, source="1e39%", start=0:0, end=0:5)
|
||||
Whitespace(source="\n", start=0:5, end=1:0)
|
||||
Percentage(value=-3.4028234663852886e+38, number_type=Number, source="-1e39%", start=1:0, end=1:6)
|
||||
Whitespace(source="\n", start=1:6, end=2:0)
|
||||
Dimension(value=3.4028234663852886e+38, number_type=Number, unit="px", source="1e39px", start=2:0, end=2:6)
|
||||
Whitespace(source="\n", start=2:6, end=3:0)
|
||||
Dimension(value=-3.4028234663852886e+38, number_type=Number, unit="px", source="-1e39px", start=3:0, end=3:7)
|
||||
Whitespace(source="\n", start=3:7, end=4:0)
|
||||
Number(value=3.4028234663852886e+38, number_type=Number, source="1e39", start=4:0, end=4:4)
|
||||
Whitespace(source="\n", start=4:4, end=5:0)
|
||||
Number(value=-3.4028234663852886e+38, number_type=Number, source="-1e39", start=5:0, end=5:5)
|
||||
__EOF__(source="", start=5:5, end=5:5)
|
||||
6
Tests/LibWeb/CSSTokenizer/input/numeric-clamping.css
Normal file
6
Tests/LibWeb/CSSTokenizer/input/numeric-clamping.css
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
1e39%
|
||||
-1e39%
|
||||
1e39px
|
||||
-1e39px
|
||||
1e39
|
||||
-1e39
|
||||
Loading…
Reference in a new issue