Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 1e92d3b75ea2374dd1343c066f82dbe719d80bec
      
https://github.com/WebKit/WebKit/commit/1e92d3b75ea2374dd1343c066f82dbe719d80bec
  Author: Chris Dumez <[email protected]>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M 
LayoutTests/imported/w3c/web-platform-tests/svg/animations/scripted/onhover-syncbases-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/animations/syncbases-with-tangled-dependencies-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/animations/syncbases-with-tangled-dependencies.html
    A 
LayoutTests/svg/animations/restarted-interval-does-not-flash-end-value-expected.txt
    A 
LayoutTests/svg/animations/restarted-interval-does-not-flash-end-value.html
    M Source/WebCore/svg/animation/SMILTimeContainer.cpp
    M Source/WebCore/svg/animation/SVGSMILElement.cpp
    M Source/WebCore/svg/animation/SVGSMILElement.h

  Log Message:
  -----------
  After two runs of a SMIL SVG animation, an SVG item doesn't re-appear
https://bugs.webkit.org/show_bug.cgi?id=196596
rdar://49631053

Reviewed by Nikolas Zimmermann.

When several SMIL animations target the same element/attribute (a "sandwich"),
SMILTimeContainer::updateAnimations() sorts them by priority and applies their 
results in that
order, so the highest-priority (latest begin time) animation wins. The priority 
sort ran before
each animation's progress() advanced its current interval to the current time. 
An animation whose
interval only restarts at (or before) the current time — e.g. a sync-base 
dependent that just
gained a new, later begin time — was therefore sorted using its stale, earlier 
interval begin,
lost the sandwich to a lower-priority animation, and its result was 
overwritten. This is why, after
toggling minimize/maximize twice, the element failed to re-appear.

Fix this by resolving every scheduled animation's current interval (and active 
state) up front, in
a new updateIntervalForProgress() pass that runs before the priority sort, and 
having progress()
apply the value and fire events against that already-resolved state. progress() 
is now driven by a
ProgressDisposition recorded during that pass, which preserves each of the 
original early-outs via
two dispositions: NotContributing (an unresolved interval, or a seek landing 
before the interval)
and BeforeInterval (an interval not yet begun). The remaining Resolved 
disposition still fires
begin/end events for an interval that ends into a frozen state mid-frame.

The animation percent is now computed in progress(), after the interval has 
been resolved, rather
than before checkRestart(). Previously, on the frame an interval restarted, the 
percent was
computed against the just-ended interval (clamping to 1, i.e. the destination 
value), so the
restarting animation briefly painted its end value for one frame before 
correcting. Computing the
percent against the resolved interval yields ~0 (the interval's start) on that 
frame.

Tests: 
imported/w3c/web-platform-tests/svg/animations/syncbases-with-tangled-dependencies.html
       svg/animations/restarted-interval-does-not-flash-end-value.html

* 
LayoutTests/imported/w3c/web-platform-tests/svg/animations/scripted/onhover-syncbases-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/svg/animations/syncbases-with-tangled-dependencies-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/animations/syncbases-with-tangled-dependencies.html:
 Added.
* 
LayoutTests/svg/animations/restarted-interval-does-not-flash-end-value-expected.txt:
 Added.
* LayoutTests/svg/animations/restarted-interval-does-not-flash-end-value.html: 
Added.
* Source/WebCore/svg/animation/SMILTimeContainer.cpp:
(WebCore::SMILTimeContainer::updateAnimations):
* Source/WebCore/svg/animation/SVGSMILElement.cpp:
(WebCore::SVGSMILElement::reset):
(WebCore::SVGSMILElement::checkRestart):
(WebCore::SVGSMILElement::updateIntervalForProgress):
(WebCore::SVGSMILElement::progress):
* Source/WebCore/svg/animation/SVGSMILElement.h:

Canonical link: https://commits.webkit.org/317272@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to