/*
 * 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_
