193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)/*
293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * modification, are permitted provided that the following conditions are
693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * met:
793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
1093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
1193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
1293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * in the documentation and/or other materials provided with the
1393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * distribution.
1493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
1593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
1693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * this software without specific prior written permission.
1793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
1893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) */
3093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "config.h"
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/animation/AnimationPlayer.h"
3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/animation/Animation.h"
35d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/animation/AnimationTimeline.h"
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/Document.h"
37a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "core/events/AnimationPlayerEvent.h"
38a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "core/frame/UseCounter.h"
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/TraceEvent.h"
40fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch#include "wtf/MathExtras.h"
4193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
4393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)namespace {
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static unsigned nextSequenceNumber()
4793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static unsigned next = 0;
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return ++next;
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
5393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
54d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<AnimationPlayer> AnimationPlayer::create(ExecutionContext* executionContext, AnimationTimeline& timeline, AnimationNode* content)
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
569e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RefPtrWillBeRawPtr<AnimationPlayer> player = adoptRefWillBeNoop(new AnimationPlayer(executionContext, timeline, content));
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    player->uncancel();
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    timeline.document()->compositorPendingAnimations().add(player.get());
59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    player->suspendIfNeeded();
60d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return player.release();
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTimeline& timeline, AnimationNode* content)
64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    : ActiveDOMObject(executionContext)
65d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    , m_playbackRate(1)
6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    , m_startTime(nullValue())
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_holdTime(0)
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_sequenceNumber(nextSequenceNumber())
6993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    , m_content(content)
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_timeline(&timeline)
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_paused(false)
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_held(true)
73f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_isPausedForTesting(false)
74323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_outdated(true)
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_finished(true)
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_compositorState(nullptr)
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_compositorPending(true)
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_currentTimePending(false)
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_idle(true)
8093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_content) {
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_content->player()) {
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_content->player()->cancel();
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_content->player()->setSource(0);
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
8683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_content->attach(this);
87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
8893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
8993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)AnimationPlayer::~AnimationPlayer()
9183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{
92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
9383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    if (m_content)
9483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_content->detach();
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_timeline)
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_timeline->playerDestroyed(this);
97d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
9883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch}
9983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double AnimationPlayer::sourceEnd() const
10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
10210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_content ? m_content->endTimeInternal() : 0;
10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
10451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool AnimationPlayer::limited(double currentTime) const
10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return (m_playbackRate < 0 && currentTime <= 0) || (m_playbackRate > 0 && currentTime >= sourceEnd());
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setCurrentTimeInternal(double newCurrentTime, TimingUpdateReason reason)
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(std::isfinite(newCurrentTime));
11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool oldHeld = m_held;
115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool outdated = false;
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool isLimited = limited(newCurrentTime);
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_held = m_paused || !m_playbackRate || isLimited || std::isnan(m_startTime);
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_held) {
119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!oldHeld || m_holdTime != newCurrentTime)
120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            outdated = true;
12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_holdTime = newCurrentTime;
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_paused || !m_playbackRate) {
123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            m_startTime = nullValue();
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        } else if (isLimited && std::isnan(m_startTime) && reason == TimingUpdateForAnimationFrame) {
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_startTime = calculateStartTime(newCurrentTime);
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else {
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_holdTime = nullValue();
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_startTime = calculateStartTime(newCurrentTime);
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setFinished(false);
131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        outdated = true;
132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (outdated) {
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        setOutdated();
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Update timing to reflect updated animation clock due to tick
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::updateCurrentTimingState(TimingUpdateReason reason)
14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_held) {
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setCurrentTimeInternal(m_holdTime, reason);
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!limited(calculateCurrentTime()))
147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_held = true;
149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd();
15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::startTime(bool& isNull) const
1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double result = startTime();
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    isNull = std::isnan(result);
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return result;
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::startTime() const
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    UseCounter::count(executionContext(), UseCounter::AnimationPlayerGetStartTime);
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_startTime * 1000;
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::currentTime(bool& isNull)
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double result = currentTime();
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    isNull = std::isnan(result);
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return result;
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double AnimationPlayer::currentTime()
17309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    UseCounter::count(executionContext(), UseCounter::AnimationPlayerGetCurrentTime);
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_currentTimePending || m_idle)
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return std::numeric_limits<double>::quiet_NaN();
17710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return currentTimeInternal() * 1000;
17810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
17910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
18010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochdouble AnimationPlayer::currentTimeInternal()
18110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    updateCurrentTimingState(TimingUpdateOnDemand);
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_held)
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return m_holdTime;
185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return calculateCurrentTime();
18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::preCommit(bool startOnCompositor)
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_compositorState && m_compositorState->pendingAction == Start) {
1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Still waiting for a start time.
1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool softChange = m_compositorState && (paused() || m_compositorState->playbackRate != m_playbackRate);
1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool hardChange = m_compositorState && (m_compositorState->sourceChanged || (m_compositorState->startTime != m_startTime && !std::isnan(m_compositorState->startTime) && !std::isnan(m_startTime)));
1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: softChange && !hardChange should generate a Pause/ThenStart,
1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // not a Cancel, but we can't communicate these to the compositor yet.
2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool changed = softChange || hardChange;
2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool shouldCancel = (!playing() && m_compositorState) || changed;
2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool shouldStart = playing() && (!m_compositorState || changed);
2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (shouldCancel) {
2067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        cancelAnimationOnCompositor();
2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_compositorState = nullptr;
2087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!shouldStart) {
2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_currentTimePending = false;
2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (shouldStart && startOnCompositor && maybeStartAnimationOnCompositor()) {
2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_compositorState = adoptPtr(new CompositorState(*this));
2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::postCommit(double timelineTime)
2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_compositorPending = false;
2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_compositorState || m_compositorState->pendingAction == None)
2257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    switch (m_compositorState->pendingAction) {
2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Start:
2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!std::isnan(m_compositorState->startTime)) {
2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            ASSERT(m_startTime == m_compositorState->startTime);
2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_compositorState->pendingAction = None;
2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        break;
2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Pause:
2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case PauseThenStart:
2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(std::isnan(m_startTime));
2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_compositorState->pendingAction = None;
2387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setCurrentTimeInternal((timelineTime - m_compositorState->startTime) * m_playbackRate, TimingUpdateForAnimationFrame);
2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_currentTimePending = false;
2407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        break;
2417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    default:
2427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT_NOT_REACHED();
2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::notifyCompositorStartTime(double timelineTime)
2477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_compositorState) {
2497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(m_compositorState->pendingAction == Start);
2507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(std::isnan(m_compositorState->startTime));
2517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        double initialCompositorHoldTime = m_compositorState->holdTime;
2537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_compositorState->pendingAction = None;
254f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch        m_compositorState->startTime = timelineTime + currentTimeInternal() / -m_playbackRate;
2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (paused() || m_compositorState->playbackRate != m_playbackRate || m_compositorState->sourceChanged) {
2577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // Paused state, playback rate, or source changed while starting.
2587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            setCompositorPending();
2597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
2607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_startTime == timelineTime) {
2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // The start time was set to the incoming compositor start time.
2637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // Unlikely, but possible.
2647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // FIXME: Depending on what changed above this might still be pending.
2657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // Maybe...
2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_currentTimePending = false;
2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return;
2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!std::isnan(m_startTime) || currentTimeInternal() != initialCompositorHoldTime) {
2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // A new start time or current time was set while starting.
2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            setCompositorPending();
2737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return;
2747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
2757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (playing()) {
2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(std::isnan(m_startTime));
2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(m_held);
2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_playbackRate == 0) {
2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            setStartTimeInternal(timelineTime);
2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        } else {
2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            setStartTimeInternal(timelineTime + currentTimeInternal() / -m_playbackRate);
2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
2867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // FIXME: This avoids marking this player as outdated needlessly when a start time
2887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // is notified, but we should refactor how outdating works to avoid this.
2897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_outdated = false;
2907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_currentTimePending = false;
2927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::calculateStartTime(double currentTime) const
2967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_timeline->effectiveTime() - currentTime / m_playbackRate;
2987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
300c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)double AnimationPlayer::calculateCurrentTime() const
30109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(!m_held);
303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (isNull(m_startTime) || !m_timeline)
304c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return 0;
305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return (m_timeline->effectiveTime() - m_startTime) * m_playbackRate;
30610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
30710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void AnimationPlayer::setCurrentTime(double newCurrentTime)
30910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
3107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    UseCounter::count(executionContext(), UseCounter::AnimationPlayerSetCurrentTime);
31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!std::isfinite(newCurrentTime))
31209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
3137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorPending();
3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_currentTimePending = false;
3167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand);
31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setStartTime(double startTime)
32009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    UseCounter::count(executionContext(), UseCounter::AnimationPlayerSetStartTime);
3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_paused || m_idle)
323c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return;
3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!std::isfinite(startTime))
32509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
3267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (startTime == m_startTime)
327a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
328c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
3297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorPending();
3307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_currentTimePending = false;
3317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setStartTimeInternal(startTime / 1000);
3327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
3337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setStartTimeInternal(double newStartTime)
3357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
3367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(!m_paused);
3377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(std::isfinite(newStartTime));
3387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(newStartTime != m_startTime);
3397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
340323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    bool hadStartTime = hasStartTime();
341323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    double previousCurrentTime = currentTimeInternal();
34209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_startTime = newStartTime;
3437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_held && m_playbackRate) {
3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // If held, the start time would still be derrived from the hold time.
3457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Force a new, limited, current time.
3467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_held = false;
3477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        double currentTime = calculateCurrentTime();
3487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_playbackRate > 0 && currentTime > sourceEnd()) {
3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            currentTime = sourceEnd();
3507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        } else if (m_playbackRate < 0 && currentTime < 0) {
3517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            currentTime = 0;
3527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
3537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setCurrentTimeInternal(currentTime, TimingUpdateOnDemand);
3547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
355c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    double newCurrentTime = currentTimeInternal();
356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
357c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (previousCurrentTime != newCurrentTime) {
358323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        setOutdated();
359323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    } else if (!hadStartTime && m_timeline) {
360323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // Even though this player is not outdated, time to effect change is
361323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // infinity until start time is set.
362323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_timeline->wake();
363323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
36409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
366d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void AnimationPlayer::setSource(AnimationNode* newSource)
36709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_content == newSource)
36909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
3707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorPending(true);
3727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
37310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    double storedCurrentTime = currentTimeInternal();
37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_content)
37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_content->detach();
376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_content = newSource;
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (newSource) {
37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // FIXME: This logic needs to be updated once groups are implemented
3797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (newSource->player()) {
380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            newSource->player()->cancel();
3817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            newSource->player()->setSource(0);
3827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        newSource->attach(this);
3847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setOutdated();
38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
3867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand);
3877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
3887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciString AnimationPlayer::playState()
3907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
3917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    switch (playStateInternal()) {
3927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Idle:
3937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return "idle";
3947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Pending:
3957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return "pending";
3967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Running:
3977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return "running";
3987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Paused:
3997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return "paused";
4007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case Finished:
4017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return "finished";
4027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    default:
4037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT_NOT_REACHED();
4047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return "";
4057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
4067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
4077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciAnimationPlayer::AnimationPlayState AnimationPlayer::playStateInternal()
4097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
4107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_idle)
4117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return Idle;
4127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_currentTimePending || (isNull(m_startTime) && !m_paused && m_playbackRate != 0))
4137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return Pending;
4147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_paused)
4157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return Paused;
4167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (finished())
4177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return Finished;
4187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return Running;
41909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
42009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::pause()
42209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
42309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_paused)
42409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
4257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (playing()) {
4267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setCompositorPending();
4277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_currentTimePending = true;
4287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
42909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_paused = true;
4307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand);
43109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
43209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::unpause()
43409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
43509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_paused)
43609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
4377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorPending();
4387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_currentTimePending = true;
4397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    unpauseInternal();
4407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
4417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::unpauseInternal()
4437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
4447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_paused)
4457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
44609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_paused = false;
4477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand);
44809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
44909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::play()
45109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
4527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!playing())
4537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_startTime = nullValue();
4547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorPending();
4567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    uncancel();
4577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    unpauseInternal();
45809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_content)
45909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
46010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    double currentTime = this->currentTimeInternal();
46109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_playbackRate > 0 && (currentTime < 0 || currentTime >= sourceEnd()))
4627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setCurrentTimeInternal(0, TimingUpdateOnDemand);
46309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    else if (m_playbackRate < 0 && (currentTime <= 0 || currentTime > sourceEnd()))
4647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand);
4657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setFinished(false);
46609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
46709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::reverse()
46909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
4707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_playbackRate) {
47109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
47209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
4737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    uncancel();
4757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setPlaybackRateInternal(-m_playbackRate);
4767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    play();
47709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
47809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::finish(ExceptionState& exceptionState)
48009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
4817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_playbackRate || m_idle) {
48209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
48309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
4847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infinity()) {
4857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity.");
4867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
4877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
4887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (playing()) {
4897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setCompositorPending();
4907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
4917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    uncancel();
4937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double newCurrentTime = m_playbackRate < 0 ? 0 : sourceEnd();
4957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCurrentTimeInternal(newCurrentTime, TimingUpdateOnDemand);
4967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!paused()) {
4977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_startTime = calculateStartTime(newCurrentTime);
4987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
4997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_currentTimePending = false;
50109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(finished());
50209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
50309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
504aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochconst AtomicString& AnimationPlayer::interfaceName() const
505aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
506aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    return EventTargetNames::AnimationPlayer;
507aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
508aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
509aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochExecutionContext* AnimationPlayer::executionContext() const
510aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
511d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return ActiveDOMObject::executionContext();
512d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
513d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
514d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool AnimationPlayer::hasPendingActivity() const
515d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
516d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return m_pendingFinishedEvent || (!m_finished && hasEventListeners(EventTypeNames::finish));
517d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
518d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
519d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void AnimationPlayer::stop()
520d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
5217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setFinished(true);
522d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_pendingFinishedEvent = nullptr;
523d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
524d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
525d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool AnimationPlayer::dispatchEvent(PassRefPtrWillBeRawPtr<Event> event)
526d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
527d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_pendingFinishedEvent == event)
528d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_pendingFinishedEvent = nullptr;
529d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return EventTargetWithInlineData::dispatchEvent(event);
530aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
531aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
5327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::playbackRate() const
5337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
5347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    UseCounter::count(executionContext(), UseCounter::AnimationPlayerGetPlaybackRate);
5357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_playbackRate;
5367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::setPlaybackRate(double playbackRate)
53909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
5407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    UseCounter::count(executionContext(), UseCounter::AnimationPlayerSetPlaybackRate);
54109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!std::isfinite(playbackRate))
54209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
5437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (playbackRate == m_playbackRate)
5447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
5457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setPlaybackRateInternal(playbackRate);
5477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setPlaybackRateInternal(double playbackRate)
5507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
5517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(std::isfinite(playbackRate));
5527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(playbackRate != m_playbackRate);
5537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorPending();
5557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!finished() && !paused() && hasStartTime())
5567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_currentTimePending = true;
5577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
55810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    double storedCurrentTime = currentTimeInternal();
559a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if ((m_playbackRate < 0 && playbackRate >= 0) || (m_playbackRate > 0 && playbackRate <= 0))
5607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setFinished(false);
5617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
56209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_playbackRate = playbackRate;
5637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_startTime = std::numeric_limits<double>::quiet_NaN();
5647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand);
56509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
56609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::setOutdated()
56809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_outdated = true;
57009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_timeline)
571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_timeline->setOutdatedAnimationPlayer(this);
57251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
57351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
57410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool AnimationPlayer::canStartAnimationOnCompositor()
57551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
576fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch    if (m_playbackRate == 0 || (std::isinf(sourceEnd()) && m_playbackRate < 0))
577a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return false;
578a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
5797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_timeline && m_content && m_content->isAnimation() && playing();
58010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
58110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
58210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool AnimationPlayer::maybeStartAnimationOnCompositor()
58310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
58410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!canStartAnimationOnCompositor())
58551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return false;
58651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
587f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch    bool reversed = m_playbackRate < 0;
588f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch
5897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double startTime = timeline()->zeroTime() + startTimeInternal();
590f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch    if (reversed) {
591f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch        startTime -= sourceEnd() / fabs(m_playbackRate);
592f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch    }
593f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch
5947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double timeOffset = 0;
5957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (std::isnan(startTime)) {
596f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch        timeOffset = reversed ? sourceEnd() - currentTimeInternal() : currentTimeInternal();
597fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch        timeOffset = timeOffset / fabs(m_playbackRate);
5987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
5997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return toAnimation(m_content.get())->maybeStartAnimationOnCompositor(startTime, timeOffset, m_playbackRate);
60010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
60110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
6027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setCompositorPending(bool sourceChanged)
60310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
6047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Animation could notify this directly?
6057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!hasActiveAnimationsOnCompositor()) {
6067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_compositorState.release();
6077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
6087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_compositorPending) {
6097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_compositorPending = true;
6107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (sourceChanged && m_compositorState)
6117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_compositorState->sourceChanged = true;
61210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        timeline()->document()->compositorPendingAnimations().add(this);
6137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
61451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
61551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool AnimationPlayer::hasActiveAnimationsOnCompositor()
61751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
61851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!m_content || !m_content->isAnimation())
61951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return false;
62010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
62151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return toAnimation(m_content.get())->hasActiveAnimationsOnCompositor();
62251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
62351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::cancelAnimationOnCompositor()
62551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
62651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (hasActiveAnimationsOnCompositor())
62751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        toAnimation(m_content.get())->cancelAnimationOnCompositor();
62893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
62993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
630323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool AnimationPlayer::update(TimingUpdateReason reason)
63193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
6326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (!m_timeline)
63393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return false;
63493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
6357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    updateCurrentTimingState(reason);
636c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_outdated = false;
637c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
6386f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (m_content) {
6397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        double inheritedTime = m_idle || isNull(m_timeline->currentTimeInternal()) ? nullValue() : currentTimeInternal();
6407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Special case for end-exclusivity when playing backwards.
6417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (inheritedTime == 0 && m_playbackRate < 0)
6427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            inheritedTime = -1;
643323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_content->updateInheritedTime(inheritedTime, reason);
6446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
64509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if ((m_idle || finished()) && !m_finished) {
6477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (reason == TimingUpdateForAnimationFrame && (m_idle || hasStartTime())) {
648323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            const AtomicString& eventType = EventTypeNames::finish;
649323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            if (executionContext() && hasEventListeners(eventType)) {
6507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                double eventCurrentTime = currentTimeInternal() * 1000;
6517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType, eventCurrentTime, timeline()->currentTime());
652d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                m_pendingFinishedEvent->setTarget(this);
653d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                m_pendingFinishedEvent->setCurrentTarget(this);
654d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                m_timeline->document()->enqueueAnimationFrameEvent(m_pendingFinishedEvent);
6556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            }
6567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            setFinished(true);
657a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
658a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
6596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    ASSERT(!m_outdated);
6607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return !m_finished;
66193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
66293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double AnimationPlayer::timeToEffectChange()
66409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!m_outdated);
6666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (m_held || !hasStartTime())
66709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return std::numeric_limits<double>::infinity();
6686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (!m_content)
66910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return -currentTimeInternal() / m_playbackRate;
67009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_playbackRate > 0)
67109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return m_content->timeToForwardsEffectChange() / m_playbackRate;
6726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return m_content->timeToReverseEffectChange() / -m_playbackRate;
67309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
67409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setFinished(bool finished)
6767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
6777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_finished && !finished) {
6787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_content) {
6797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            TRACE_EVENT_ASYNC_BEGIN1("blink", "Animation", this, "Name", TRACE_STR_COPY(m_content->name().utf8().data()));
6807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        } else {
6817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            TRACE_EVENT_ASYNC_BEGIN0("blink", "Animation", this);
6827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
6837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
6847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_finished && finished) {
6857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        TRACE_EVENT_ASYNC_END0("blink", "Animation", this);
6867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
6877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_finished = finished;
6887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
6897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::cancel()
691f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
6927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_idle)
6937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
6947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
6957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_holdTime = currentTimeInternal();
6967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_held = true;
6977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_idle = true;
6987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_startTime = nullValue();
6997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_currentTimePending = false;
7007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCompositorPending();
7017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
7027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
7037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::uncancel()
7047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
7057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_idle)
7067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
7077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
7087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_idle = false;
7097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_held = true;
7107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_holdTime = 0;
7117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setFinished(false);
712d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
7147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
715d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
7166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochbool AnimationPlayer::canFree() const
7176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
7186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    ASSERT(m_content);
7196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef();
7206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
721d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
7226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
723a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool AnimationPlayer::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
724a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
725a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (eventType == EventTypeNames::finish)
726a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        UseCounter::count(executionContext(), UseCounter::AnimationPlayerFinishEvent);
727a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return EventTargetWithInlineData::addEventListener(eventType, listener, useCapture);
728a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
729a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::pauseForTesting(double pauseTime)
731f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
73251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RELEASE_ASSERT(!paused());
7337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setCurrentTimeInternal(pauseTime, TimingUpdateOnDemand);
7347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (hasActiveAnimationsOnCompositor())
73510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        toAnimation(m_content.get())->pauseAnimationForTestingOnCompositor(currentTimeInternal());
736f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_isPausedForTesting = true;
73709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    pause();
73893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
73993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
740d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void AnimationPlayer::trace(Visitor* visitor)
741d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
742d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_content);
743d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_timeline);
744d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_pendingFinishedEvent);
745d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EventTargetWithInlineData::trace(visitor);
746d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
747d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
74893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} // namespace
749