From c2cd191864bdeab7c75a74e0c09e22f651fd1033 Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Sat, 2 Nov 2024 20:23:50 +1100 Subject: [PATCH] LibWeb: Use machine epsilon when approximating cubic bezier --- .../css/cubic-bezier-infinite-slope-crash.txt | 1 + .../cubic-bezier-infinite-slope-crash.html | 24 +++++++++++++++++++ .../CSS/StyleValues/EasingStyleValue.cpp | 8 +++---- 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/css/cubic-bezier-infinite-slope-crash.txt create mode 100644 Tests/LibWeb/Text/input/css/cubic-bezier-infinite-slope-crash.html diff --git a/Tests/LibWeb/Text/expected/css/cubic-bezier-infinite-slope-crash.txt b/Tests/LibWeb/Text/expected/css/cubic-bezier-infinite-slope-crash.txt new file mode 100644 index 00000000000..921c3cc3d09 --- /dev/null +++ b/Tests/LibWeb/Text/expected/css/cubic-bezier-infinite-slope-crash.txt @@ -0,0 +1 @@ +PASS! (Didn't crash) \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/css/cubic-bezier-infinite-slope-crash.html b/Tests/LibWeb/Text/input/css/cubic-bezier-infinite-slope-crash.html new file mode 100644 index 00000000000..dd61978d684 --- /dev/null +++ b/Tests/LibWeb/Text/input/css/cubic-bezier-infinite-slope-crash.html @@ -0,0 +1,24 @@ + + +
+ + diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/EasingStyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValues/EasingStyleValue.cpp index b222c1e9a66..21906b8d122 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/EasingStyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/EasingStyleValue.cpp @@ -126,9 +126,9 @@ double EasingStyleValue::Function::evaluate_at(double input_progress, bool befor size_t nearby_index = 0; if (auto found = binary_search(cached_x_samples, x, &nearby_index, [](auto x, auto& sample) { - if (x > sample.x) + if (x - sample.x >= NumericLimits::epsilon()) return 1; - if (x < sample.x) + if (x - sample.x <= NumericLimits::epsilon()) return -1; return 0; })) @@ -146,9 +146,9 @@ double EasingStyleValue::Function::evaluate_at(double input_progress, bool befor } if (auto found = binary_search(cached_x_samples, x, &nearby_index, [](auto x, auto& sample) { - if (x > sample.x) + if (x - sample.x >= NumericLimits::epsilon()) return 1; - if (x < sample.x) + if (x - sample.x <= NumericLimits::epsilon()) return -1; return 0; }))