From 025274cd86b98edf76ab6f1982106f0755f2ba8f Mon Sep 17 00:00:00 2001 From: Callum Law Date: Tue, 18 Nov 2025 16:24:40 +1300 Subject: [PATCH] LibWeb: Don't deassociate animations when deregistering transitions Also renames the `clear_transitions` function to clarify this doesn't affect the associated transition animations. This fixes an issue where transitions weren't being cancelled when the relevant transition-property entry was no longer present --- Libraries/LibWeb/Animations/Animatable.cpp | 3 +-- Libraries/LibWeb/Animations/Animatable.h | 2 +- Libraries/LibWeb/CSS/StyleComputer.cpp | 2 +- ...ransition-cancelled-on-property-change.txt | 3 +++ ...ansition-cancelled-on-property-change.html | 24 +++++++++++++++++++ 5 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/css/transition-cancelled-on-property-change.txt create mode 100644 Tests/LibWeb/Text/input/css/transition-cancelled-on-property-change.html diff --git a/Libraries/LibWeb/Animations/Animatable.cpp b/Libraries/LibWeb/Animations/Animatable.cpp index a2157f43b38..a46accf1c80 100644 --- a/Libraries/LibWeb/Animations/Animatable.cpp +++ b/Libraries/LibWeb/Animations/Animatable.cpp @@ -224,14 +224,13 @@ void Animatable::remove_transition(Optional pseudo_element, transition.associated_transitions.remove(property_id); } -void Animatable::clear_transitions(Optional pseudo_element) +void Animatable::clear_registered_transitions(Optional pseudo_element) { auto maybe_transition = ensure_transition(pseudo_element); if (!maybe_transition) return; auto& transition = *maybe_transition; - transition.associated_transitions.clear(); transition.transition_attribute_indices.clear(); transition.transition_attributes.clear(); } diff --git a/Libraries/LibWeb/Animations/Animatable.h b/Libraries/LibWeb/Animations/Animatable.h index 2929ddc9a9e..137ed004c81 100644 --- a/Libraries/LibWeb/Animations/Animatable.h +++ b/Libraries/LibWeb/Animations/Animatable.h @@ -68,7 +68,7 @@ public: void remove_transition(Optional, CSS::PropertyID); Vector property_ids_with_existing_transitions(Optional) const; GC::Ptr property_transition(Optional, CSS::PropertyID) const; - void clear_transitions(Optional); + void clear_registered_transitions(Optional); void remove_animations_from_timeline(); diff --git a/Libraries/LibWeb/CSS/StyleComputer.cpp b/Libraries/LibWeb/CSS/StyleComputer.cpp index 04afe1da42a..b9b266eb8f5 100644 --- a/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -1232,7 +1232,7 @@ static void compute_transitioned_properties(ComputedProperties const& style, DOM if (source_declaration == element.cached_transition_property_source(pseudo_element)) return; // Reparse this transition property - element.clear_transitions(pseudo_element); + element.clear_registered_transitions(pseudo_element); element.set_cached_transition_property_source(pseudo_element, *source_declaration); auto coordinated_transition_list = style.assemble_coordinated_value_list( diff --git a/Tests/LibWeb/Text/expected/css/transition-cancelled-on-property-change.txt b/Tests/LibWeb/Text/expected/css/transition-cancelled-on-property-change.txt new file mode 100644 index 00000000000..7938dcdde86 --- /dev/null +++ b/Tests/LibWeb/Text/expected/css/transition-cancelled-on-property-change.txt @@ -0,0 +1,3 @@ +0 +1 +0 diff --git a/Tests/LibWeb/Text/input/css/transition-cancelled-on-property-change.html b/Tests/LibWeb/Text/input/css/transition-cancelled-on-property-change.html new file mode 100644 index 00000000000..3fedd4205f6 --- /dev/null +++ b/Tests/LibWeb/Text/input/css/transition-cancelled-on-property-change.html @@ -0,0 +1,24 @@ + + +
+ +