// 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_CSS_PARSER_H_
#define COBALT_CSSOM_CSS_PARSER_H_

#include <string>

#include "base/memory/ref_counted.h"
#include "cobalt/base/source_location.h"

namespace cobalt {
namespace cssom {

class CSSDeclarationData;
class CSSFontFaceDeclarationData;
class CSSRule;
class CSSDeclaredStyleData;
class CSSStyleSheet;
class MediaList;
class MediaQuery;
class PropertyValue;

// An abstraction of CSS parser. The parser turns a string in UTF-8 encoding
// into one of CSSOM objects. Created CSSOM objects should be self-contained
// and should not depend on the input, so the arguments can be safely destroyed
// after one of the Parse...() methods returns. Similarly to Chromium, parser
// should always succeed. Errors, if any, should be reported to logs.
//
// This class is not a part of any specification.
class CSSParser {
 public:
  //
  // Parser entry points
  // (see http://dev.w3.org/csswg/css-syntax/#parser-entry-points):
  //

  // TODO: Revisit the return values of below methods in case of an error and
  //       match the behavior with appropriate specifications. Currently some
  //       methods return a default-constructed value even if an error occurred,
  //       others return NULL, and some call sites are known to make incorrect
  //       assumptions.

  // Parses the entire stylesheet.
  // Always returns non-NULL style sheet, even if an error occurred.
  virtual scoped_refptr<CSSStyleSheet> ParseStyleSheet(
      const std::string& input, const base::SourceLocation& input_location) = 0;

  // Parses the style rule.
  // Returns NULL if an error occurred.
  virtual scoped_refptr<CSSRule> ParseRule(
      const std::string& input, const base::SourceLocation& input_location) = 0;

  // Parses the contents of a HTMLElement.style attribute.
  // Always returns non-NULL declaration, even if an error occurred.
  virtual scoped_refptr<CSSDeclaredStyleData> ParseStyleDeclarationList(
      const std::string& input, const base::SourceLocation& input_location) = 0;

  // Parses the contents of an @font-face rule.
  // Always returns non-NULL declaration, even if an error occurred.
  virtual scoped_refptr<CSSFontFaceDeclarationData>
  ParseFontFaceDeclarationList(const std::string& input,
                               const base::SourceLocation& input_location) = 0;

  // Parses the property value.
  // |property_name| must be a valid CSS property name (see property_names.h).
  // May return NULL which is considered a valid property value.
  // This method is primarily for use by tests, since it is not able to
  // handle parsing of shorthand properties.
  virtual scoped_refptr<PropertyValue> ParsePropertyValue(
      const std::string& property_name, const std::string& property_value,
      const base::SourceLocation& property_location) = 0;

  // Parses the specified property value assuming it is to be used for a
  // property with property_name.  The style_declaration parameter will have
  // its specified property set to the resulting parsed value.
  // This is Cobalt's equivalent of a "list of component values".
  virtual void ParsePropertyIntoDeclarationData(
      const std::string& property_name, const std::string& property_value,
      const base::SourceLocation& property_location,
      CSSDeclarationData* declaration_data) = 0;

  // Parses the media list.
  // Always returns non-NULL media list, even if an error occurred.
  virtual scoped_refptr<MediaList> ParseMediaList(
      const std::string& media_list,
      const base::SourceLocation& input_location) = 0;

  // Parses the media query.
  // Always returns non-NULL media query, even if an error occurred.
  virtual scoped_refptr<MediaQuery> ParseMediaQuery(
      const std::string& media_query,
      const base::SourceLocation& input_location) = 0;

 protected:
  virtual ~CSSParser() {}
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_CSS_PARSER_H_
