/*
 * 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_CSSOM_PSEUDO_ELEMENT_H_
#define COBALT_CSSOM_PSEUDO_ELEMENT_H_

#include "base/compiler_specific.h"
#include "cobalt/base/tokens.h"
#include "cobalt/cssom/selector_tree.h"
#include "cobalt/cssom/simple_selector.h"
#include "cobalt/cssom/specificity.h"

namespace cobalt {
namespace cssom {

class AfterPseudoElement;
class BeforePseudoElement;

// Pseudo-elements create abstractions about the document tree beyond those
// specified by the document language. For instance, document languages do not
// offer mechanisms to access the first letter or first line of an element's
// content. Pseudo-elements allow authors to refer to this otherwise
// inaccessible information. Pseudo-elements may also provide authors a way to
// refer to content that does not exist in the source document (e.g., the
// ::before and ::after pseudo-elements give access to generated content in
// CSS).
//   https://www.w3.org/TR/selectors4/#pseudo-elements
class PseudoElement : public SimpleSelector {
 public:
  explicit PseudoElement(base::Token text)
      : SimpleSelector(kPseudoElement,
                       base::Tokens::pseudo_element_selector_prefix(), text) {}
  ~PseudoElement() OVERRIDE {}

  // From Selector.
  Specificity GetSpecificity() const OVERRIDE { return Specificity(0, 0, 1); }

  // From SimpleSelector.
  PseudoElement* AsPseudoElement() OVERRIDE { return this; }
  void IndexSelectorTreeNode(SelectorTree::Node* /* parent_node */,
                             SelectorTree::Node* /* child_node */,
                             CombinatorType /* combinator */) OVERRIDE {}

  // Rest of public methods.
  virtual AfterPseudoElement* AsAfterPseudoElement() { return NULL; }
  virtual BeforePseudoElement* AsBeforePseudoElement() { return NULL; }
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_PSEUDO_ELEMENT_H_
