// Copyright 2015 The Cobalt Authors. 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_DOM_ANIMATION_EVENT_H_
#define COBALT_DOM_ANIMATION_EVENT_H_

#include <string>

#include "cobalt/base/token.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/web/event.h"

namespace cobalt {
namespace dom {

// The completion of a CSS Animation generates a corresponding DOM Event.
//   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-events
class AnimationEvent : public web::Event {
 public:
  explicit AnimationEvent(const std::string& type)
      : Event(base::Token(type), kBubbles, kNotCancelable),
        animation_name_(""),
        elapsed_time_(0) {}

  AnimationEvent(base::Token type, const std::string& animation_name,
                 float elapsed_time)
      : Event(type, kBubbles, kNotCancelable),
        animation_name_(animation_name),
        elapsed_time_(elapsed_time) {}

  // The name of the @keyframes rule identifying the animation.
  std::string animation_name() const { return animation_name_; }

  // The amount of time the animation has been running, in seconds, when this
  // event fired. Note that this value is not affected by the value of
  // animation-delay.
  float elapsed_time() const { return elapsed_time_; }

  DEFINE_WRAPPABLE_TYPE(AnimationEvent);

 private:
  ~AnimationEvent() override {}

  std::string animation_name_;
  float elapsed_time_;
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_ANIMATION_EVENT_H_
