CSSValue* CSSParserFastPaths::parseColor(const String& string, CSSParserMode parserMode) { ASSERT(!string.isEmpty()); CSSValueID valueID = cssValueKeywordID(string); if (StyleColor::isColorKeyword(valueID)) { if (!isValueAllowedInMode(valueID, parserMode)) return nullptr; return CSSIdentifierValue::create(valueID); } RGBA32 color; bool quirksMode = isQuirksModeBehavior(parserMode); // Fast path for hex colors and rgb()/rgba() colors bool parseResult; if (string.is8Bit()) parseResult = fastParseColorInternal(color, string.characters8(), string.length(), quirksMode); else parseResult = fastParseColorInternal(color, string.characters16(), string.length(), quirksMode); if (!parseResult) return nullptr; return CSSColorValue::create(color); }
CSSValue* consumeColor(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool acceptQuirkyColors) { CSSValueID id = range.peek().id(); if (CSSPropertyParser::isColorKeyword(id)) { if (!isValueAllowedInMode(id, cssParserMode)) return nullptr; return consumeIdent(range); } RGBA32 color = Color::transparent; if (!parseHexColor(range, color, acceptQuirkyColors) && !parseColorFunction(range, color)) return nullptr; return cssValuePool().createColorValue(color); }
bool CSSParserFastPaths::isValidKeywordPropertyAndValue( CSSPropertyID propertyId, CSSValueID valueID, CSSParserMode parserMode) { if (valueID == CSSValueInvalid || !isValueAllowedInMode(valueID, parserMode)) return false; // For range checks, enum ordering is defined by CSSValueKeywords.in. switch (propertyId) { case CSSPropertyAlignmentBaseline: return valueID == CSSValueAuto || valueID == CSSValueAlphabetic || valueID == CSSValueBaseline || valueID == CSSValueMiddle || (valueID >= CSSValueBeforeEdge && valueID <= CSSValueMathematical); case CSSPropertyAll: return false; // Only accepts css-wide keywords case CSSPropertyBackgroundRepeatX: case CSSPropertyBackgroundRepeatY: return valueID == CSSValueRepeat || valueID == CSSValueNoRepeat; case CSSPropertyBorderCollapse: return valueID == CSSValueCollapse || valueID == CSSValueSeparate; case CSSPropertyBorderTopStyle: case CSSPropertyBorderRightStyle: case CSSPropertyBorderBottomStyle: case CSSPropertyBorderLeftStyle: case CSSPropertyWebkitBorderAfterStyle: case CSSPropertyWebkitBorderBeforeStyle: case CSSPropertyWebkitBorderEndStyle: case CSSPropertyWebkitBorderStartStyle: case CSSPropertyColumnRuleStyle: return valueID >= CSSValueNone && valueID <= CSSValueDouble; case CSSPropertyBoxSizing: return valueID == CSSValueBorderBox || valueID == CSSValueContentBox; case CSSPropertyBufferedRendering: return valueID == CSSValueAuto || valueID == CSSValueDynamic || valueID == CSSValueStatic; case CSSPropertyCaptionSide: return valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueTop || valueID == CSSValueBottom; case CSSPropertyClear: return valueID == CSSValueNone || valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueBoth; case CSSPropertyClipRule: case CSSPropertyFillRule: return valueID == CSSValueNonzero || valueID == CSSValueEvenodd; case CSSPropertyColorInterpolation: case CSSPropertyColorInterpolationFilters: return valueID == CSSValueAuto || valueID == CSSValueSRGB || valueID == CSSValueLinearRGB; case CSSPropertyColorRendering: return valueID == CSSValueAuto || valueID == CSSValueOptimizeSpeed || valueID == CSSValueOptimizeQuality; case CSSPropertyDirection: return valueID == CSSValueLtr || valueID == CSSValueRtl; case CSSPropertyDisplay: return (valueID >= CSSValueInline && valueID <= CSSValueInlineFlex) || valueID == CSSValueWebkitFlex || valueID == CSSValueWebkitInlineFlex || valueID == CSSValueNone || (RuntimeEnabledFeatures::cssGridLayoutEnabled() && (valueID == CSSValueGrid || valueID == CSSValueInlineGrid)) || (RuntimeEnabledFeatures::cssDisplayContentsEnabled() && valueID == CSSValueContents); case CSSPropertyDominantBaseline: return valueID == CSSValueAuto || valueID == CSSValueAlphabetic || valueID == CSSValueMiddle || (valueID >= CSSValueUseScript && valueID <= CSSValueResetSize) || (valueID >= CSSValueCentral && valueID <= CSSValueMathematical); case CSSPropertyEmptyCells: return valueID == CSSValueShow || valueID == CSSValueHide; case CSSPropertyFloat: return valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueNone; case CSSPropertyFontStyle: return valueID == CSSValueNormal || valueID == CSSValueItalic || valueID == CSSValueOblique; case CSSPropertyFontStretch: return valueID == CSSValueNormal || (valueID >= CSSValueUltraCondensed && valueID <= CSSValueUltraExpanded); case CSSPropertyImageRendering: return valueID == CSSValueAuto || valueID == CSSValueWebkitOptimizeContrast || valueID == CSSValuePixelated; case CSSPropertyIsolation: return valueID == CSSValueAuto || valueID == CSSValueIsolate; case CSSPropertyListStylePosition: return valueID == CSSValueInside || valueID == CSSValueOutside; case CSSPropertyListStyleType: return (valueID >= CSSValueDisc && valueID <= CSSValueKatakanaIroha) || valueID == CSSValueNone; case CSSPropertyMaskType: return valueID == CSSValueLuminance || valueID == CSSValueAlpha; case CSSPropertyObjectFit: return valueID == CSSValueFill || valueID == CSSValueContain || valueID == CSSValueCover || valueID == CSSValueNone || valueID == CSSValueScaleDown; case CSSPropertyOutlineStyle: return valueID == CSSValueAuto || valueID == CSSValueNone || (valueID >= CSSValueInset && valueID <= CSSValueDouble); case CSSPropertyOverflowAnchor: return valueID == CSSValueVisible || valueID == CSSValueNone || valueID == CSSValueAuto; case CSSPropertyOverflowWrap: case CSSPropertyWordWrap: return valueID == CSSValueNormal || valueID == CSSValueBreakWord; case CSSPropertyOverflowX: return valueID == CSSValueVisible || valueID == CSSValueHidden || valueID == CSSValueScroll || valueID == CSSValueAuto || valueID == CSSValueOverlay; case CSSPropertyOverflowY: return valueID == CSSValueVisible || valueID == CSSValueHidden || valueID == CSSValueScroll || valueID == CSSValueAuto || valueID == CSSValueOverlay || valueID == CSSValueWebkitPagedX || valueID == CSSValueWebkitPagedY; case CSSPropertyBreakAfter: case CSSPropertyBreakBefore: return valueID == CSSValueAuto || valueID == CSSValueAvoid || valueID == CSSValueAvoidPage || valueID == CSSValuePage || valueID == CSSValueLeft || valueID == CSSValueRight || valueID == CSSValueRecto || valueID == CSSValueVerso || valueID == CSSValueAvoidColumn || valueID == CSSValueColumn; case CSSPropertyBreakInside: return valueID == CSSValueAuto || valueID == CSSValueAvoid || valueID == CSSValueAvoidPage || valueID == CSSValueAvoidColumn; case CSSPropertyPointerEvents: return valueID == CSSValueVisible || valueID == CSSValueNone || valueID == CSSValueAll || valueID == CSSValueAuto || (valueID >= CSSValueVisiblePainted && valueID <= CSSValueBoundingBox); case CSSPropertyPosition: return valueID == CSSValueStatic || valueID == CSSValueRelative || valueID == CSSValueAbsolute || valueID == CSSValueFixed || (RuntimeEnabledFeatures::cssStickyPositionEnabled() && valueID == CSSValueSticky); case CSSPropertyResize: return valueID == CSSValueNone || valueID == CSSValueBoth || valueID == CSSValueHorizontal || valueID == CSSValueVertical || valueID == CSSValueAuto; case CSSPropertyScrollBehavior: ASSERT(RuntimeEnabledFeatures::cssomSmoothScrollEnabled()); return valueID == CSSValueAuto || valueID == CSSValueSmooth; case CSSPropertyShapeRendering: return valueID == CSSValueAuto || valueID == CSSValueOptimizeSpeed || valueID == CSSValueCrispEdges || valueID == CSSValueGeometricPrecision; case CSSPropertySpeak: return valueID == CSSValueNone || valueID == CSSValueNormal || valueID == CSSValueSpellOut || valueID == CSSValueDigits || valueID == CSSValueLiteralPunctuation || valueID == CSSValueNoPunctuation; case CSSPropertyStrokeLinejoin: return valueID == CSSValueMiter || valueID == CSSValueRound || valueID == CSSValueBevel; case CSSPropertyStrokeLinecap: return valueID == CSSValueButt || valueID == CSSValueRound || valueID == CSSValueSquare; case CSSPropertyTableLayout: return valueID == CSSValueAuto || valueID == CSSValueFixed; case CSSPropertyTextAlign: return (valueID >= CSSValueWebkitAuto && valueID <= CSSValueInternalCenter) || valueID == CSSValueStart || valueID == CSSValueEnd; case CSSPropertyTextAlignLast: return (valueID >= CSSValueLeft && valueID <= CSSValueJustify) || valueID == CSSValueStart || valueID == CSSValueEnd || valueID == CSSValueAuto; case CSSPropertyTextAnchor: return valueID == CSSValueStart || valueID == CSSValueMiddle || valueID == CSSValueEnd; case CSSPropertyTextCombineUpright: return valueID == CSSValueNone || valueID == CSSValueAll; case CSSPropertyTextDecorationStyle: ASSERT(RuntimeEnabledFeatures::css3TextDecorationsEnabled()); return valueID == CSSValueSolid || valueID == CSSValueDouble || valueID == CSSValueDotted || valueID == CSSValueDashed || valueID == CSSValueWavy; case CSSPropertyTextJustify: ASSERT(RuntimeEnabledFeatures::css3TextEnabled()); return valueID == CSSValueInterWord || valueID == CSSValueDistribute || valueID == CSSValueAuto || valueID == CSSValueNone; case CSSPropertyTextOrientation: return valueID == CSSValueMixed || valueID == CSSValueUpright || valueID == CSSValueSideways || valueID == CSSValueSidewaysRight; case CSSPropertyWebkitTextOrientation: return valueID == CSSValueSideways || valueID == CSSValueSidewaysRight || valueID == CSSValueVerticalRight || valueID == CSSValueUpright; case CSSPropertyTextOverflow: return valueID == CSSValueClip || valueID == CSSValueEllipsis; case CSSPropertyTextRendering: return valueID == CSSValueAuto || valueID == CSSValueOptimizeSpeed || valueID == CSSValueOptimizeLegibility || valueID == CSSValueGeometricPrecision; case CSSPropertyTextTransform: // capitalize | uppercase | lowercase | none return (valueID >= CSSValueCapitalize && valueID <= CSSValueLowercase) || valueID == CSSValueNone; case CSSPropertyUnicodeBidi: return valueID == CSSValueNormal || valueID == CSSValueEmbed || valueID == CSSValueBidiOverride || valueID == CSSValueWebkitIsolate || valueID == CSSValueWebkitIsolateOverride || valueID == CSSValueWebkitPlaintext || valueID == CSSValueIsolate || valueID == CSSValueIsolateOverride || valueID == CSSValuePlaintext; case CSSPropertyVectorEffect: return valueID == CSSValueNone || valueID == CSSValueNonScalingStroke; case CSSPropertyVisibility: return valueID == CSSValueVisible || valueID == CSSValueHidden || valueID == CSSValueCollapse; case CSSPropertyWebkitAppRegion: return valueID >= CSSValueDrag && valueID <= CSSValueNoDrag; case CSSPropertyWebkitAppearance: return (valueID >= CSSValueCheckbox && valueID <= CSSValueTextarea) || valueID == CSSValueNone; case CSSPropertyBackfaceVisibility: return valueID == CSSValueVisible || valueID == CSSValueHidden; case CSSPropertyMixBlendMode: return valueID == CSSValueNormal || valueID == CSSValueMultiply || valueID == CSSValueScreen || valueID == CSSValueOverlay || valueID == CSSValueDarken || valueID == CSSValueLighten || valueID == CSSValueColorDodge || valueID == CSSValueColorBurn || valueID == CSSValueHardLight || valueID == CSSValueSoftLight || valueID == CSSValueDifference || valueID == CSSValueExclusion || valueID == CSSValueHue || valueID == CSSValueSaturation || valueID == CSSValueColor || valueID == CSSValueLuminosity; case CSSPropertyWebkitBoxAlign: return valueID == CSSValueStretch || valueID == CSSValueStart || valueID == CSSValueEnd || valueID == CSSValueCenter || valueID == CSSValueBaseline; case CSSPropertyWebkitBoxDecorationBreak: return valueID == CSSValueClone || valueID == CSSValueSlice; case CSSPropertyWebkitBoxDirection: return valueID == CSSValueNormal || valueID == CSSValueReverse; case CSSPropertyWebkitBoxLines: return valueID == CSSValueSingle || valueID == CSSValueMultiple; case CSSPropertyWebkitBoxOrient: return valueID == CSSValueHorizontal || valueID == CSSValueVertical || valueID == CSSValueInlineAxis || valueID == CSSValueBlockAxis; case CSSPropertyWebkitBoxPack: return valueID == CSSValueStart || valueID == CSSValueEnd || valueID == CSSValueCenter || valueID == CSSValueJustify; case CSSPropertyColumnFill: return valueID == CSSValueAuto || valueID == CSSValueBalance; case CSSPropertyAlignContent: // FIXME: Per CSS alignment, this property should accept an optional // <overflow-position>. We should share this parsing code with // 'justify-self'. return valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueSpaceBetween || valueID == CSSValueSpaceAround || valueID == CSSValueStretch; case CSSPropertyAlignItems: // FIXME: Per CSS alignment, this property should accept the same // arguments as 'justify-self' so we should share its parsing code. return valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueBaseline || valueID == CSSValueStretch; case CSSPropertyAlignSelf: // FIXME: Per CSS alignment, this property should accept the same // arguments as 'justify-self' so we should share its parsing code. return valueID == CSSValueAuto || valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueBaseline || valueID == CSSValueStretch; case CSSPropertyFlexDirection: return valueID == CSSValueRow || valueID == CSSValueRowReverse || valueID == CSSValueColumn || valueID == CSSValueColumnReverse; case CSSPropertyFlexWrap: return valueID == CSSValueNowrap || valueID == CSSValueWrap || valueID == CSSValueWrapReverse; case CSSPropertyHyphens: #if OS(ANDROID) || OS(MACOSX) return valueID == CSSValueAuto || valueID == CSSValueNone || valueID == CSSValueManual; #else return valueID == CSSValueNone || valueID == CSSValueManual; #endif case CSSPropertyJustifyContent: // FIXME: Per CSS alignment, this property should accept an optional // <overflow-position>. We should share this parsing code with // 'justify-self'. return valueID == CSSValueFlexStart || valueID == CSSValueFlexEnd || valueID == CSSValueCenter || valueID == CSSValueSpaceBetween || valueID == CSSValueSpaceAround; case CSSPropertyFontKerning: return valueID == CSSValueAuto || valueID == CSSValueNormal || valueID == CSSValueNone; case CSSPropertyWebkitFontSmoothing: return valueID == CSSValueAuto || valueID == CSSValueNone || valueID == CSSValueAntialiased || valueID == CSSValueSubpixelAntialiased; case CSSPropertyWebkitLineBreak: return valueID == CSSValueAuto || valueID == CSSValueLoose || valueID == CSSValueNormal || valueID == CSSValueStrict || valueID == CSSValueAfterWhiteSpace; case CSSPropertyWebkitMarginAfterCollapse: case CSSPropertyWebkitMarginBeforeCollapse: case CSSPropertyWebkitMarginBottomCollapse: case CSSPropertyWebkitMarginTopCollapse: return valueID == CSSValueCollapse || valueID == CSSValueSeparate || valueID == CSSValueDiscard; case CSSPropertyWebkitPrintColorAdjust: return valueID == CSSValueExact || valueID == CSSValueEconomy; case CSSPropertyWebkitRtlOrdering: return valueID == CSSValueLogical || valueID == CSSValueVisual; case CSSPropertyWebkitRubyPosition: return valueID == CSSValueBefore || valueID == CSSValueAfter; case CSSPropertyWebkitTextCombine: return valueID == CSSValueNone || valueID == CSSValueHorizontal; case CSSPropertyWebkitTextEmphasisPosition: return valueID == CSSValueOver || valueID == CSSValueUnder; case CSSPropertyWebkitTextSecurity: return valueID == CSSValueDisc || valueID == CSSValueCircle || valueID == CSSValueSquare || valueID == CSSValueNone; case CSSPropertyTransformStyle: return valueID == CSSValueFlat || valueID == CSSValuePreserve3d; case CSSPropertyWebkitUserDrag: return valueID == CSSValueAuto || valueID == CSSValueNone || valueID == CSSValueElement; case CSSPropertyWebkitUserModify: return valueID == CSSValueReadOnly || valueID == CSSValueReadWrite || valueID == CSSValueReadWritePlaintextOnly; case CSSPropertyUserSelect: return valueID == CSSValueAuto || valueID == CSSValueNone || valueID == CSSValueText || valueID == CSSValueAll; case CSSPropertyWebkitWritingMode: return valueID >= CSSValueHorizontalTb && valueID <= CSSValueVerticalLr; case CSSPropertyWritingMode: return valueID == CSSValueHorizontalTb || valueID == CSSValueVerticalRl || valueID == CSSValueVerticalLr || valueID == CSSValueLrTb || valueID == CSSValueRlTb || valueID == CSSValueTbRl || valueID == CSSValueLr || valueID == CSSValueRl || valueID == CSSValueTb; case CSSPropertyWhiteSpace: return valueID == CSSValueNormal || valueID == CSSValuePre || valueID == CSSValuePreWrap || valueID == CSSValuePreLine || valueID == CSSValueNowrap; case CSSPropertyWordBreak: return valueID == CSSValueNormal || valueID == CSSValueBreakAll || valueID == CSSValueKeepAll || valueID == CSSValueBreakWord; case CSSPropertyScrollSnapType: ASSERT(RuntimeEnabledFeatures::cssScrollSnapPointsEnabled()); return valueID == CSSValueNone || valueID == CSSValueMandatory || valueID == CSSValueProximity; default: ASSERT_NOT_REACHED(); return false; } }