[Web Animations] Expose promises on Animation interface
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Dec 2017 23:12:02 +0000 (23:12 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Dec 2017 23:12:02 +0000 (23:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=180710
<rdar://problem/36000604>

Reviewed by Dean Jackson.

Source/WebCore:

Expose the "ready" and "finished" promises on Animation. A future patch will fulfil or reject them.

* animation/WebAnimation.cpp:
(WebCore::WebAnimation::WebAnimation):
(WebCore::WebAnimation::readyPromiseResolve):
(WebCore::WebAnimation::finishedPromiseResolve):
* animation/WebAnimation.h:
* animation/WebAnimation.idl:

LayoutTests:

Rebase some WPT expectations with progressions due to exposing the "ready" and "finished" promises.

* http/wpt/web-animations/interfaces/Animation/idlharness-expected.txt:
* http/wpt/web-animations/timing-model/animations/current-time-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@225812 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/http/wpt/web-animations/interfaces/Animation/idlharness-expected.txt
LayoutTests/http/wpt/web-animations/timing-model/animations/current-time-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/animation/WebAnimation.cpp
Source/WebCore/animation/WebAnimation.h
Source/WebCore/animation/WebAnimation.idl

index 49c6d63..3cf559f 100644 (file)
@@ -1,3 +1,16 @@
+2017-12-12  Antoine Quint  <graouts@apple.com>
+
+        [Web Animations] Expose promises on Animation interface
+        https://bugs.webkit.org/show_bug.cgi?id=180710
+        <rdar://problem/36000604>
+
+        Reviewed by Dean Jackson.
+
+        Rebase some WPT expectations with progressions due to exposing the "ready" and "finished" promises.
+
+        * http/wpt/web-animations/interfaces/Animation/idlharness-expected.txt:
+        * http/wpt/web-animations/timing-model/animations/current-time-expected.txt:
+
 2017-12-12  Myles C. Maxfield  <mmaxfield@apple.com>
 
         IPC code doesn't understand NSDictionaries with non-NSString keys
index abc9e06..1aa084c 100644 (file)
@@ -12,8 +12,8 @@ PASS Animation interface: attribute startTime
 PASS Animation interface: attribute currentTime 
 PASS Animation interface: attribute playbackRate 
 PASS Animation interface: attribute playState 
-FAIL Animation interface: attribute ready assert_true: The prototype object must have a property "ready" expected true got false
-FAIL Animation interface: attribute finished assert_true: The prototype object must have a property "finished" expected true got false
+PASS Animation interface: attribute ready 
+PASS Animation interface: attribute finished 
 FAIL Animation interface: attribute onfinish assert_true: The prototype object must have a property "onfinish" expected true got false
 FAIL Animation interface: attribute oncancel assert_true: The prototype object must have a property "oncancel" expected true got false
 FAIL Animation interface: operation cancel() assert_own_property: interface prototype object missing non-static operation expected property "cancel" missing
@@ -30,8 +30,8 @@ PASS Animation interface: new Animation() must inherit property "startTime" with
 PASS Animation interface: new Animation() must inherit property "currentTime" with the proper type 
 PASS Animation interface: new Animation() must inherit property "playbackRate" with the proper type 
 PASS Animation interface: new Animation() must inherit property "playState" with the proper type 
-FAIL Animation interface: new Animation() must inherit property "ready" with the proper type assert_inherits: property "ready" not found in prototype chain
-FAIL Animation interface: new Animation() must inherit property "finished" with the proper type assert_inherits: property "finished" not found in prototype chain
+PASS Animation interface: new Animation() must inherit property "ready" with the proper type 
+PASS Animation interface: new Animation() must inherit property "finished" with the proper type 
 FAIL Animation interface: new Animation() must inherit property "onfinish" with the proper type assert_inherits: property "onfinish" not found in prototype chain
 FAIL Animation interface: new Animation() must inherit property "oncancel" with the proper type assert_inherits: property "oncancel" not found in prototype chain
 FAIL Animation interface: new Animation() must inherit property "cancel()" with the proper type assert_inherits: property "cancel" not found in prototype chain
index 8852257..c6a663c 100644 (file)
@@ -1,7 +1,9 @@
 
+Harness Error (TIMEOUT), message = null
+
 FAIL The current time returns the hold time when set animation.play is not a function. (In 'animation.play()', 'animation.play' is undefined)
-FAIL The current time is unresolved when there is no associated timeline (and no hold time is set) undefined is not an object (evaluating 'animation.ready.then')
+TIMEOUT The current time is unresolved when there is no associated timeline (and no hold time is set) Test timed out
 PASS The current time is unresolved when the start time is unresolved (and no hold time is set) 
 PASS The current time is calculated from the timeline time, start time and playback rate 
-FAIL The current time does not progress if playback rate is 0 createDiv(t).animate is not a function. (In 'createDiv(t).animate(null, 100 * MS_PER_SEC)', 'createDiv(t).animate' is undefined)
+NOTRUN The current time does not progress if playback rate is 0 
 
index 95e9012..5b091eb 100644 (file)
@@ -1,3 +1,20 @@
+2017-12-12  Antoine Quint  <graouts@apple.com>
+
+        [Web Animations] Expose promises on Animation interface
+        https://bugs.webkit.org/show_bug.cgi?id=180710
+        <rdar://problem/36000604>
+
+        Reviewed by Dean Jackson.
+
+        Expose the "ready" and "finished" promises on Animation. A future patch will fulfil or reject them.
+
+        * animation/WebAnimation.cpp:
+        (WebCore::WebAnimation::WebAnimation):
+        (WebCore::WebAnimation::readyPromiseResolve):
+        (WebCore::WebAnimation::finishedPromiseResolve):
+        * animation/WebAnimation.h:
+        * animation/WebAnimation.idl:
+
 2017-12-12  Youenn Fablet  <youenn@apple.com>
 
         Fetch Event header filtering should apply in CORS mode only
index b053305..1679e8b 100644 (file)
@@ -30,6 +30,7 @@
 #include "AnimationPlaybackEvent.h"
 #include "AnimationTimeline.h"
 #include "Document.h"
+#include "JSWebAnimation.h"
 #include "KeyframeEffect.h"
 #include <wtf/text/WTFString.h>
 
@@ -50,6 +51,8 @@ Ref<WebAnimation> WebAnimation::create(Document& document, AnimationEffect* effe
 
 WebAnimation::WebAnimation(Document& document)
     : ActiveDOMObject(&document)
+    , m_readyPromise(*this, &WebAnimation::readyPromiseResolve)
+    , m_finishedPromise(*this, &WebAnimation::finishedPromiseResolve)
 {
     suspendIfNeeded();
 }
@@ -311,6 +314,16 @@ void WebAnimation::startOrStopAccelerated()
         downcast<KeyframeEffect>(*m_effect).startOrStopAccelerated();
 }
 
+WebAnimation& WebAnimation::readyPromiseResolve()
+{
+    return *this;
+}
+
+WebAnimation& WebAnimation::finishedPromiseResolve()
+{
+    return *this;
+}
+
 String WebAnimation::description()
 {
     return "Animation";
index 0e022e2..65369f5 100644 (file)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "ActiveDOMObject.h"
+#include "DOMPromiseProxy.h"
 #include "EventTarget.h"
 #include "ExceptionOr.h"
 #include <wtf/Forward.h>
@@ -72,6 +73,12 @@ public:
     // FIXME: return a live value once we support pending pause and play tasks.
     bool pending() const { return false; }
 
+    using ReadyPromise = DOMPromiseProxyWithResolveCallback<IDLInterface<WebAnimation>>;
+    ReadyPromise& ready() { return m_readyPromise; }
+
+    using FinishedPromise = DOMPromiseProxyWithResolveCallback<IDLInterface<WebAnimation>>;
+    FinishedPromise& finished() { return m_finishedPromise; }
+
     Seconds timeToNextRequiredTick(Seconds) const;
     void resolve(RenderStyle&);
     void acceleratedRunningStateDidChange();
@@ -87,12 +94,16 @@ private:
 
     void enqueueAnimationPlaybackEvent(const AtomicString&, std::optional<Seconds>, std::optional<Seconds>);
     Seconds effectEndTime() const;
+    WebAnimation& readyPromiseResolve();
+    WebAnimation& finishedPromiseResolve();
     
     RefPtr<AnimationEffect> m_effect;
     RefPtr<AnimationTimeline> m_timeline;
     std::optional<Seconds> m_startTime;
     double m_playbackRate { 1 };
     bool m_isStopped { false };
+    ReadyPromise m_readyPromise;
+    FinishedPromise m_finishedPromise;
 
     // ActiveDOMObject.
     const char* activeDOMObjectName() const final;
index 97c0b62..6fadf76 100644 (file)
@@ -45,4 +45,6 @@ enum AnimationPlayState {
     attribute double playbackRate;
     readonly attribute AnimationPlayState playState;
     readonly attribute boolean pending;
+    readonly attribute Promise<WebAnimation> ready;
+    readonly attribute Promise<WebAnimation> finished;
 };