Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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;
  }
}