| Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
 | 
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
 | 
| index ce08752b343afb1db20b13f87687c154164cbc08..c502ac825e6893fc0b94b68f4e148a178c70d871 100644
 | 
| --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
 | 
| +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
 | 
| @@ -297,14 +297,14 @@ CSSPrimitiveValue* consumeTime(CSSParserTokenRange& range, ValueRange valueRange
 | 
|      return nullptr;
 | 
|  }
 | 
|  
 | 
| -CSSPrimitiveValue* consumeIdent(CSSParserTokenRange& range)
 | 
| +CSSIdentifierValue* consumeIdent(CSSParserTokenRange& range)
 | 
|  {
 | 
|      if (range.peek().type() != IdentToken)
 | 
|          return nullptr;
 | 
| -    return CSSPrimitiveValue::createIdentifier(range.consumeIncludingWhitespace().id());
 | 
| +    return CSSIdentifierValue::create(range.consumeIncludingWhitespace().id());
 | 
|  }
 | 
|  
 | 
| -CSSPrimitiveValue* consumeIdentRange(CSSParserTokenRange& range, CSSValueID lower, CSSValueID upper)
 | 
| +CSSIdentifierValue* consumeIdentRange(CSSParserTokenRange& range, CSSValueID lower, CSSValueID upper)
 | 
