// Copyright 2014 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_SELECTOR_H_
#define COBALT_CSSOM_SELECTOR_H_

#include "base/memory/scoped_vector.h"
#include "cobalt/cssom/specificity.h"

namespace cobalt {
namespace cssom {

class ComplexSelector;
class CompoundSelector;
class SelectorVisitor;
class SimpleSelector;

// Selectors are patterns that match against elements in a tree, and as such
// form one of several technologies that can be used to select nodes in an XML
// document.
//   https://www.w3.org/TR/selectors4/
class Selector {
 public:
  virtual ~Selector() {}

  virtual void Accept(SelectorVisitor* visitor) = 0;

  virtual ComplexSelector* AsComplexSelector() { return NULL; }
  virtual CompoundSelector* AsCompoundSelector() { return NULL; }
  virtual SimpleSelector* AsSimpleSelector() { return NULL; }

  // A selector's specificity is calculated as follows:
  // Count the number of ID selectors in the selector (A)
  // Count the number of class selectors, attributes selectors, and
  // pseudo-classes in the selector (B)
  // Count the number of type selectors and pseudo-elements in the selector (C)
  //   https://www.w3.org/TR/selectors4/#specificity
  virtual Specificity GetSpecificity() const = 0;
};

typedef ScopedVector<Selector> Selectors;

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_SELECTOR_H_
