LibWeb: Detect explicit null timeline given in KeyframeAnimationOptions

We already do this for the timeline argument in the KeyframeEffect
constructor
This commit is contained in:
Matthew Olsson 2024-05-27 07:17:29 -07:00 committed by Andreas Kling
parent 7bd62809a9
commit 2bd8093449
5 changed files with 8 additions and 7 deletions

View file

@ -1,2 +1,2 @@
Animation's default timeline is the document's timeline: true
Animation created with null timeline has the document's timeline: true
Animation created with null timeline has no timeline: true

View file

@ -8,6 +8,6 @@
println(`Animation's default timeline is the document's timeline: ${animation.timeline === document.timeline}`);
animation = foo.animate({ opacity: [0, 1] }, { timeline: null });
println(`Animation created with null timeline has the document's timeline: ${animation.timeline === document.timeline}`);
println(`Animation created with null timeline has no timeline: ${animation.timeline === null}`);
});
</script>

View file

@ -32,15 +32,15 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Animation>> Animatable::animate(Optional<JS
// 3. If options is a KeyframeAnimationOptions object, let timeline be the timeline member of options or, if
// timeline member of options is missing, be the default document timeline of the node document of the element
// on which this method was called.
JS::GCPtr<AnimationTimeline> timeline;
Optional<JS::GCPtr<AnimationTimeline>> timeline;
if (options.has<KeyframeAnimationOptions>())
timeline = options.get<KeyframeAnimationOptions>().timeline;
if (!timeline)
if (!timeline.has_value())
timeline = target->document().timeline();
// 4. Construct a new Animation object, animation, in the relevant Realm of target by using the same procedure as
// the Animation() constructor, passing effect and timeline as arguments of the same name.
auto animation = TRY(Animation::construct_impl(realm, effect, timeline));
auto animation = TRY(Animation::construct_impl(realm, effect, move(timeline)));
// 5. If options is a KeyframeAnimationOptions object, assign the value of the id member of options to animations
// id attribute.

View file

@ -14,7 +14,7 @@ namespace Web::Animations {
// https://www.w3.org/TR/web-animations-1/#dictdef-keyframeanimationoptions
struct KeyframeAnimationOptions : public KeyframeEffectOptions {
FlyString id { ""_fly_string };
JS::GCPtr<AnimationTimeline> timeline;
Optional<JS::GCPtr<AnimationTimeline>> timeline;
};
// https://www.w3.org/TR/web-animations-1/#dictdef-getanimationsoptions

View file

@ -668,7 +668,8 @@ WebIDL::ExceptionOr<void> Animation::play_an_animation(AutoRewind auto_rewind)
// If a user agent determines that animation is immediately ready, it may schedule the above task as a microtask
// such that it runs at the next microtask checkpoint, but it must not perform the task synchronously.
m_pending_play_task = TaskState::Scheduled;
m_saved_play_time = m_timeline->current_time().value();
if (m_timeline)
m_saved_play_time = m_timeline->current_time().value();
// 13. Run the procedure to update an animations finished state for animation with the did seek flag set to false,
// and the synchronously notify flag set to false.