| Index: Source/core/css/SVGCSSParser.cpp
|
| diff --git a/Source/core/css/SVGCSSParser.cpp b/Source/core/css/SVGCSSParser.cpp
|
| deleted file mode 100644
|
| index befbe7c420e120a23689e73080ed3c881f3ff9f9..0000000000000000000000000000000000000000
|
| --- a/Source/core/css/SVGCSSParser.cpp
|
| +++ /dev/null
|
| @@ -1,430 +0,0 @@
|
| -/*
|
| - Copyright (C) 2008 Eric Seidel <eric@webkit.org>
|
| - Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
|
| - 2004, 2005, 2007, 2010 Rob Buis <buis@kde.org>
|
| - Copyright (C) 2005, 2006 Apple Computer, Inc.
|
| -
|
| - This library is free software; you can redistribute it and/or
|
| - modify it under the terms of the GNU Library General Public
|
| - License as published by the Free Software Foundation; either
|
| - version 2 of the License, or (at your option) any later version.
|
| -
|
| - This library is distributed in the hope that it will be useful,
|
| - but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - Library General Public License for more details.
|
| -
|
| - You should have received a copy of the GNU Library General Public License
|
| - along with this library; see the file COPYING.LIB. If not, write to
|
| - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - Boston, MA 02110-1301, USA.
|
| -*/
|
| -
|
| -#include "config.h"
|
| -
|
| -#include "CSSPropertyNames.h"
|
| -#include "CSSValueKeywords.h"
|
| -#include "RuntimeEnabledFeatures.h"
|
| -#include "core/css/CSSParserValues.h"
|
| -#include "core/css/CSSValueList.h"
|
| -#include "core/css/parser/CSSPropertyParser.h"
|
| -#include "core/rendering/RenderTheme.h"
|
| -#include "core/svg/SVGPaint.h"
|
| -
|
| -using namespace std;
|
| -
|
| -namespace WebCore {
|
| -
|
| -static bool isSystemColor(int id)
|
| -{
|
| - return (id >= CSSValueActiveborder && id <= CSSValueWindowtext) || id == CSSValueMenu;
|
| -}
|
| -
|
| -bool CSSPropertyParser::parseSVGValue(CSSPropertyID propId, bool important)
|
| -{
|
| - CSSParserValue* value = m_valueList->current();
|
| - if (!value)
|
| - return false;
|
| -
|
| - CSSValueID id = value->id;
|
| -
|
| - bool valid_primitive = false;
|
| - RefPtrWillBeRawPtr<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, SVGAttributeMode);
|
| - 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, SVGAttributeMode);
|
| - 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, SVGAttributeMode));
|
| - 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 CSSPropertyBufferedRendering: // auto | dynamic | static
|
| - if (id == CSSValueAuto || id == CSSValueDynamic || id == CSSValueStatic)
|
| - 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 (isSystemColor(id))
|
| - parsedValue = SVGPaint::createColor(RenderTheme::theme().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);
|
| - else if (m_valueList->current()->id == CSSValueCurrentcolor)
|
| - parsedValue = SVGPaint::createURIAndCurrentColor(value->string);
|
| - }
|
| - if (!parsedValue)
|
| - parsedValue = SVGPaint::createURI(value->string);
|
| - } else
|
| - parsedValue = parseSVGPaint();
|
| -
|
| - if (parsedValue)
|
| - m_valueList->next();
|
| - }
|
| - break;
|
| -
|
| - case CSSPropertyStopColor: // TODO : icccolor
|
| - case CSSPropertyFloodColor:
|
| - case CSSPropertyLightingColor:
|
| - if (isSystemColor(id))
|
| - parsedValue = SVGColor::createFromColor(RenderTheme::theme().systemColor(id));
|
| - else if ((id >= CSSValueAqua && id <= CSSValueTransparent) ||
|
| - (id >= CSSValueAliceblue && id <= CSSValueYellowgreen) || id == CSSValueGrey)
|
| - 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 CSSPropertyPaintOrder:
|
| - if (!RuntimeEnabledFeatures::svgPaintOrderEnabled())
|
| - return false;
|
| -
|
| - if (m_valueList->size() == 1 && id == CSSValueNormal)
|
| - valid_primitive = true;
|
| - else if ((parsedValue = parsePaintOrder()))
|
| - 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, 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 = validUnit(value, FLength, SVGAttributeMode);
|
| - 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 CSSPropertyMaskType: // luminance | alpha | inherit
|
| - if (id == CSSValueLuminance || id == CSSValueAlpha)
|
| - valid_primitive = true;
|
| - break;
|
| -
|
| - /* shorthand properties */
|
| - case CSSPropertyMarker:
|
| - {
|
| - ShorthandScope scope(this, propId);
|
| - CSSPropertyParser::ImplicitScope implicitScope(this, PropertyImplicit);
|
| - 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;
|
| - }
|
| - 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 CSSPropertyParser::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 = CSSPrimitiveValue::createAllowingMarginQuirk(value->fValue, CSSPrimitiveValue::CSS_EMS);
|
| - if (isCalculation(value)) {
|
| - // FIXME calc() http://webkit.org/b/16662 : actually create a CSSPrimitiveValue here, ie
|
| - // parsedValue = CSSPrimitiveValue::create(m_parsedCalculation.release());
|
| - m_parsedCalculation.release();
|
| - parsedValue = nullptr;
|
| - }
|
| - m_valueList->next();
|
| - }
|
| - if (!parsedValue || (m_valueList->current() && !inShorthand()))
|
| - return false;
|
| -
|
| - addProperty(propId, parsedValue.release(), important);
|
| - return true;
|
| -}
|
| -
|
| -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSVGStrokeDasharray()
|
| -{
|
| - RefPtrWillBeRawPtr<CSSValueList> ret = CSSValueList::createCommaSeparated();
|
| - CSSParserValue* value = m_valueList->current();
|
| - bool valid_primitive = true;
|
| - while (value) {
|
| - valid_primitive = validUnit(value, FLength | FPercent | FNonNeg, SVGAttributeMode);
|
| - if (!valid_primitive)
|
| - break;
|
| - if (value->id != 0)
|
| - ret->append(CSSPrimitiveValue::createIdentifier(value->id));
|
| - else if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimitiveValue::CSS_KHZ)
|
| - ret->append(CSSPrimitiveValue::create(value->fValue, (CSSPrimitiveValue::UnitTypes) value->unit));
|
| - value = m_valueList->next();
|
| - if (value && value->unit == CSSParserValue::Operator && value->iValue == ',')
|
| - value = m_valueList->next();
|
| - }
|
| - if (!valid_primitive)
|
| - return nullptr;
|
| - return ret.release();
|
| -}
|
| -
|
| -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSVGPaint()
|
| -{
|
| - RGBA32 c = Color::transparent;
|
| - if (!parseColorFromValue(m_valueList->current(), c))
|
| - return SVGPaint::createUnknown();
|
| - return SVGPaint::createColor(Color(c));
|
| -}
|
| -
|
| -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSVGColor()
|
| -{
|
| - RGBA32 c = Color::transparent;
|
| - if (!parseColorFromValue(m_valueList->current(), c))
|
| - return nullptr;
|
| - return SVGColor::createFromColor(Color(c));
|
| -}
|
| -
|
| -// normal | [ fill || stroke || markers ]
|
| -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parsePaintOrder() const
|
| -{
|
| - if (m_valueList->size() > 3)
|
| - return nullptr;
|
| -
|
| - CSSParserValue* value = m_valueList->current();
|
| - if (!value)
|
| - return nullptr;
|
| -
|
| - RefPtrWillBeRawPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated();
|
| -
|
| - // The default paint-order is: Fill, Stroke, Markers.
|
| - bool seenFill = false,
|
| - seenStroke = false,
|
| - seenMarkers = false;
|
| -
|
| - do {
|
| - switch (value->id) {
|
| - case CSSValueNormal:
|
| - // normal inside [fill || stroke || markers] not valid
|
| - return nullptr;
|
| - case CSSValueFill:
|
| - if (seenFill)
|
| - return nullptr;
|
| -
|
| - seenFill = true;
|
| - break;
|
| - case CSSValueStroke:
|
| - if (seenStroke)
|
| - return nullptr;
|
| -
|
| - seenStroke = true;
|
| - break;
|
| - case CSSValueMarkers:
|
| - if (seenMarkers)
|
| - return nullptr;
|
| -
|
| - seenMarkers = true;
|
| - break;
|
| - default:
|
| - return nullptr;
|
| - }
|
| -
|
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(value->id));
|
| - } while ((value = m_valueList->next()));
|
| -
|
| - // fill out the rest of the paint order
|
| - if (!seenFill)
|
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueFill));
|
| - if (!seenStroke)
|
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueStroke));
|
| - if (!seenMarkers)
|
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueMarkers));
|
| -
|
| - return parsedValues.release();
|
| -}
|
| -
|
| -}
|
|
|