|  {
 | 
|      if (range.peek().id() < lower || range.peek().id() > upper)
 | 
|          return nullptr;
 | 
| @@ -490,7 +490,7 @@ CSSValue* consumeColor(CSSParserTokenRange& range, CSSParserMode cssParserMode,
 | 
|      return CSSColorValue::create(color);
 | 
|  }
 | 
|  
 | 
| -static CSSPrimitiveValue* consumePositionComponent(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless, bool& horizontalEdge, bool& verticalEdge)
 | 
| +static CSSValue* consumePositionComponent(CSSParserTokenRange& range, CSSParserMode cssParserMode, UnitlessQuirk unitless, bool& horizontalEdge, bool& verticalEdge)
 | 
|  {
 | 
|      if (range.peek().type() != IdentToken)
 | 
|          return consumeLengthOrPercent(range, cssParserMode, ValueRangeAll, unitless);
 | 
| @@ -510,30 +510,36 @@ static CSSPrimitiveValue* consumePositionComponent(CSSParserTokenRange& range, C
 | 
|      return consumeIdent(range);
 | 
|  }
 | 
|  
 | 
| -static bool isHorizontalPositionKeywordOnly(const CSSPrimitiveValue& value)
 | 
| +static bool isHorizontalPositionKeywordOnly(const CSSValue& value)
 | 
|  {
 | 
| -    return value.isValueID() && (value.getValueID() == CSSValueLeft || value.getValueID() == CSSValueRight);
 | 
| +    if (!value.isIdentifierValue())
 | 
| +        return false;
 | 
| +    CSSValueID valueID = toCSSIdentifierValue(value).getValueID();
 | 
| +    return valueID == CSSValueLeft || valueID == CSSValueRight;
 | 
|  }
 | 
|  
 | 
| -static bool isVerticalPositionKeywordOnly(const CSSPrimitiveValue& value)
 | 
| +static bool isVerticalPositionKeywordOnly(const CSSValue& value)
 | 
|  {
 | 
| -    return value.isValueID() && (value.getValueID() == CSSValueTop || value.getValueID() == CSSValueBottom);
 | 
| +    if (!value.isIdentifierValue())
 | 
| +        return false;
 | 
| +    CSSValueID valueID = toCSSIdentifierValue(value).getValueID();
 | 
| +    return valueID == CSSValueTop || valueID == CSSValueBottom;
 | 
|  }
 | 
|  
 | 
| -static void positionFromOneValue(CSSPrimitiveValue* value, CSSValue*& resultX, CSSValue*& resultY)
 | 
| +static void positionFromOneValue(CSSValue* value, CSSValue*& resultX, CSSValue*& resultY)
 | 
|  {
 | 
|      bool valueAppliesToYAxisOnly = isVerticalPositionKeywordOnly(*value);
 | 
|      resultX = value;
 | 
| -    resultY = CSSPrimitiveValue::createIdentifier(CSSValueCenter);
 | 
| +    resultY = CSSIdentifierValue::create(CSSValueCenter);
 | 
|      if (valueAppliesToYAxisOnly)
 | 
|          std::swap(resultX, resultY);
 | 
|  }
 | 
|  
 | 
| -static void positionFromTwoValues(CSSPrimitiveValue* value1, CSSPrimitiveValue* value2,
 | 
| +static void positionFromTwoValues(CSSValue* value1, CSSValue* value2,
 | 
|      CSSValue*& resultX, CSSValue*& resultY)
 | 
|  {
 | 
|      bool mustOrderAsXY = isHorizontalPositionKeywordOnly(*value1) || isVerticalPositionKeywordOnly(*value2)
 | 
| -        || !value1->isValueID() || !value2->isValueID();
 | 
| +        || !value1->isIdentifierValue() || !value2->isIdentifierValue();
 | 
|      bool mustOrderAsYX = isVerticalPositionKeywordOnly(*value1) || isHorizontalPositionKeywordOnly(*value2);
 | 
|      DCHECK(!mustOrderAsXY || !mustOrderAsYX);
 | 
|      resultX = value1;
 | 
| @@ -542,12 +548,11 @@ static void positionFromTwoValues(CSSPrimitiveValue* value1, CSSPrimitiveValue*
 | 
|          std::swap(resultX, resultY);
 | 
|  }
 | 
|  
 | 
| -static void positionFromThreeOrFourValues(CSSPrimitiveValue** values, CSSValue*& resultX, CSSValue*& resultY)
 | 
| +static void positionFromThreeOrFourValues(CSSValue** values, CSSValue*& resultX, CSSValue*& resultY)
 | 
|  {
 | 
| -    CSSPrimitiveValue* center = nullptr;
 | 
| +    CSSIdentifierValue* center = nullptr;
 | 
|      for (int i = 0; values[i]; i++) {
 | 
| -        CSSPrimitiveValue* currentValue = values[i];
 | 
| -        DCHECK(currentValue->isValueID());
 | 
| +        CSSIdentifierValue* currentValue = toCSSIdentifierValue(values[i]);
 | 
|          CSSValueID id = currentValue->getValueID();
 | 
|  
 | 
|          if (id == CSSValueCenter) {
 | 
| @@ -557,7 +562,7 @@ static void positionFromThreeOrFourValues(CSSPrimitiveValue** values, CSSValue*&
 | 
|          }
 | 
|  
 | 
|          CSSValue* result = nullptr;
 | 
| -        if (values[i + 1] && !values[i + 1]->isValueID()) {
 | 
| +        if (values[i + 1] && !values[i + 1]->isIdentifierValue()) {
 | 
|              result = CSSValuePair::create(currentValue, values[++i], CSSValuePair::KeepIdenticalValues);
 | 
|          } else {
 | 
|              result = currentValue;
 | 
| @@ -588,26 +593,26 @@ bool consumePosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, Un
 | 
|  {
 | 
|      bool horizontalEdge = false;
 | 
|      bool verticalEdge = false;
 | 
| -    CSSPrimitiveValue* value1 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
| +    CSSValue* value1 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
|      if (!value1)
 | 
|          return false;
 | 
| -    if (!value1->isValueID())
 | 
| +    if (!value1->isIdentifierValue())
 | 
|          horizontalEdge = true;
 | 
|  
 | 
|      CSSParserTokenRange rangeAfterFirstConsume = range;
 | 
| -    CSSPrimitiveValue* value2 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
| +    CSSValue* value2 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
|      if (!value2) {
 | 
|          positionFromOneValue(value1, resultX, resultY);
 | 
|          return true;
 | 
|      }
 | 
|  
 | 
| -    CSSPrimitiveValue* value3 = nullptr;
 | 
| -    if (value1->isValueID()
 | 
| -        && value2->isValueID() != (range.peek().type() == IdentToken)
 | 
| -        && (value2->isValueID() ? value2->getValueID() : value1->getValueID()) != CSSValueCenter)
 | 
| +    CSSValue* value3 = nullptr;
 | 
| +    if (value1->isIdentifierValue()
 | 
| +        && value2->isIdentifierValue() != (range.peek().type() == IdentToken)
 | 
| +        && (value2->isIdentifierValue() ? toCSSIdentifierValue(value2)->getValueID() : toCSSIdentifierValue(value1)->getValueID()) != CSSValueCenter)
 | 
|          value3 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
|      if (!value3) {
 | 
| -        if (verticalEdge && !value2->isValueID()) {
 | 
| +        if (verticalEdge && !value2->isIdentifierValue()) {
 | 
|              range = rangeAfterFirstConsume;
 | 
|              positionFromOneValue(value1, resultX, resultY);
 | 
|              return true;
 | 
| @@ -616,10 +621,10 @@ bool consumePosition(CSSParserTokenRange& range, CSSParserMode cssParserMode, Un
 | 
|          return true;
 | 
|      }
 | 
|  
 | 
| -    CSSPrimitiveValue* value4 = nullptr;
 | 
| -    if (value3->isValueID() && value3->getValueID() != CSSValueCenter && range.peek().type() != IdentToken)
 | 
| +    CSSValue* value4 = nullptr;
 | 
| +    if (value3->isIdentifierValue() && toCSSIdentifierValue(value3)->getValueID() != CSSValueCenter && range.peek().type() != IdentToken)
 | 
|          value4 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
| -    CSSPrimitiveValue* values[5];
 | 
| +    CSSValue* values[5];
 | 
|      values[0] = value1;
 | 
|      values[1] = value2;
 | 
|      values[2] = value3;
 | 
| @@ -642,13 +647,13 @@ bool consumeOneOrTwoValuedPosition(CSSParserTokenRange& range, CSSParserMode css
 | 
|  {
 | 
|      bool horizontalEdge = false;
 | 
|      bool verticalEdge = false;
 | 
| -    CSSPrimitiveValue* value1 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
| +    CSSValue* value1 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
|      if (!value1)
 | 
|          return false;
 | 
| -    if (!value1->isValueID())
 | 
| +    if (!value1->isIdentifierValue())
 | 
|          horizontalEdge = true;
 | 
|  
 | 
| -    CSSPrimitiveValue* value2 = nullptr;
 | 
| +    CSSValue* value2 = nullptr;
 | 
|      if (!verticalEdge || range.peek().type() == IdentToken)
 | 
|          value2 = consumePositionComponent(range, cssParserMode, unitless, horizontalEdge, verticalEdge);
 | 
|      if (!value2) {
 | 
| @@ -811,13 +816,13 @@ static CSSValue* consumeDeprecatedRadialGradient(CSSParserTokenRange& args, CSSP
 | 
|      if ((centerX || centerY) && !consumeCommaIncludingWhitespace(args))
 | 
|          return nullptr;
 | 
|  
 | 
| -    result->setFirstX(toCSSPrimitiveValue(centerX));
 | 
| -    result->setSecondX(toCSSPrimitiveValue(centerX));
 | 
| -    result->setFirstY(toCSSPrimitiveValue(centerY));
 | 
| -    result->setSecondY(toCSSPrimitiveValue(centerY));
 | 
| +    result->setFirstX(centerX);
 | 
| +    result->setSecondX(centerX);
 | 
| +    result->setFirstY(centerY);
 | 
| +    result->setSecondY(centerY);
 | 
|  
 | 
| -    CSSPrimitiveValue* shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args);
 | 
| -    CSSPrimitiveValue* sizeKeyword = consumeIdent<CSSValueClosestSide, CSSValueClosestCorner, CSSValueFarthestSide, CSSValueFarthestCorner, CSSValueContain, CSSValueCover>(args);
 | 
| +    CSSIdentifierValue* shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args);
 | 
| +    CSSIdentifierValue* sizeKeyword = consumeIdent<CSSValueClosestSide, CSSValueClosestCorner, CSSValueFarthestSide, CSSValueFarthestCorner, CSSValueContain, CSSValueCover>(args);
 | 
|      if (!shape)
 | 
|          shape = consumeIdent<CSSValueCircle, CSSValueEllipse>(args);
 | 
|      result->setShape(shape);
 | 
| @@ -848,8 +853,8 @@ static CSSValue* consumeRadialGradient(CSSParserTokenRange& args, CSSParserMode
 | 
|  {
 | 
|      CSSRadialGradientValue* result = CSSRadialGradientValue::create(repeating, CSSRadialGradient);
 | 
|  
 | 
| -    CSSPrimitiveValue* shape = nullptr;
 | 
| -    CSSPrimitiveValue* sizeKeyword = nullptr;
 | 
| +    CSSIdentifierValue* shape = nullptr;
 | 
| +    CSSIdentifierValue* sizeKeyword = nullptr;
 | 
|      CSSPrimitiveValue* horizontalSize = nullptr;
 | 
|      CSSPrimitiveValue* verticalSize = nullptr;
 | 
|  
 | 
| @@ -937,12 +942,12 @@ static CSSValue* consumeLinearGradient(CSSParserTokenRange& args, CSSParserMode
 | 
|      if (angle) {
 | 
|          result->setAngle(angle);
 | 
|      } else if (gradientType == CSSPrefixedLinearGradient || consumeIdent<CSSValueTo>(args)) {
 | 
| -        CSSPrimitiveValue* endX = consumeIdent<CSSValueLeft, CSSValueRight>(args);
 | 
| -        CSSPrimitiveValue* endY = consumeIdent<CSSValueBottom, CSSValueTop>(args);
 | 
| +        CSSIdentifierValue* endX = consumeIdent<CSSValueLeft, CSSValueRight>(args);
 | 
| +        CSSIdentifierValue* endY = consumeIdent<CSSValueBottom, CSSValueTop>(args);
 | 
|          if (!endX && !endY) {
 | 
|              if (gradientType == CSSLinearGradient)
 | 
|                  return nullptr;
 | 
| -            endY = CSSPrimitiveValue::createIdentifier(CSSValueTop);
 | 
| +            endY = CSSIdentifierValue::create(CSSValueTop);
 | 
|              expectComma = false;
 | 
|          } else if (!endX) {
 | 
|              endX = consumeIdent<CSSValueLeft, CSSValueRight>(args);
 | 
| 
 |