blob: 1ff911d2b767d243d96c9b8136fa662f0c5bc2dc [file] [log] [blame]
// Copyright 2017 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 CSSParsingUtils_h
#define CSSParsingUtils_h
#include "core/CSSValueKeywords.h"
#include "core/css/parser/CSSParserMode.h"
#include "core/css/parser/CSSParserTokenRange.h"
#include "core/css/parser/CSSPropertyParserHelpers.h"
#include "core/style/GridArea.h"
namespace blink {
namespace cssvalue {
class CSSFontFeatureValue;
} // namespace cssvalue
class CSSIdentifierValue;
class CSSParserContext;
class CSSParserLocalContext;
class CSSShadowValue;
class CSSValue;
class CSSValueList;
class StylePropertyShorthand;
namespace CSSParsingUtils {
enum class AllowInsetAndSpread { kAllow, kForbid };
enum class AllowTextValue { kAllow, kForbid };
enum class DefaultFill { kFill, kNoFill };
enum class ParsingStyle { kLegacy, kNotLegacy };
enum class TrackListType { kGridTemplate, kGridTemplateNoRepeat, kGridAuto };
using ConsumeAnimationItemValue = CSSValue* (*)(CSSPropertyID,
CSSParserTokenRange&,
const CSSParserContext&,
bool use_legacy_parsing);
using IsPositionKeyword = bool (*)(CSSValueID);
using ConsumePlaceAlignmentValue = CSSValue* (*)(CSSParserTokenRange&,
IsPositionKeyword);
constexpr size_t kMaxNumAnimationLonghands = 8;
bool IsSelfPositionKeyword(CSSValueID);
bool IsSelfPositionOrLeftOrRightKeyword(CSSValueID);
bool IsContentPositionKeyword(CSSValueID);
bool IsContentPositionOrLeftOrRightKeyword(CSSValueID);
CSSValue* ConsumeSelfPositionOverflowPosition(CSSParserTokenRange&,
IsPositionKeyword);
CSSValue* ConsumeSimplifiedItemPosition(CSSParserTokenRange&,
IsPositionKeyword);
CSSValue* ConsumeContentDistributionOverflowPosition(CSSParserTokenRange&,
IsPositionKeyword);
CSSValue* ConsumeSimplifiedContentPosition(CSSParserTokenRange&,
IsPositionKeyword);
CSSValue* ConsumeAnimationIterationCount(CSSParserTokenRange&);
CSSValue* ConsumeAnimationName(CSSParserTokenRange&,
const CSSParserContext&,
bool allow_quoted_name);
CSSValue* ConsumeAnimationTimingFunction(CSSParserTokenRange&);
bool ConsumeAnimationShorthand(
const StylePropertyShorthand&,
HeapVector<Member<CSSValueList>, kMaxNumAnimationLonghands>&,
ConsumeAnimationItemValue,
CSSParserTokenRange&,
const CSSParserContext&,
bool use_legacy_parsing);
void AddBackgroundValue(CSSValue*& list, CSSValue*);
CSSValue* ConsumeBackgroundAttachment(CSSParserTokenRange&);
CSSValue* ConsumeBackgroundBlendMode(CSSParserTokenRange&);
CSSValue* ConsumeBackgroundBox(CSSParserTokenRange&);
CSSValue* ConsumeBackgroundComposite(CSSParserTokenRange&);
CSSValue* ConsumeMaskSourceType(CSSParserTokenRange&);
CSSValue* ConsumeBackgroundSize(CSSParserTokenRange&,
CSSParserMode,
ParsingStyle);
bool ConsumeBackgroundPosition(CSSParserTokenRange&,
const CSSParserContext&,
CSSPropertyParserHelpers::UnitlessQuirk,
CSSValue*& result_x,
CSSValue*& result_y);
CSSValue* ConsumePrefixedBackgroundBox(CSSParserTokenRange&, AllowTextValue);
CSSValue* ParseBackgroundBox(CSSParserTokenRange&,
const CSSParserLocalContext&);
CSSValue* ParseBackgroundOrMaskSize(CSSParserTokenRange&,
const CSSParserContext&,
const CSSParserLocalContext&);
bool ParseBackgroundOrMask(bool,
CSSParserTokenRange&,
const CSSParserContext&,
const CSSParserLocalContext&,
HeapVector<CSSPropertyValue, 256>&);
bool ConsumeRepeatStyleComponent(CSSParserTokenRange&,
CSSValue*& value1,
CSSValue*& value2,
bool& implicit);
bool ConsumeRepeatStyle(CSSParserTokenRange&,
CSSValue*& result_x,
CSSValue*& result_y,
bool& implicit);
CSSValue* ConsumeWebkitBorderImage(CSSParserTokenRange&,
const CSSParserContext&);
bool ConsumeBorderImageComponents(CSSParserTokenRange&,
const CSSParserContext&,
CSSValue*& source,
CSSValue*& slice,
CSSValue*& width,
CSSValue*& outset,
CSSValue*& repeat,
DefaultFill);
CSSValue* ConsumeBorderImageRepeat(CSSParserTokenRange&);
CSSValue* ConsumeBorderImageSlice(CSSParserTokenRange&, DefaultFill);
CSSValue* ConsumeBorderImageWidth(CSSParserTokenRange&);
CSSValue* ConsumeBorderImageOutset(CSSParserTokenRange&);
CSSValue* ParseBorderRadiusCorner(CSSParserTokenRange&,
const CSSParserContext&);
CSSValue* ParseBorderWidthSide(CSSParserTokenRange&,
const CSSParserContext&,
const CSSParserLocalContext&);
CSSValue* ConsumeShadow(CSSParserTokenRange&,
CSSParserMode,
AllowInsetAndSpread);
CSSShadowValue* ParseSingleShadow(CSSParserTokenRange&,
CSSParserMode,
AllowInsetAndSpread);
CSSValue* ConsumeColumnCount(CSSParserTokenRange&);
CSSValue* ConsumeColumnWidth(CSSParserTokenRange&);
bool ConsumeColumnWidthOrCount(CSSParserTokenRange&, CSSValue*&, CSSValue*&);
CSSValue* ConsumeGapLength(CSSParserTokenRange&, const CSSParserContext&);
CSSValue* ConsumeCounter(CSSParserTokenRange&, int);
CSSValue* ConsumeFontSize(CSSParserTokenRange&,
CSSParserMode,
CSSPropertyParserHelpers::UnitlessQuirk =
CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
CSSValue* ConsumeLineHeight(CSSParserTokenRange&, CSSParserMode);
CSSValueList* ConsumeFontFamily(CSSParserTokenRange&);
CSSValue* ConsumeGenericFamily(CSSParserTokenRange&);
CSSValue* ConsumeFamilyName(CSSParserTokenRange&);
String ConcatenateFamilyName(CSSParserTokenRange&);
CSSIdentifierValue* ConsumeFontStretchKeywordOnly(CSSParserTokenRange&);
CSSValue* ConsumeFontStretch(CSSParserTokenRange&, const CSSParserMode&);
CSSValue* ConsumeFontStyle(CSSParserTokenRange&, const CSSParserMode&);
CSSValue* ConsumeFontWeight(CSSParserTokenRange&, const CSSParserMode&);
CSSValue* ConsumeFontFeatureSettings(CSSParserTokenRange&);
cssvalue::CSSFontFeatureValue* ConsumeFontFeatureTag(CSSParserTokenRange&);
CSSIdentifierValue* ConsumeFontVariantCSS21(CSSParserTokenRange&);
CSSValue* ConsumeGridLine(CSSParserTokenRange&);
CSSValue* ConsumeGridTrackList(CSSParserTokenRange&,
CSSParserMode,
TrackListType);
bool ParseGridTemplateAreasRow(const WTF::String& grid_row_names,
NamedGridAreaMap&,
const size_t row_count,
size_t& column_count);
CSSValue* ConsumeGridTemplatesRowsOrColumns(CSSParserTokenRange&,
CSSParserMode);
bool ConsumeGridItemPositionShorthand(bool important,
CSSParserTokenRange&,
CSSValue*& start_value,
CSSValue*& end_value);
bool ConsumeGridTemplateShorthand(bool important,
CSSParserTokenRange&,
const CSSParserContext&,
CSSValue*& template_rows,
CSSValue*& template_columns,
CSSValue*& template_areas);
// The fragmentation spec says that page-break-(after|before|inside) are to be
// treated as shorthands for their break-(after|before|inside) counterparts.
// We'll do the same for the non-standard properties
// -webkit-column-break-(after|before|inside).
bool ConsumeFromPageBreakBetween(CSSParserTokenRange&, CSSValueID&);
bool ConsumeFromColumnBreakBetween(CSSParserTokenRange&, CSSValueID&);
bool ConsumeFromColumnOrPageBreakInside(CSSParserTokenRange&, CSSValueID&);
CSSValue* ConsumeMaxWidthOrHeight(
CSSParserTokenRange&,
const CSSParserContext&,
CSSPropertyParserHelpers::UnitlessQuirk =
CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
CSSValue* ConsumeWidthOrHeight(
CSSParserTokenRange&,
const CSSParserContext&,
CSSPropertyParserHelpers::UnitlessQuirk =
CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
CSSValue* ConsumeMarginOrOffset(CSSParserTokenRange&,
CSSParserMode,
CSSPropertyParserHelpers::UnitlessQuirk);
CSSValue* ConsumeOffsetPath(CSSParserTokenRange&, const CSSParserContext&);
CSSValue* ConsumePathOrNone(CSSParserTokenRange&);
CSSValue* ConsumeOffsetRotate(CSSParserTokenRange&, const CSSParserContext&);
bool ConsumePlaceAlignment(CSSParserTokenRange&,
ConsumePlaceAlignmentValue,
CSSValue*& align_value,
CSSValue*& justify_value);
CSSValue* ConsumeBasicShape(CSSParserTokenRange&, const CSSParserContext&);
bool ConsumeRadii(CSSValue* horizontal_radii[4],
CSSValue* vertical_radii[4],
CSSParserTokenRange&,
CSSParserMode,
bool use_legacy_parsing);
CSSValue* ConsumeTextDecorationLine(CSSParserTokenRange&);
CSSValue* ConsumeTransformList(CSSParserTokenRange&,
const CSSParserContext&,
const CSSParserLocalContext&);
CSSValue* ConsumeTransitionProperty(CSSParserTokenRange&);
bool IsValidPropertyList(const CSSValueList&);
CSSValue* ConsumeBorderColorSide(CSSParserTokenRange&,
const CSSParserContext&,
const CSSParserLocalContext&);
CSSValue* ConsumeBorderWidth(CSSParserTokenRange&,
CSSParserMode,
CSSPropertyParserHelpers::UnitlessQuirk);
CSSValue* ParsePaintStroke(CSSParserTokenRange&, const CSSParserContext&);
CSSValue* ParseSpacing(CSSParserTokenRange&, const CSSParserContext&);
template <CSSValueID start, CSSValueID end>
CSSValue* ConsumePositionLonghand(CSSParserTokenRange& range,
CSSParserMode css_parser_mode) {
if (range.Peek().GetType() == kIdentToken) {
CSSValueID id = range.Peek().Id();
int percent;
if (id == start)
percent = 0;
else if (id == CSSValueCenter)
percent = 50;
else if (id == end)
percent = 100;
else
return nullptr;
range.ConsumeIncludingWhitespace();
return CSSPrimitiveValue::Create(percent,
CSSPrimitiveValue::UnitType::kPercentage);
}
return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
range, css_parser_mode, kValueRangeAll);
}
} // namespace CSSParsingUtils
} // namespace blink
#endif // CSSParsingUtils_h