// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ui/gfx/animation/animation_runner.h" #include #include "base/timer/timer.h" namespace { // A default AnimationRunner based on base::Timer. // TODO(https://crbug.com/953585): Remove this altogether. class DefaultAnimationRunner : public gfx::AnimationRunner { public: DefaultAnimationRunner() = default; ~DefaultAnimationRunner() override = default; // gfx::AnimationRunner: void Stop() override; protected: // gfx::AnimationRunner: void OnStart(base::TimeDelta min_interval, base::TimeDelta elapsed) override; private: void OnTimerTick(); base::OneShotTimer timer_; base::TimeDelta min_interval_; }; void DefaultAnimationRunner::Stop() { timer_.Stop(); } void DefaultAnimationRunner::OnStart(base::TimeDelta min_interval, base::TimeDelta elapsed) { min_interval_ = min_interval; timer_.Start(FROM_HERE, min_interval - elapsed, this, &DefaultAnimationRunner::OnTimerTick); } void DefaultAnimationRunner::OnTimerTick() { // This is effectively a RepeatingTimer. It's possible to use a true // RepeatingTimer for this, but since OnStart() may need to use a OneShotTimer // anyway (when |elapsed| is nonzero), it's just more complicated. timer_.Start(FROM_HERE, min_interval_, this, &DefaultAnimationRunner::OnTimerTick); // Call Step() after timer_.Start() in case Step() calls Stop(). Step(base::TimeTicks::Now()); } } // namespace namespace gfx { // static std::unique_ptr AnimationRunner::CreateDefaultAnimationRunner() { return std::make_unique(); } AnimationRunner::~AnimationRunner() = default; void AnimationRunner::Start( base::TimeDelta min_interval, base::TimeDelta elapsed, base::RepeatingCallback step) { step_ = std::move(step); OnStart(min_interval, elapsed); } AnimationRunner::AnimationRunner() = default; void AnimationRunner::Step(base::TimeTicks tick) { step_.Run(tick); } void AnimationRunner::SetAnimationTimeForTesting(base::TimeTicks time) { step_.Run(time); } } // namespace gfx