Changeset 196851 in webkit
- Timestamp:
- Feb 19, 2016, 6:47:08 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
css/CSSParser.cpp (modified) (20 diffs)
-
css/CSSParser.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r196849 r196851 1 2016-02-19 Simon Fraser <simon.fraser@apple.com> 2 3 Use more concrete types for parsing positions 4 https://bugs.webkit.org/show_bug.cgi?id=154481 5 6 Reviewed by Dean Jackson. 7 8 Use CSSPrimitiveValues for position-parsing functions where possible, to avoid 9 the need to downcast<> the values returned by the parsing functions. 10 11 * css/CSSParser.cpp: 12 (WebCore::CSSParser::parseValue): 13 (WebCore::CSSParser::parsePositionX): 14 (WebCore::CSSParser::parsePositionY): 15 (WebCore::CSSParser::parse4ValuesFillPosition): 16 (WebCore::CSSParser::parse3ValuesFillPosition): 17 (WebCore::CSSParser::parseFillPosition): 18 (WebCore::CSSParser::parse2ValuesFillPosition): 19 (WebCore::CSSParser::parseFillProperty): 20 (WebCore::CSSParser::parseTransformOriginShorthand): 21 (WebCore::CSSParser::parseBasicShapeCircle): 22 (WebCore::CSSParser::parseBasicShapeEllipse): 23 (WebCore::CSSParser::parseDeprecatedRadialGradient): 24 (WebCore::CSSParser::parseRadialGradient): 25 (WebCore::CSSParser::parseTransformOrigin): 26 (WebCore::CSSParser::parsePerspectiveOrigin): 27 * css/CSSParser.h: 28 1 29 2016-02-18 Gavin Barraclough <barraclough@apple.com> 2 30 -
trunk/Source/WebCore/css/CSSParser.cpp
r196691 r196851 2698 2698 case CSSPropertyTransformOriginY: 2699 2699 case CSSPropertyTransformOriginZ: { 2700 RefPtr<CSS Value> val1;2701 RefPtr<CSS Value> val2;2700 RefPtr<CSSPrimitiveValue> val1; 2701 RefPtr<CSSPrimitiveValue> val2; 2702 2702 RefPtr<CSSValue> val3; 2703 2703 CSSPropertyID propId1, propId2, propId3; … … 2730 2730 case CSSPropertyPerspectiveOriginX: 2731 2731 case CSSPropertyPerspectiveOriginY: { 2732 RefPtr<CSS Value> val1;2733 RefPtr<CSS Value> val2;2732 RefPtr<CSSPrimitiveValue> val1; 2733 RefPtr<CSSPrimitiveValue> val2; 2734 2734 CSSPropertyID propId1, propId2; 2735 2735 if (parsePerspectiveOrigin(propId, propId1, propId2, val1, val2)) { … … 4385 4385 } 4386 4386 4387 RefPtr<CSS Value> CSSParser::parsePositionX(CSSParserValueList& valueList)4387 RefPtr<CSSPrimitiveValue> CSSParser::parsePositionX(CSSParserValueList& valueList) 4388 4388 { 4389 4389 int id = valueList.current()->id; … … 4402 4402 } 4403 4403 4404 RefPtr<CSS Value> CSSParser::parsePositionY(CSSParserValueList& valueList)4404 RefPtr<CSSPrimitiveValue> CSSParser::parsePositionY(CSSParserValueList& valueList) 4405 4405 { 4406 4406 int id = valueList.current()->id; … … 4482 4482 } 4483 4483 4484 void CSSParser::parse4ValuesFillPosition(CSSParserValueList& valueList, RefPtr<CSS Value>& value1, RefPtr<CSSValue>& value2, RefPtr<CSSPrimitiveValue>&& parsedValue1, RefPtr<CSSPrimitiveValue>&& parsedValue2)4484 void CSSParser::parse4ValuesFillPosition(CSSParserValueList& valueList, RefPtr<CSSPrimitiveValue>& value1, RefPtr<CSSPrimitiveValue>& value2, RefPtr<CSSPrimitiveValue>&& parsedValue1, RefPtr<CSSPrimitiveValue>&& parsedValue2) 4485 4485 { 4486 4486 // [ left | right ] [ <percentage] | <length> ] && [ top | bottom ] [ <percentage> | <length> ] … … 4530 4530 valueList.next(); 4531 4531 } 4532 void CSSParser::parse3ValuesFillPosition(CSSParserValueList& valueList, RefPtr<CSS Value>& value1, RefPtr<CSSValue>& value2, RefPtr<CSSPrimitiveValue>&& parsedValue1, RefPtr<CSSPrimitiveValue>&& parsedValue2)4532 void CSSParser::parse3ValuesFillPosition(CSSParserValueList& valueList, RefPtr<CSSPrimitiveValue>& value1, RefPtr<CSSPrimitiveValue>& value2, RefPtr<CSSPrimitiveValue>&& parsedValue1, RefPtr<CSSPrimitiveValue>&& parsedValue2) 4533 4533 { 4534 4534 unsigned cumulativeFlags = 0; … … 4613 4613 4614 4614 #ifndef NDEBUG 4615 CSSPrimitiveValue& first = downcast<CSSPrimitiveValue>(*value1);4616 CSSPrimitiveValue& second = downcast<CSSPrimitiveValue>(*value2);4615 CSSPrimitiveValue& first = *value1; 4616 CSSPrimitiveValue& second = *value2; 4617 4617 ident1 = first.getPairValue()->first()->getValueID(); 4618 4618 ident2 = second.getPairValue()->first()->getValueID(); … … 4630 4630 } 4631 4631 4632 void CSSParser::parseFillPosition(CSSParserValueList& valueList, RefPtr<CSS Value>& value1, RefPtr<CSSValue>& value2)4632 void CSSParser::parseFillPosition(CSSParserValueList& valueList, RefPtr<CSSPrimitiveValue>& value1, RefPtr<CSSPrimitiveValue>& value2) 4633 4633 { 4634 4634 unsigned numberOfValues = 0; … … 4677 4677 } 4678 4678 4679 RefPtr<CSSPrimitiveValue> parsedValue1 = downcast<CSSPrimitiveValue>(value1.get());4680 RefPtr<CSSPrimitiveValue> parsedValue2 = downcast<CSSPrimitiveValue>(value2.get());4679 RefPtr<CSSPrimitiveValue> parsedValue1 = value1; 4680 RefPtr<CSSPrimitiveValue> parsedValue2 = value2; 4681 4681 4682 4682 value1 = nullptr; … … 4693 4693 } 4694 4694 4695 void CSSParser::parse2ValuesFillPosition(CSSParserValueList& valueList, RefPtr<CSS Value>& value1, RefPtr<CSSValue>& value2)4695 void CSSParser::parse2ValuesFillPosition(CSSParserValueList& valueList, RefPtr<CSSPrimitiveValue>& value1, RefPtr<CSSPrimitiveValue>& value2) 4696 4696 { 4697 4697 CSSParserValue* value = valueList.current(); … … 4904 4904 break; 4905 4905 case CSSPropertyBackgroundPosition: 4906 case CSSPropertyWebkitMaskPosition: 4907 parseFillPosition(*m_valueList, currValue, currValue2); 4906 case CSSPropertyWebkitMaskPosition: { 4907 RefPtr<CSSPrimitiveValue> value1; 4908 RefPtr<CSSPrimitiveValue> value2; 4909 parseFillPosition(*m_valueList, value1, value2); 4910 currValue = value1; 4911 currValue2 = value2; 4908 4912 // parseFillPosition advances the m_valueList pointer. 4909 4913 break; 4914 } 4910 4915 case CSSPropertyBackgroundPositionX: 4911 4916 case CSSPropertyWebkitMaskPositionX: { … … 5166 5171 } 5167 5172 5168 bool CSSParser::parseTransformOriginShorthand(RefPtr<CSS Value>& value1, RefPtr<CSSValue>& value2, RefPtr<CSSValue>& value3)5173 bool CSSParser::parseTransformOriginShorthand(RefPtr<CSSPrimitiveValue>& value1, RefPtr<CSSPrimitiveValue>& value2, RefPtr<CSSValue>& value3) 5169 5174 { 5170 5175 parse2ValuesFillPosition(*m_valueList, value1, value2); … … 6531 6536 6532 6537 if (argument->id == CSSValueAt && args.next()) { 6533 RefPtr<CSS Value> centerX;6534 RefPtr<CSS Value> centerY;6538 RefPtr<CSSPrimitiveValue> centerX; 6539 RefPtr<CSSPrimitiveValue> centerY; 6535 6540 parseFillPosition(args, centerX, centerY); 6536 6541 if (centerX && centerY && !args.current()) { 6537 shape->setCenterX( downcast<CSSPrimitiveValue>(centerX.get()));6538 shape->setCenterY( downcast<CSSPrimitiveValue>(centerY.get()));6542 shape->setCenterX(centerX); 6543 shape->setCenterY(centerY); 6539 6544 } else 6540 6545 return nullptr; … … 6578 6583 return nullptr; 6579 6584 6580 RefPtr<CSS Value> centerX;6581 RefPtr<CSS Value> centerY;6585 RefPtr<CSSPrimitiveValue> centerX; 6586 RefPtr<CSSPrimitiveValue> centerY; 6582 6587 parseFillPosition(args, centerX, centerY); 6583 6588 if (!centerX || !centerY || args.current()) 6584 6589 return nullptr; 6585 6590 6586 shape->setCenterX( downcast<CSSPrimitiveValue>(centerX.get()));6587 shape->setCenterY( downcast<CSSPrimitiveValue>(centerY.get()));6591 shape->setCenterX(centerX); 6592 shape->setCenterY(centerY); 6588 6593 } 6589 6594 … … 8966 8971 8967 8972 // Optional background-position 8968 RefPtr<CSS Value> centerX;8969 RefPtr<CSS Value> centerY;8973 RefPtr<CSSPrimitiveValue> centerX; 8974 RefPtr<CSSPrimitiveValue> centerY; 8970 8975 // parse2ValuesFillPosition advances the args next pointer. 8971 8976 parse2ValuesFillPosition(*args, centerX, centerY); … … 8984 8989 } 8985 8990 8986 result->setFirstX( downcast<CSSPrimitiveValue>(centerX.get()));8987 result->setSecondX( downcast<CSSPrimitiveValue>(centerX.get()));8991 result->setFirstX(centerX); 8992 result->setSecondX(centerX); 8988 8993 // CSS3 radial gradients always share the same start and end point. 8989 result->setFirstY( downcast<CSSPrimitiveValue>(centerY.get()));8990 result->setSecondY( downcast<CSSPrimitiveValue>(centerY.get()));8994 result->setFirstY(centerY); 8995 result->setSecondY(centerY); 8991 8996 8992 8997 RefPtr<CSSPrimitiveValue> shapeValue; … … 9237 9242 // Second part of grammar, the center-position clause: 9238 9243 // at <position> 9239 RefPtr<CSS Value> centerX;9240 RefPtr<CSS Value> centerY;9244 RefPtr<CSSPrimitiveValue> centerX; 9245 RefPtr<CSSPrimitiveValue> centerY; 9241 9246 if (argument->unit == CSSPrimitiveValue::CSS_IDENT && equalLettersIgnoringASCIICase(*argument, "at")) { 9242 9247 argument = args->next(); … … 9252 9257 return false; 9253 9258 9254 result->setFirstX( downcast<CSSPrimitiveValue>(centerX.get()));9255 result->setFirstY( downcast<CSSPrimitiveValue>(centerY.get()));9259 result->setFirstX(centerX); 9260 result->setFirstY(centerY); 9256 9261 // Right now, CSS radial gradients have the same start and end centers. 9257 result->setSecondX( downcast<CSSPrimitiveValue>(centerX.get()));9258 result->setSecondY( downcast<CSSPrimitiveValue>(centerY.get()));9262 result->setSecondX(centerX); 9263 result->setSecondY(centerY); 9259 9264 } 9260 9265 … … 10200 10205 #endif 10201 10206 10202 bool CSSParser::parseTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtr<CSS Value>& value, RefPtr<CSSValue>& value2, RefPtr<CSSValue>& value3)10207 bool CSSParser::parseTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtr<CSSPrimitiveValue>& value, RefPtr<CSSPrimitiveValue>& value2, RefPtr<CSSValue>& value3) 10203 10208 { 10204 10209 propId1 = propId; … … 10245 10250 } 10246 10251 10247 bool CSSParser::parsePerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtr<CSS Value>& value, RefPtr<CSSValue>& value2)10252 bool CSSParser::parsePerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtr<CSSPrimitiveValue>& value, RefPtr<CSSPrimitiveValue>& value2) 10248 10253 { 10249 10254 propId1 = propId; -
trunk/Source/WebCore/css/CSSParser.h
r196075 r196851 167 167 enum FillPositionParsingMode { ResolveValuesAsPercent = 0, ResolveValuesAsKeyword = 1 }; 168 168 RefPtr<CSSPrimitiveValue> parseFillPositionComponent(CSSParserValueList&, unsigned& cumulativeFlags, FillPositionFlag& individualFlag, FillPositionParsingMode = ResolveValuesAsPercent); 169 RefPtr<CSS Value> parsePositionX(CSSParserValueList&);170 RefPtr<CSS Value> parsePositionY(CSSParserValueList&);171 void parse2ValuesFillPosition(CSSParserValueList&, RefPtr<CSS Value>&, RefPtr<CSSValue>&);169 RefPtr<CSSPrimitiveValue> parsePositionX(CSSParserValueList&); 170 RefPtr<CSSPrimitiveValue> parsePositionY(CSSParserValueList&); 171 void parse2ValuesFillPosition(CSSParserValueList&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&); 172 172 bool isPotentialPositionValue(CSSParserValue&); 173 void parseFillPosition(CSSParserValueList&, RefPtr<CSS Value>&, RefPtr<CSSValue>&);174 void parse3ValuesFillPosition(CSSParserValueList&, RefPtr<CSS Value>&, RefPtr<CSSValue>&, RefPtr<CSSPrimitiveValue>&&, RefPtr<CSSPrimitiveValue>&&);175 void parse4ValuesFillPosition(CSSParserValueList&, RefPtr<CSS Value>&, RefPtr<CSSValue>&, RefPtr<CSSPrimitiveValue>&&, RefPtr<CSSPrimitiveValue>&&);173 void parseFillPosition(CSSParserValueList&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&); 174 void parse3ValuesFillPosition(CSSParserValueList&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&&, RefPtr<CSSPrimitiveValue>&&); 175 void parse4ValuesFillPosition(CSSParserValueList&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&&, RefPtr<CSSPrimitiveValue>&&); 176 176 177 177 void parseFillRepeat(RefPtr<CSSValue>&, RefPtr<CSSValue>&); … … 198 198 static Vector<double> parseKeyframeSelector(const String&); 199 199 200 bool parseTransformOriginShorthand(RefPtr<CSS Value>&, RefPtr<CSSValue>&, RefPtr<CSSValue>&);200 bool parseTransformOriginShorthand(RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSValue>&); 201 201 bool parseCubicBezierTimingFunctionValue(CSSParserValueList& args, double& result); 202 202 bool parseAnimationProperty(CSSPropertyID, RefPtr<CSSValue>&, AnimationParseContext&); … … 325 325 RefPtr<CSSValueList> parseTransform(); 326 326 RefPtr<CSSValue> parseTransformValue(CSSParserValue&); 327 bool parseTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtr<CSS Value>&, RefPtr<CSSValue>&, RefPtr<CSSValue>&);328 bool parsePerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtr<CSS Value>&, RefPtr<CSSValue>&);327 bool parseTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSValue>&); 328 bool parsePerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtr<CSSPrimitiveValue>&, RefPtr<CSSPrimitiveValue>&); 329 329 330 330 bool parseTextEmphasisStyle(bool important);
Note:
See TracChangeset
for help on using the changeset viewer.