// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CSSParser_h
#define CSSParser_h

#include <memory>
#include "core/CSSPropertyNames.h"
#include "core/CoreExport.h"
#include "core/css/StylePropertySet.h"
#include "core/css/parser/CSSParserContext.h"

namespace blink {

class Color;
class CSSParserObserver;
class CSSParserTokenRange;
class CSSSelectorList;
class Element;
class ImmutableStylePropertySet;
class StyleRuleBase;
class StyleRuleKeyframe;
class StyleSheetContents;
class CSSValue;

// This class serves as the public API for the css/parser subsystem
class CORE_EXPORT CSSParser {
  STATIC_ONLY(CSSParser);

 public:
  // As well as regular rules, allows @import and @namespace but not @charset
  static StyleRuleBase* ParseRule(const CSSParserContext*,
                                  StyleSheetContents*,
                                  const String&);
  static void ParseSheet(const CSSParserContext*,
                         StyleSheetContents*,
                         const String&,
                         bool defer_property_parsing = false);
  static CSSSelectorList ParseSelector(const CSSParserContext*,
                                       StyleSheetContents*,
                                       const String&);
  static CSSSelectorList ParsePageSelector(const CSSParserContext&,
                                           StyleSheetContents*,
                                           const String&);
  static bool ParseDeclarationList(const CSSParserContext*,
                                   MutableStylePropertySet*,
                                   const String&);

  static MutableStylePropertySet::SetResult ParseValue(
      MutableStylePropertySet*,
      CSSPropertyID unresolved_property,
      const String&,
      bool important);
  static MutableStylePropertySet::SetResult ParseValue(
      MutableStylePropertySet*,
      CSSPropertyID unresolved_property,
      const String&,
      bool important,
      StyleSheetContents*);

  static MutableStylePropertySet::SetResult ParseValueForCustomProperty(
      MutableStylePropertySet*,
      const AtomicString& property_name,
      const PropertyRegistry*,
      const String& value,
      bool important,
      StyleSheetContents*,
      bool is_animation_tainted);
  static ImmutableStylePropertySet* ParseCustomPropertySet(CSSParserTokenRange);

  // This is for non-shorthands only
  static const CSSValue* ParseSingleValue(
      CSSPropertyID,
      const String&,
      const CSSParserContext* = StrictCSSParserContext());

  static const CSSValue* ParseFontFaceDescriptor(CSSPropertyID,
                                                 const String&,
                                                 const CSSParserContext*);

  static ImmutableStylePropertySet* ParseInlineStyleDeclaration(const String&,
                                                                Element*);

  static std::unique_ptr<Vector<double>> ParseKeyframeKeyList(const String&);
  static StyleRuleKeyframe* ParseKeyframeRule(const CSSParserContext*,
                                              const String&);

  static bool ParseSupportsCondition(const String&);

  // The color will only be changed when string contains a valid CSS color, so
  // callers can set it to a default color and ignore the boolean result.
  static bool ParseColor(Color&, const String&, bool strict = false);
  static bool ParseSystemColor(Color&, const String&);

  static void ParseSheetForInspector(const CSSParserContext*,
                                     StyleSheetContents*,
                                     const String&,
                                     CSSParserObserver&);
  static void ParseDeclarationListForInspector(const CSSParserContext*,
                                               const String&,
                                               CSSParserObserver&);

 private:
  static MutableStylePropertySet::SetResult ParseValue(
      MutableStylePropertySet*,
      CSSPropertyID unresolved_property,
      const String&,
      bool important,
      const CSSParserContext*);
};

}  // namespace blink

#endif  // CSSParser_h
