bool CSSParser::parseColor(RGBA32& color, const String& string, bool strict) { if (string.isEmpty()) return false; // The regular color parsers don't resolve all named colors, so explicitly // handle these first. Color namedColor; if (namedColor.setNamedColor(string)) { color = namedColor.rgb(); return true; } RefPtrWillBeRawPtr<CSSValue> value = CSSParserFastPaths::parseColor(string, !strict); // TODO(timloh): Why is this always strict mode? if (!value) value = parseSingleValue(CSSPropertyColor, string, strictCSSParserContext()); if (!value || !value->isPrimitiveValue()) return false; CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value.get()); if (!primitiveValue->isRGBColor()) return false; color = primitiveValue->getRGBA32Value(); return true; }
bool CSSParser::parseColor(RGBA32& color, const String& string, bool strict) { if (string.isEmpty()) return false; // First try creating a color specified by name, rgba(), rgb() or "#" syntax. if (CSSPropertyParser::fastParseColor(color, string, strict)) return true; // In case the fast-path parser didn't understand the color, try the full parser. RefPtrWillBeRawPtr<MutableStylePropertySet> stylePropertySet = MutableStylePropertySet::create(); // FIXME: The old CSS parser is only working in strict mode ignoring the strict parameter. // It needs to be investigated why. if (!parseValue(stylePropertySet.get(), CSSPropertyColor, string, false, strictCSSParserContext())) return false; RefPtrWillBeRawPtr<CSSValue> value = stylePropertySet->getPropertyCSSValue(CSSPropertyColor); if (!value || !value->isPrimitiveValue()) return false; CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value.get()); if (!primitiveValue->isRGBColor()) return false; color = primitiveValue->getRGBA32Value(); return true; }
Color StyleBuilderConverter::convertSVGColor(StyleResolverState& state, CSSValue* value) { CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value); if (primitiveValue->isRGBColor()) return primitiveValue->getRGBA32Value(); ASSERT(primitiveValue->getValueID() == CSSValueCurrentcolor); return state.style()->color(); }
// The color will only be changed when string contains a valid CSS color, so callers // can set it to a default color and ignore the boolean result. bool BisonCSSParser::parseColor(RGBA32& color, const String& string, bool strict) { // First try creating a color specified by name, rgba(), rgb() or "#" syntax. if (CSSPropertyParser::fastParseColor(color, string, strict)) return true; BisonCSSParser parser(strictCSSParserContext()); // In case the fast-path parser didn't understand the color, try the full parser. if (!parser.parseColor(string)) return false; CSSValue* value = parser.m_parsedProperties.first().value(); if (!value->isPrimitiveValue()) return false; CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value); if (!primitiveValue->isRGBColor()) return false; color = primitiveValue->getRGBA32Value(); return true; }
bool DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(const CSSPrimitiveValue& primitiveValue) { // FIXME: consider other types. if (primitiveValue.isNumber() || primitiveValue.isPercentage() || primitiveValue.isAngle() || primitiveValue.isRGBColor() || primitiveValue.isURI()) return false; if (primitiveValue.isLength()) return primitiveValue.isFontRelativeLength() || primitiveValue.isViewportPercentageLength(); if (primitiveValue.isCalculated()) { CSSLengthArray lengthArray(CSSPrimitiveValue::LengthUnitTypeCount); primitiveValue.accumulateLengthArray(lengthArray); return lengthArray[CSSPrimitiveValue::UnitTypeFontSize] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeFontXSize] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeZeroCharacterWidth] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportWidth] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportHeight] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportMin] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportMax] != 0; } if (Pair* pair = primitiveValue.getPairValue()) { return interpolationRequiresStyleResolve(*pair->first()) || interpolationRequiresStyleResolve(*pair->second()); } if (Rect* rect = primitiveValue.getRectValue()) { return interpolationRequiresStyleResolve(*rect->top()) || interpolationRequiresStyleResolve(*rect->right()) || interpolationRequiresStyleResolve(*rect->bottom()) || interpolationRequiresStyleResolve(*rect->left()); } if (Quad* quad = primitiveValue.getQuadValue()) { return interpolationRequiresStyleResolve(*quad->top()) || interpolationRequiresStyleResolve(*quad->right()) || interpolationRequiresStyleResolve(*quad->bottom()) || interpolationRequiresStyleResolve(*quad->left()); } if (primitiveValue.isShape()) return interpolationRequiresStyleResolve(*primitiveValue.getShapeValue()); return (primitiveValue.getValueID() != CSSValueNone); }
bool DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(const CSSPrimitiveValue& primitiveValue) { // FIXME: consider other types. if (primitiveValue.isNumber() || primitiveValue.isPercentage() || primitiveValue.isAngle() || primitiveValue.isRGBColor() || primitiveValue.isURI()) return false; if (primitiveValue.isLength()) return primitiveValue.isFontRelativeLength() || primitiveValue.isViewportPercentageLength(); if (primitiveValue.isCalculated()) { CSSLengthArray lengthArray(CSSPrimitiveValue::LengthUnitTypeCount); primitiveValue.accumulateLengthArray(lengthArray); return lengthArray[CSSPrimitiveValue::UnitTypeFontSize] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeFontXSize] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeRootFontSize] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeZeroCharacterWidth] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportWidth] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportHeight] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportMin] != 0 || lengthArray[CSSPrimitiveValue::UnitTypeViewportMax] != 0; } CSSValueID id = primitiveValue.getValueID(); bool isColor = ((id >= CSSValueAqua && id <= CSSValueTransparent) || (id >= CSSValueAliceblue && id <= CSSValueYellowgreen) || id == CSSValueGrey); return (id != CSSValueNone) && !isColor; }