blob: 3225f6f8bf9e5d7ec5797353d0553ea2d3bc6cf7 [file] [log] [blame]
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COBALT_WEB_ANIMATIONS_ANIMATION_TIMELINE_H_
#define COBALT_WEB_ANIMATIONS_ANIMATION_TIMELINE_H_
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "cobalt/base/clock.h"
#include "cobalt/script/wrappable.h"
#include "cobalt/web_animations/timed_task_queue.h"
namespace cobalt {
namespace web_animations {
class Animation;
class AnimationSet;
// Implements the AnimationTimeline IDL interface.
// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#the-animationtimeline-interface
class AnimationTimeline : public script::Wrappable {
public:
explicit AnimationTimeline(const scoped_refptr<base::Clock>& clock);
// Returns the current sample time of the timeline, in milliseconds. If the
// returned optional is not engaged, this timeline is 'unresolved'.
base::optional<double> current_time() const;
// Custom, not in any spec.
// Helper class to return the current time as a base::TimeDelta instead of a
// double.
const base::optional<base::TimeDelta>& current_time_as_time_delta() const {
return sampled_clock_time_;
}
// The owner of this timeline should call Sample() each time a new sample
// time is ready.
void Sample();
// Returns the number of animations registered to this timeline. This is not
// in the spec, but serves as a poor-man's replacement for getAnimations()
// until we have support for that.
unsigned int num_animations() const;
DEFINE_WRAPPABLE_TYPE(AnimationTimeline);
protected:
~AnimationTimeline() OVERRIDE;
private:
// Registers and deregisters an animation with this timeline so that we are
// able to track all animations currently associated with this timeline.
// This will be required in order to implement getAnimations().
void Register(Animation* animation);
void Deregister(Animation* animation);
// Called by Animation objects to queue their events into this timeline's
// TimedTaskQueue.
scoped_ptr<TimedTaskQueue::Task> QueueTask(base::TimeDelta fire_time,
const base::Closure& closure);
void UpdateNextEventTimer();
scoped_refptr<base::Clock> clock_;
scoped_refptr<AnimationSet> animations_;
TimedTaskQueue event_queue_;
base::optional<base::TimeDelta> sampled_clock_time_;
base::OneShotTimer<AnimationTimeline> next_event_timer_;
// So that Animation objects can register themselves.
friend class Animation;
DISALLOW_COPY_AND_ASSIGN(AnimationTimeline);
};
} // namespace web_animations
} // namespace cobalt
#endif // COBALT_WEB_ANIMATIONS_ANIMATION_TIMELINE_H_