[Web Animations] Dispatch DOM events for CSS Transitions and CSS Animations implement...
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 21 Mar 2018 19:41:26 +0000 (19:41 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 21 Mar 2018 19:41:26 +0000 (19:41 +0000)
commita2a8cf4ce412ff6b78b632c119241b7ee8509be6
tree10376454767e9f8c0dcce495e1adbf8c1a63964f
parent19f305f54ff9d2dcffa303252e1dde1a67ab58f9
[Web Animations] Dispatch DOM events for CSS Transitions and CSS Animations implemented as Web Animations
https://bugs.webkit.org/show_bug.cgi?id=183781

Reviewed by Dean Jackson.

LayoutTests/imported/mozilla:

Some of the Mozilla tests no longer time out and partially pass, marking the progression.

* css-animations/test_animation-starttime-expected.txt:
* css-animations/test_element-get-animations-expected.txt:

Source/WebCore:

Now that we've implemented CSS Animations and CSS Transitions as Web Animations (webkit.org/b/183504) we can dispatch DOM events
for targets of DeclarativeAnimation objects. To do that, we add a new invalidateDOMEvents() method on DeclarativeAnimations which
is called when the timer scheduled after the timing model has been invalidated fires in DocumentTimeline::performInvalidationTask().
When we check for DOM events to dispatch, we look at the last recorded phase and iteration and determine whether the state of the
animation has changed. We use a GenericEventQueue to enqueue the events such that they are dispatched asynchronously at a moment
when it is safe to evaluate script.

* animation/AnimationEffectReadOnly.h: Make currentIteration() public since we now need it in DeclarativeAnimation::invalidateDOMEvents().
* animation/CSSAnimation.cpp:
(WebCore::CSSAnimation::create): Pass the animation target to the constructor instead of its document.
(WebCore::CSSAnimation::CSSAnimation): Pass the animation target to the superclass instead of its document.
* animation/CSSAnimation.h:
* animation/CSSTransition.cpp:
(WebCore::CSSTransition::create): Pass the animation target to the constructor instead of its document.
(WebCore::CSSTransition::CSSTransition): Pass the animation target to the superclass instead of its document.
* animation/CSSTransition.h:
* animation/DeclarativeAnimation.cpp:
(WebCore::DeclarativeAnimation::DeclarativeAnimation): Expect an Element instead of a Document and use that element as the target of the
GenericEventQueue that we initialize. We also register this element as our m_target.
(WebCore::DeclarativeAnimation::~DeclarativeAnimation): Close the GenericEventQueue member upon destruction.
(WebCore::DeclarativeAnimation::initialize): We need to call pause() for declarative animations that aren't playing so that the animation's
playState is set correctly and the animation is not idle.
(WebCore::DeclarativeAnimation::phaseWithoutEffect const): Because we may need to get an animation's current phase in invalidateDOMEvents()
after an animation's effect has been removed, we provide an alternate way to compute the phase just by looking at the animation's current time.
(WebCore::DeclarativeAnimation::invalidateDOMEvents): Based on the previous and current pending state, iteration and phase, we enqueue animation
and transition DOM events as specified by the CSS Animations Level 2 and CSS Transitions Level 2 specifications.
(WebCore::DeclarativeAnimation::enqueueDOMEvent): Enqueue an event on the GenericEventQueue based on the animation type.
* animation/DeclarativeAnimation.h:
* animation/DocumentTimeline.cpp:
(WebCore::DocumentTimeline::performInvalidationTask): We call invalidateDOMEvents() on all declarative animations registered with this timeline
now that the timing model has been invalidated.
* dom/EventNames.h: Add the names of newly-implemented events (animationcancel, transitioncancel, transitionrun and transitionstart).
* dom/GlobalEventHandlers.idl: Add new attribute-based event handlers for the newly-implemented events.
* html/HTMLAttributeNames.in: Add new attribute-based event handlers for the newly-implemented events.
* html/HTMLElement.cpp:
(WebCore::HTMLElement::createEventHandlerNameMap): Add new attribute-based event handlers for the newly-implemented events.

LayoutTests:

New attribute-based event handlers are now exposed, update the expectations for those.

* js/dom/dom-static-property-for-in-iteration-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@229818 268f45cc-cd09-0410-ab3c-d52691b4dbfc
18 files changed:
LayoutTests/ChangeLog
LayoutTests/imported/mozilla/ChangeLog
LayoutTests/imported/mozilla/css-animations/test_animation-starttime-expected.txt
LayoutTests/imported/mozilla/css-animations/test_element-get-animations-expected.txt
LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/animation/AnimationEffectReadOnly.h
Source/WebCore/animation/CSSAnimation.cpp
Source/WebCore/animation/CSSAnimation.h
Source/WebCore/animation/CSSTransition.cpp
Source/WebCore/animation/CSSTransition.h
Source/WebCore/animation/DeclarativeAnimation.cpp
Source/WebCore/animation/DeclarativeAnimation.h
Source/WebCore/animation/DocumentTimeline.cpp
Source/WebCore/dom/EventNames.h
Source/WebCore/dom/GlobalEventHandlers.idl
Source/WebCore/html/HTMLAttributeNames.in
Source/WebCore/html/HTMLElement.cpp