1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:57:45 +00:00

LibWeb: Handle reference cycles in SVG gradient linking

Since SVG gradients can reference each other, we have to keep track of
visited gradients when traversing the link chain, or we will recurse
infinitely when there's a reference cycle.
This commit is contained in:
Andreas Kling 2024-03-10 12:18:09 +01:00
parent 1b8d8c7bbc
commit 2e0297d703
8 changed files with 155 additions and 36 deletions

View file

@ -36,9 +36,9 @@ protected:
virtual void initialize(JS::Realm&) override;
private:
JS::GCPtr<SVGRadialGradientElement const> linked_radial_gradient() const
JS::GCPtr<SVGRadialGradientElement const> linked_radial_gradient(HashTable<SVGGradientElement const*>& seen_gradients) const
{
if (auto gradient = linked_gradient(); gradient && is<SVGRadialGradientElement>(*gradient))
if (auto gradient = linked_gradient(seen_gradients); gradient && is<SVGRadialGradientElement>(*gradient))
return &verify_cast<SVGRadialGradientElement>(*gradient);
return {};
}
@ -50,6 +50,13 @@ private:
NumberPercentage end_circle_y() const;
NumberPercentage end_circle_radius() const;
NumberPercentage start_circle_x_impl(HashTable<SVGGradientElement const*>& seen_gradients) const;
NumberPercentage start_circle_y_impl(HashTable<SVGGradientElement const*>& seen_gradients) const;
NumberPercentage start_circle_radius_impl(HashTable<SVGGradientElement const*>& seen_gradients) const;
NumberPercentage end_circle_x_impl(HashTable<SVGGradientElement const*>& seen_gradients) const;
NumberPercentage end_circle_y_impl(HashTable<SVGGradientElement const*>& seen_gradients) const;
NumberPercentage end_circle_radius_impl(HashTable<SVGGradientElement const*>& seen_gradients) const;
Optional<NumberPercentage> m_cx;
Optional<NumberPercentage> m_cy;
Optional<NumberPercentage> m_fx;