/*
 * 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_ANIMATABLE_H_
#define COBALT_WEB_ANIMATIONS_ANIMATABLE_H_

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "cobalt/script/wrappable.h"
#include "cobalt/web_animations/animation.h"
#include "cobalt/web_animations/animation_timeline.h"

namespace cobalt {
namespace web_animations {

// Objects that may be the target of an KeyframeEffectReadOnly object implement
// the Animatable interface.
//   https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#the-animatable-interface
// We unfortunately are not able to express this in IDL currently as it
// represents an interface that dom::Element and dom::PseudoElement must
// implement, but we don't have an IDL inheritance mechanism in place right now.
class Animatable : public script::Wrappable {
 public:
  Animatable() {}

  // Returns the default timeline associated with the underlying Animatable
  // object.
  virtual scoped_refptr<AnimationTimeline> GetDefaultTimeline() const = 0;

  // Registers an animation with this Animatable object.
  virtual void Register(web_animations::Animation* animation) = 0;
  virtual void Deregister(web_animations::Animation* animation) = 0;

  DEFINE_WRAPPABLE_TYPE(Animatable);

 protected:
  virtual ~Animatable() {}

 private:
  friend class base::RefCounted<Animatable>;

  DISALLOW_COPY_AND_ASSIGN(Animatable);
};

}  // namespace web_animations
}  // namespace cobalt

#endif  // COBALT_WEB_ANIMATIONS_ANIMATABLE_H_
