PassRefPtr<CSSValue> CSSParser::parseSVGColor() { RGBA32 c = Color::transparent; if (!parseColorFromValue(m_valueList->current(), c)) return 0; return SVGColor::createFromColor(Color(c)); }
RefPtr<SVGColor> CSSParser::parseSVGColor() { Color color = parseColorFromValue(*m_valueList->current()); if (!color.isValid()) return nullptr; return SVGColor::createFromColor(color); }
RefPtr<CSSValue> CSSParser::parseSVGPaint() { RGBA32 c = Color::transparent; if (!parseColorFromValue(*m_valueList->current(), c)) return SVGPaint::createUnknown(); return SVGPaint::createColor(Color(c)); }
PassRefPtr<CSSValue> CSSParser::parseSVGPaint() { RGBA32 c = Color::transparent; if (!parseColorFromValue(m_valueList->current(), c, true)) return SVGPaint::create(); return SVGPaint::create(Color(c)); }
bool CSSParser::parseSVGValue(int propId, bool important) { CSSParserValue* value = m_valueList->current(); if (!value) return false; int id = value->id; bool valid_primitive = false; RefPtr<CSSValue> parsedValue; switch (propId) { /* The comment to the right defines all valid value of these * properties as defined in SVG 1.1, Appendix N. Property index */ case CSSPropertyAlignmentBaseline: // auto | baseline | before-edge | text-before-edge | middle | // central | after-edge | text-after-edge | ideographic | alphabetic | // hanging | mathematical | inherit if (id == CSSValueAuto || id == CSSValueBaseline || id == CSSValueMiddle || (id >= CSSValueBeforeEdge && id <= CSSValueMathematical)) valid_primitive = true; break; case CSSPropertyBaselineShift: // baseline | super | sub | <percentage> | <length> | inherit if (id == CSSValueBaseline || id == CSSValueSub || id >= CSSValueSuper) valid_primitive = true; else valid_primitive = validUnit(value, FLength|FPercent, false); break; case CSSPropertyDominantBaseline: // auto | use-script | no-change | reset-size | ideographic | // alphabetic | hanging | mathematical | central | middle | // text-after-edge | text-before-edge | inherit if (id == CSSValueAuto || id == CSSValueMiddle || (id >= CSSValueUseScript && id <= CSSValueResetSize) || (id >= CSSValueCentral && id <= CSSValueMathematical)) valid_primitive = true; break; case CSSPropertyEnableBackground: // accumulate | new [x] [y] [width] [height] | inherit if (id == CSSValueAccumulate) // TODO : new valid_primitive = true; break; case CSSPropertyMarkerStart: case CSSPropertyMarkerMid: case CSSPropertyMarkerEnd: case CSSPropertyMask: if (id == CSSValueNone) valid_primitive = true; else if (value->unit == CSSPrimitiveValue::CSS_URI) { parsedValue = CSSPrimitiveValue::create(value->string, CSSPrimitiveValue::CSS_URI); if (parsedValue) m_valueList->next(); } break; case CSSPropertyClipRule: // nonzero | evenodd | inherit case CSSPropertyFillRule: if (id == CSSValueNonzero || id == CSSValueEvenodd) valid_primitive = true; break; case CSSPropertyStrokeMiterlimit: // <miterlimit> | inherit valid_primitive = validUnit(value, FNumber|FNonNeg, false); break; case CSSPropertyStrokeLinejoin: // miter | round | bevel | inherit if (id == CSSValueMiter || id == CSSValueRound || id == CSSValueBevel) valid_primitive = true; break; case CSSPropertyStrokeLinecap: // butt | round | square | inherit if (id == CSSValueButt || id == CSSValueRound || id == CSSValueSquare) valid_primitive = true; break; case CSSPropertyStrokeOpacity: // <opacity-value> | inherit case CSSPropertyFillOpacity: case CSSPropertyStopOpacity: case CSSPropertyFloodOpacity: valid_primitive = (!id && validUnit(value, FNumber|FPercent, false)); break; case CSSPropertyShapeRendering: // auto | optimizeSpeed | crispEdges | geometricPrecision | inherit if (id == CSSValueAuto || id == CSSValueOptimizespeed || id == CSSValueCrispedges || id == CSSValueGeometricprecision) valid_primitive = true; break; case CSSPropertyImageRendering: // auto | optimizeSpeed | case CSSPropertyColorRendering: // optimizeQuality | inherit if (id == CSSValueAuto || id == CSSValueOptimizespeed || id == CSSValueOptimizequality) valid_primitive = true; break; case CSSPropertyColorProfile: // auto | sRGB | <name> | <uri> inherit if (id == CSSValueAuto || id == CSSValueSrgb) valid_primitive = true; break; case CSSPropertyColorInterpolation: // auto | sRGB | linearRGB | inherit case CSSPropertyColorInterpolationFilters: if (id == CSSValueAuto || id == CSSValueSrgb || id == CSSValueLinearrgb) valid_primitive = true; break; /* Start of supported CSS properties with validation. This is needed for parseShortHand to work * correctly and allows optimization in applyRule(..) */ case CSSPropertyTextAnchor: // start | middle | end | inherit if (id == CSSValueStart || id == CSSValueMiddle || id == CSSValueEnd) valid_primitive = true; break; case CSSPropertyGlyphOrientationVertical: // auto | <angle> | inherit if (id == CSSValueAuto) { valid_primitive = true; break; } /* fallthrough intentional */ case CSSPropertyGlyphOrientationHorizontal: // <angle> (restricted to _deg_ per SVG 1.1 spec) | inherit if (value->unit == CSSPrimitiveValue::CSS_DEG || value->unit == CSSPrimitiveValue::CSS_NUMBER) { parsedValue = CSSPrimitiveValue::create(value->fValue, CSSPrimitiveValue::CSS_DEG); if (parsedValue) m_valueList->next(); } break; case CSSPropertyFill: // <paint> | inherit case CSSPropertyStroke: // <paint> | inherit { if (id == CSSValueNone) parsedValue = SVGPaint::createNone(); else if (id == CSSValueCurrentcolor) parsedValue = SVGPaint::createCurrentColor(); else if ((id >= CSSValueActiveborder && id <= CSSValueWindowtext) || id == CSSValueMenu) parsedValue = SVGPaint::createColor(RenderTheme::defaultTheme()->systemColor(id)); else if (value->unit == CSSPrimitiveValue::CSS_URI) { RGBA32 c = Color::transparent; if (m_valueList->next()) { if (parseColorFromValue(m_valueList->current(), c)) parsedValue = SVGPaint::createURIAndColor(value->string, c); else if (m_valueList->current()->id == CSSValueNone) parsedValue = SVGPaint::createURIAndNone(value->string); } if (!parsedValue) parsedValue = SVGPaint::createURI(value->string); } else parsedValue = parseSVGPaint(); if (parsedValue) m_valueList->next(); } break; case CSSPropertyColor: // <color> | inherit if ((id >= CSSValueAqua && id <= CSSValueWindowtext) || (id >= CSSValueAliceblue && id <= CSSValueYellowgreen)) parsedValue = SVGColor::createFromString(value->string); else parsedValue = parseSVGColor(); if (parsedValue) m_valueList->next(); break; case CSSPropertyStopColor: // TODO : icccolor case CSSPropertyFloodColor: case CSSPropertyLightingColor: if ((id >= CSSValueAqua && id <= CSSValueWindowtext) || (id >= CSSValueAliceblue && id <= CSSValueYellowgreen)) parsedValue = SVGColor::createFromString(value->string); else if (id == CSSValueCurrentcolor) parsedValue = SVGColor::createCurrentColor(); else // TODO : svgcolor (iccColor) parsedValue = parseSVGColor(); if (parsedValue) m_valueList->next(); break; case CSSPropertyVectorEffect: // none | non-scaling-stroke | inherit if (id == CSSValueNone || id == CSSValueNonScalingStroke) valid_primitive = true; break; case CSSPropertyWritingMode: // lr-tb | rl_tb | tb-rl | lr | rl | tb | inherit if (id == CSSValueLrTb || id == CSSValueRlTb || id == CSSValueTbRl || id == CSSValueLr || id == CSSValueRl || id == CSSValueTb) valid_primitive = true; break; case CSSPropertyStrokeWidth: // <length> | inherit case CSSPropertyStrokeDashoffset: valid_primitive = validUnit(value, FLength | FPercent, false); break; case CSSPropertyStrokeDasharray: // none | <dasharray> | inherit if (id == CSSValueNone) valid_primitive = true; else parsedValue = parseSVGStrokeDasharray(); break; case CSSPropertyKerning: // auto | normal | <length> | inherit if (id == CSSValueAuto || id == CSSValueNormal) valid_primitive = true; else valid_primitive = validUnit(value, FLength, false); break; case CSSPropertyClipPath: // <uri> | none | inherit case CSSPropertyFilter: if (id == CSSValueNone) valid_primitive = true; else if (value->unit == CSSPrimitiveValue::CSS_URI) { parsedValue = CSSPrimitiveValue::create(value->string, (CSSPrimitiveValue::UnitTypes) value->unit); if (parsedValue) m_valueList->next(); } break; case CSSPropertyWebkitSvgShadow: if (id == CSSValueNone) valid_primitive = true; else return parseShadow(propId, important); /* shorthand properties */ case CSSPropertyMarker: { ShorthandScope scope(this, propId); m_implicitShorthand = true; if (!parseValue(CSSPropertyMarkerStart, important)) return false; if (m_valueList->current()) { rollbackLastProperties(1); return false; } CSSValue* value = m_parsedProperties[m_numParsedProperties - 1]->value(); addProperty(CSSPropertyMarkerMid, value, important); addProperty(CSSPropertyMarkerEnd, value, important); m_implicitShorthand = false; return true; } default: // If you crash here, it's because you added a css property and are not handling it // in either this switch statement or the one in CSSParser::parseValue ASSERT_WITH_MESSAGE(0, "unimplemented propertyID: %d", propId); return false; } if (valid_primitive) { if (id != 0) parsedValue = CSSPrimitiveValue::createIdentifier(id); else if (value->unit == CSSPrimitiveValue::CSS_STRING) parsedValue = CSSPrimitiveValue::create(value->string, (CSSPrimitiveValue::UnitTypes) value->unit); else if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimitiveValue::CSS_KHZ) parsedValue = CSSPrimitiveValue::create(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit); else if (value->unit >= CSSParserValue::Q_EMS) parsedValue = CSSQuirkPrimitiveValue::create(value->fValue, CSSPrimitiveValue::CSS_EMS); m_valueList->next(); } if (!parsedValue || (m_valueList->current() && !inShorthand())) return false; addProperty(propId, parsedValue.release(), important); return true; }
bool CSSParser::parseSVGValue(CSSPropertyID propId, bool important) { if (!m_valueList->current()) return false; ValueWithCalculation valueWithCalculation(*m_valueList->current()); CSSValueID id = valueWithCalculation.value().id; bool valid_primitive = false; RefPtr<CSSValue> parsedValue; switch (propId) { /* The comment to the right defines all valid value of these * properties as defined in SVG 1.1, Appendix N. Property index */ case CSSPropertyBaselineShift: // baseline | super | sub | <percentage> | <length> | inherit if (id == CSSValueBaseline || id == CSSValueSub || id >= CSSValueSuper) valid_primitive = true; else valid_primitive = validateUnit(valueWithCalculation, FLength | FPercent, SVGAttributeMode); break; case CSSPropertyEnableBackground: // accumulate | new [x] [y] [width] [height] | inherit if (id == CSSValueAccumulate) // TODO : new valid_primitive = true; break; case CSSPropertyMarkerStart: case CSSPropertyMarkerMid: case CSSPropertyMarkerEnd: case CSSPropertyMask: if (id == CSSValueNone) valid_primitive = true; else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_URI) { parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().string, CSSPrimitiveValue::CSS_URI); if (parsedValue) m_valueList->next(); } break; case CSSPropertyStrokeMiterlimit: // <miterlimit> | inherit valid_primitive = validateUnit(valueWithCalculation, FNumber | FNonNeg, SVGAttributeMode); break; case CSSPropertyStrokeOpacity: // <opacity-value> | inherit case CSSPropertyFillOpacity: case CSSPropertyStopOpacity: case CSSPropertyFloodOpacity: valid_primitive = (!id && validateUnit(valueWithCalculation, FNumber | FPercent, SVGAttributeMode)); break; case CSSPropertyColorProfile: // auto | sRGB | <name> | <uri> inherit if (id == CSSValueAuto || id == CSSValueSrgb) valid_primitive = true; break; /* Start of supported CSS properties with validation. This is needed for parseShortHand to work * correctly and allows optimization in applyRule(..) */ case CSSPropertyGlyphOrientationVertical: // auto | <angle> | inherit if (id == CSSValueAuto) { valid_primitive = true; break; } FALLTHROUGH; case CSSPropertyGlyphOrientationHorizontal: // <angle> (restricted to _deg_ per SVG 1.1 spec) | inherit if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_DEG || valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_NUMBER) { parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().fValue, CSSPrimitiveValue::CSS_DEG); if (parsedValue) m_valueList->next(); } break; case CSSPropertyPaintOrder: if (id == CSSValueNormal) valid_primitive = true; else parsedValue = parsePaintOrder(); break; case CSSPropertyFill: // <paint> | inherit case CSSPropertyStroke: // <paint> | inherit { if (id == CSSValueNone) parsedValue = SVGPaint::createNone(); else if (id == CSSValueCurrentcolor) parsedValue = SVGPaint::createCurrentColor(); else if (isValidSystemControlColorValue(id) || id == CSSValueMenu) parsedValue = SVGPaint::createColor(RenderTheme::defaultTheme()->systemColor(id)); else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_URI) { if (m_valueList->next()) { Color color = parseColorFromValue(*m_valueList->current()); if (color.isValid()) parsedValue = SVGPaint::createURIAndColor(valueWithCalculation.value().string, color); else if (m_valueList->current()->id == CSSValueNone) parsedValue = SVGPaint::createURIAndNone(valueWithCalculation.value().string); } if (!parsedValue) parsedValue = SVGPaint::createURI(valueWithCalculation.value().string); } else parsedValue = parseSVGPaint(); if (parsedValue) m_valueList->next(); } break; case CSSPropertyStopColor: // TODO : icccolor case CSSPropertyFloodColor: case CSSPropertyLightingColor: if (CSSParser::isValidSystemColorValue(id) || (id >= CSSValueAliceblue && id <= CSSValueYellowgreen)) parsedValue = SVGColor::createFromString(valueWithCalculation.value().string); else if (id == CSSValueCurrentcolor) parsedValue = SVGColor::createCurrentColor(); else // TODO : svgcolor (iccColor) parsedValue = parseSVGColor(); if (parsedValue) m_valueList->next(); break; case CSSPropertyStrokeWidth: // <length> | inherit case CSSPropertyStrokeDashoffset: valid_primitive = validateUnit(valueWithCalculation, FLength | FPercent, SVGAttributeMode); break; case CSSPropertyStrokeDasharray: // none | <dasharray> | inherit if (id == CSSValueNone) valid_primitive = true; else parsedValue = parseSVGStrokeDasharray(); break; case CSSPropertyKerning: // auto | normal | <length> | inherit if (id == CSSValueAuto || id == CSSValueNormal) valid_primitive = true; else valid_primitive = validateUnit(valueWithCalculation, FLength, SVGAttributeMode); break; case CSSPropertyClipPath: // <uri> | none | inherit case CSSPropertyFilter: if (id == CSSValueNone) valid_primitive = true; else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_URI) { parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().string, (CSSPrimitiveValue::UnitTypes) valueWithCalculation.value().unit); if (parsedValue) m_valueList->next(); } break; case CSSPropertyWebkitSvgShadow: if (id == CSSValueNone) valid_primitive = true; else { auto shadowValueList = parseShadow(*m_valueList, propId); if (shadowValueList) { addProperty(propId, WTFMove(shadowValueList), important); m_valueList->next(); return true; } return false; } break; /* shorthand properties */ case CSSPropertyMarker: { ShorthandScope scope(this, propId); TemporaryChange<bool> change(m_implicitShorthand, true); if (!parseValue(CSSPropertyMarkerStart, important)) return false; if (m_valueList->current()) { rollbackLastProperties(1); return false; } CSSValue* value = m_parsedProperties.last().value(); addProperty(CSSPropertyMarkerMid, value, important); addProperty(CSSPropertyMarkerEnd, value, important); return true; } case CSSPropertyCx: case CSSPropertyCy: case CSSPropertyR: case CSSPropertyRx: case CSSPropertyRy: case CSSPropertyX: case CSSPropertyY: valid_primitive = (!id && validateUnit(valueWithCalculation, FLength | FPercent)); break; default: // If you crash here, it's because you added a css property and are not handling it // in either this switch statement or the one in CSSParser::parseValue ASSERT_WITH_MESSAGE(0, "unimplemented propertyID: %d", propId); return false; } if (valid_primitive) { if (id != 0) parsedValue = CSSPrimitiveValue::createIdentifier(id); else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_STRING) parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().string, (CSSPrimitiveValue::UnitTypes) valueWithCalculation.value().unit); else if (valueWithCalculation.value().unit >= CSSPrimitiveValue::CSS_NUMBER && valueWithCalculation.value().unit <= CSSPrimitiveValue::CSS_KHZ) parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().fValue, (CSSPrimitiveValue::UnitTypes) valueWithCalculation.value().unit); else if (valueWithCalculation.value().unit >= CSSParserValue::Q_EMS) parsedValue = CSSPrimitiveValue::createAllowingMarginQuirk(valueWithCalculation.value().fValue, CSSPrimitiveValue::CSS_EMS); if (isCalculation(valueWithCalculation)) parsedValue = CSSPrimitiveValue::create(valueWithCalculation.calculation()); m_valueList->next(); } if (!parsedValue || (m_valueList->current() && !inShorthand())) return false; addProperty(propId, WTFMove(parsedValue), important); return true; }