Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 494bf388fd775f7a80dc95337a3ba8c58e29bf21
      
https://github.com/WebKit/WebKit/commit/494bf388fd775f7a80dc95337a3ba8c58e29bf21
  Author: Antoine Quint <[email protected]>
  Date:   2023-12-11 (Mon, 11 Dec 2023)

  Changed paths:
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html
    M Source/WebCore/animation/KeyframeEffect.cpp
    M Source/WebCore/animation/KeyframeEffect.h
    M Source/WebCore/animation/KeyframeEffectStack.cpp

  Log Message:
  -----------
  [web-animations] setting currentTime=0 when animation-play-state=paused, 
doesn't restart animation after unpausing it
https://bugs.webkit.org/show_bug.cgi?id=265280
rdar://118826588

Reviewed by Antti Koivisto.

The test attached to the bug report did the following:

- started a CSS Animation with the default single iteration
- when that animation ended would set `animation-iteration-count: infinite`
- called getAnimations() on the target element on which the CSS Animation was 
applied

We failed to return an animation in that case because, even though we did 
everything right to update
the timing properties of the CSS Animation and mark it as "relevant" (in Web 
Animations parlance) again,
we did not successfully add it back to the target's keyframe effect stack.

This was due to some shoddy engineering (on this patch author's part) which 
almost guaranteed a bug like
this would crop up. Indeed, KeyframeEffect keeps an instance variable 
`m_inTargetEffectStack` around to
cache whether it is in the associated target's keyframe effect stack. While we 
would correctly update
this instance variable when calling `addEffect()` and `removeEffect()` within 
KeyframeEffect on the
effect stack, we completely neglected to have this instance variable updated 
when other parts of the
code would manipulate the effect stack in which this effect was found, such as 
under
`AnimationTimeline::removeAnimation()`.

Arguably, we could have change the call in 
`AnimationTimeline::removeAnimation()` to go through
`KeyframeEffectStack`, but instead we chose to guarantee 
`m_inTargetEffectStack` is now reflective
of whether the effect is found in its associated target's effect stack by 
ensuring that, when
calls to `addEffect()` and `removeEffect()` successfully add or remove the 
provided effect to or
from the stack, the instance variable is updated.

To that end, we add a new `KeyframeEffect::wasAddedToEffectStack()` method and 
rename `wasRemovedFromStack()`
to be more specific that this is an effect stack we're dealing with.

* 
LayoutTests/imported/w3c/web-platform-tests/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/css/css-animations/animation-restarted-after-changing-iteration-count-after-completion.html:
 Added.
* Source/WebCore/animation/KeyframeEffect.cpp:
(WebCore::KeyframeEffect::animationTimelineDidChange):
(WebCore::KeyframeEffect::updateEffectStackMembership):
(WebCore::KeyframeEffect::didChangeTargetStyleable):
(WebCore::KeyframeEffect::wasAddedToEffectStack):
(WebCore::KeyframeEffect::wasRemovedFromEffectStack):
(WebCore::KeyframeEffect::wasRemovedFromStack): Deleted.
* Source/WebCore/animation/KeyframeEffect.h:
* Source/WebCore/animation/KeyframeEffectStack.cpp:
(WebCore::KeyframeEffectStack::addEffect):
(WebCore::KeyframeEffectStack::removeEffect):

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


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to