[Web Animations] Enqueue and dispatch animation events
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Dec 2017 19:01:18 +0000 (19:01 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Dec 2017 19:01:18 +0000 (19:01 +0000)
commit8c4edf8278453d606788fa776844219ff4dae786
treeeb8dec669cb04594f6528042370901e77ab80692
parent1c62270a996f3e8000c09c61ae6036ed1e419abe
[Web Animations] Enqueue and dispatch animation events
https://bugs.webkit.org/show_bug.cgi?id=180657
<rdar://problem/35970103>

Reviewed by Chris Dumez.

Source/WebCore:

Now that we have support for the AnimationPlaybackEvent interface, we need a way to enqueue
such events for dispatch at the opportune time. The Web Animations spec defines two ways
to queue and dispatch events.

If the animation has a "document for timing", it should enqueue events on this document.
In our implementation, if the animation timeline is set to a DocumentTimeline, that means
it has a document for timing, and we let the DocumentTimeline enqueue those events, which
will be dispatched through a dedicated GenericTaskQueue<Timer>. These events will be sorted
by their respective timeline time before being dispatched.

If there is no document for timing, events should be dispatched as a standalone task.

* animation/DocumentTimeline.cpp:
(WebCore::DocumentTimeline::~DocumentTimeline): Close the event dispatch task queue when the
document timeline is torn down.
(WebCore::DocumentTimeline::enqueueAnimationPlaybackEvent): Add the provided event to the
pending animation events queue and, if one hasn't been registered yet, enqueue a task to
dispatch events using a GenericTaskQueue<Timer>.
(WebCore::compareAnimationPlaybackEvents): Comparator used to sort events in performEventDispatchTask()
where events are sorted such that unresolved timeline times come first, and then from the
earlier resolved timeline times to the later resolved timeline times. Events with unresolved
timeline times and equal resolved timeline times are sorted in the order they were enqueued.
(WebCore::DocumentTimeline::performEventDispatchTask): Run a stable sort on a copy of the pending list
of events to dispatch and dispatch the events individually on their respective animations.
* animation/DocumentTimeline.h:
* animation/WebAnimation.cpp:
(WebCore::WebAnimation::create): Pass in the document to the constructor.
(WebCore::WebAnimation::WebAnimation): Use the provided document to initialize ActiveDOMObject.
(WebCore::WebAnimation::enqueueAnimationPlaybackEvent): Create an AnimationPlaybackEvent with
the provided type, timeline time and animation time and enqueue it on the document timeline,
if one is available, or dispatch on this animation as a standalone task.
(WebCore::WebAnimation::acceleratedRunningStateDidChange):
(WebCore::WebAnimation::activeDOMObjectName const):
(WebCore::WebAnimation::canSuspendForDocumentSuspension const):
(WebCore::WebAnimation::stop):
* animation/WebAnimation.h: Define WebAnimation to be an EventTarget and an ActiveDOMObject.
* animation/WebAnimation.idl: Define WebAnimation to be an EventTarget and an ActiveDOMObject.
* dom/EventTargetFactory.in:

LayoutTests:

Rebase Web Platform Tests with some progressions based on the IDL changes. Progressions due
to dispatching events will become apparent when the next patch, where we dispatch actual
animation playback events, lands.

* http/wpt/web-animations/interfaces/Animation/idlharness-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@225790 268f45cc-cd09-0410-ab3c-d52691b4dbfc
LayoutTests/ChangeLog
LayoutTests/http/wpt/web-animations/interfaces/Animation/idlharness-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/animation/DocumentTimeline.cpp
Source/WebCore/animation/DocumentTimeline.h
Source/WebCore/animation/WebAnimation.cpp
Source/WebCore/animation/WebAnimation.h
Source/WebCore/animation/WebAnimation.idl
Source/WebCore/dom/EventTargetFactory.in