// 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_DOM_DOM_ANIMATABLE_H_
#define COBALT_DOM_DOM_ANIMATABLE_H_

#include "base/compiler_specific.h"
#include "cobalt/dom/document.h"
#include "cobalt/dom/event.h"
#include "cobalt/dom/html_element.h"
#include "cobalt/dom/pseudo_element.h"
#include "cobalt/web_animations/animatable.h"

namespace cobalt {
namespace dom {

// In order to keep the Web Animations module not dependent on DOM, Animatable
// is left abstract, and is subclassed within DOM here in order to connect
// it to DOM.  Note that this informally implements the specification statement
// that Element and PseudoElement should "implement" Animatable, as indicated
// in the IDL Index:
// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#idl-index
class DOMAnimatable : public web_animations::Animatable {
 public:
  explicit DOMAnimatable(Element* element)
      : element_(element), pseudo_element_(NULL) {}

  explicit DOMAnimatable(PseudoElement* pseudo_element)
      : element_(NULL), pseudo_element_(pseudo_element) {}

  // Returns the default timeline associated with the document that is
  // associated with the underlying Element or PseudoElement.
  scoped_refptr<web_animations::AnimationTimeline> GetDefaultTimeline()
      const OVERRIDE;

  // Registers an animation with this Animatable (which may internally be
  // either an HTMLElement or a PseudoElement).
  void Register(web_animations::Animation* animation) OVERRIDE;
  void Deregister(web_animations::Animation* animation) OVERRIDE;

  // Returns the element that acts as an EventTarget for this animatable.
  // In the case of elements, it will be the element itself.  In the case of
  // pseudo elements, it will be the pseudo element's parent element.
  Element* GetEventTarget();

 private:
  Element* element_;
  PseudoElement* pseudo_element_;
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_DOM_ANIMATABLE_H_
