| Index: Source/core/animation/AnimationPlayer.cpp
|
| diff --git a/Source/core/animation/AnimationPlayer.cpp b/Source/core/animation/AnimationPlayer.cpp
|
| index 2f86246e2d0203b7f4ed4502303e03ab3b1fe220..ece23a561ae8997ff470b261f9a7998eb292cb37 100644
|
| --- a/Source/core/animation/AnimationPlayer.cpp
|
| +++ b/Source/core/animation/AnimationPlayer.cpp
|
| @@ -537,6 +537,16 @@ void AnimationPlayer::finish(ExceptionState& exceptionState)
|
| ASSERT(limited());
|
| }
|
|
|
| +ScriptPromise AnimationPlayer::finished(ScriptState* scriptState)
|
| +{
|
| + if (!m_finishedPromise) {
|
| + m_finishedPromise = new AnimationPlayerPromise(scriptState->executionContext(), this, AnimationPlayerPromise::Finished);
|
| + if (playStateInternal() == Finished)
|
| + m_finishedPromise->resolve(this);
|
| + }
|
| + return m_finishedPromise->promise(scriptState->world());
|
| +}
|
| +
|
| const AtomicString& AnimationPlayer::interfaceName() const
|
| {
|
| return EventTargetNames::AnimationPlayer;
|
| @@ -761,7 +771,7 @@ void AnimationPlayer::endUpdatingState()
|
|
|
| AnimationPlayer::PlayStateUpdateScope::PlayStateUpdateScope(AnimationPlayer& player, TimingUpdateReason reason, CompositorPendingChange compositorPendingChange)
|
| : m_player(player)
|
| - , m_initial(m_player->playStateInternal())
|
| + , m_initialPlayState(m_player->playStateInternal())
|
| , m_compositorPendingChange(compositorPendingChange)
|
| {
|
| m_player->beginUpdatingState();
|
| @@ -770,7 +780,7 @@ AnimationPlayer::PlayStateUpdateScope::PlayStateUpdateScope(AnimationPlayer& pla
|
|
|
| AnimationPlayer::PlayStateUpdateScope::~PlayStateUpdateScope()
|
| {
|
| - AnimationPlayState oldPlayState = m_initial;
|
| + AnimationPlayState oldPlayState = m_initialPlayState;
|
| AnimationPlayState newPlayState = m_player->calculatePlayState();
|
| if (oldPlayState != newPlayState) {
|
| bool wasActive = oldPlayState == Pending || oldPlayState == Running;
|
| @@ -791,6 +801,23 @@ AnimationPlayer::PlayStateUpdateScope::~PlayStateUpdateScope()
|
| }
|
| }
|
|
|
| + if (m_player->m_finishedPromise && newPlayState != oldPlayState) {
|
| + if (newPlayState == Idle) {
|
| + if (m_player->m_finishedPromise->state() == AnimationPlayerPromise::Pending) {
|
| + m_player->m_finishedPromise->reject(DOMException::create(AbortError));
|
| + }
|
| + m_player->m_finishedPromise->reset();
|
| + }
|
| +
|
| + if (newPlayState == Finished) {
|
| + m_player->m_finishedPromise->resolve(m_player);
|
| + }
|
| +
|
| + if (oldPlayState == Finished) {
|
| + m_player->m_finishedPromise->reset();
|
| + }
|
| + }
|
| +
|
| if (oldPlayState != newPlayState && (oldPlayState == Idle || newPlayState == Idle)) {
|
| m_player->setOutdated();
|
| }
|
| @@ -849,6 +876,7 @@ void AnimationPlayer::trace(Visitor* visitor)
|
| visitor->trace(m_content);
|
| visitor->trace(m_timeline);
|
| visitor->trace(m_pendingFinishedEvent);
|
| + visitor->trace(m_finishedPromise);
|
| EventTargetWithInlineData::trace(visitor);
|
| ActiveDOMObject::trace(visitor);
|
| }
|
|
|