| Index: Source/core/css/parser/CSSPropertyParser.cpp
|
| diff --git a/Source/core/css/parser/CSSPropertyParser.cpp b/Source/core/css/parser/CSSPropertyParser.cpp
|
| index d789b39fb7d88ef9f3672af8bb08475ea64cb903..120f724ec5951c16ccdeabf73db715752c208b76 100644
|
| --- a/Source/core/css/parser/CSSPropertyParser.cpp
|
| +++ b/Source/core/css/parser/CSSPropertyParser.cpp
|
| @@ -1104,11 +1104,12 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
|
| else
|
| validPrimitive = validUnit(value, FTime | FInteger | FNonNeg);
|
| break;
|
| + case CSSPropertyTransform:
|
| case CSSPropertyWebkitTransform:
|
| if (id == CSSValueNone)
|
| validPrimitive = true;
|
| else {
|
| - RefPtrWillBeRawPtr<CSSValue> transformValue = parseTransform();
|
| + RefPtrWillBeRawPtr<CSSValue> transformValue = parseTransform(propId);
|
| if (transformValue) {
|
| addProperty(propId, transformValue.release(), important);
|
| return true;
|
| @@ -1116,6 +1117,18 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
|
| return false;
|
| }
|
| break;
|
| + case CSSPropertyTransformOrigin: {
|
| + RefPtrWillBeRawPtr<CSSValueList> list = parseTransformOrigin();
|
| + if (!list)
|
| + return false;
|
| + // These values are added to match gecko serialization.
|
| + if (list->length() == 1)
|
| + list->append(cssValuePool().createValue(50, CSSPrimitiveValue::CSS_PERCENTAGE));
|
| + if (list->length() == 2)
|
| + list->append(cssValuePool().createValue(0, CSSPrimitiveValue::CSS_PX));
|
| + addProperty(propId, list.release(), important);
|
| + return true;
|
| + }
|
| case CSSPropertyWebkitTransformOrigin:
|
| case CSSPropertyWebkitTransformOriginX:
|
| case CSSPropertyWebkitTransformOriginY:
|
| @@ -1124,7 +1137,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
|
| RefPtrWillBeRawPtr<CSSValue> val2 = nullptr;
|
| RefPtrWillBeRawPtr<CSSValue> val3 = nullptr;
|
| CSSPropertyID propId1, propId2, propId3;
|
| - if (parseTransformOrigin(propId, propId1, propId2, propId3, val1, val2, val3)) {
|
| + if (parseWebkitTransformOrigin(propId, propId1, propId2, propId3, val1, val2, val3)) {
|
| addProperty(propId1, val1.release(), important);
|
| if (val2)
|
| addProperty(propId2, val2.release(), important);
|
| @@ -1134,28 +1147,40 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
|
| }
|
| return false;
|
| }
|
| + case CSSPropertyPerspective:
|
| + if (id == CSSValueNone) {
|
| + validPrimitive = true;
|
| + } else if (validUnit(value, FLength | FNonNeg)) {
|
| + addProperty(propId, createPrimitiveNumericValue(value), important);
|
| + return true;
|
| + }
|
| + break;
|
| case CSSPropertyWebkitPerspective:
|
| - if (id == CSSValueNone)
|
| + if (id == CSSValueNone) {
|
| validPrimitive = true;
|
| - else {
|
| + } else if (validUnit(value, FNumber | FLength | FNonNeg)) {
|
| // Accepting valueless numbers is a quirk of the -webkit prefixed version of the property.
|
| - if (validUnit(value, FNumber | FLength | FNonNeg)) {
|
| - RefPtrWillBeRawPtr<CSSValue> val = createPrimitiveNumericValue(value);
|
| - if (val) {
|
| - addProperty(propId, val.release(), important);
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| + addProperty(propId, createPrimitiveNumericValue(value), important);
|
| + return true;
|
| }
|
| break;
|
| + case CSSPropertyPerspectiveOrigin: {
|
| + RefPtrWillBeRawPtr<CSSValueList> list = parseTransformOrigin();
|
| + if (!list || list->length() == 3)
|
| + return false;
|
| + // This values are added to match gecko serialization.
|
| + if (list->length() == 1)
|
| + list->append(cssValuePool().createValue(50, CSSPrimitiveValue::CSS_PERCENTAGE));
|
| + addProperty(propId, list.release(), important);
|
| + return true;
|
| + }
|
| case CSSPropertyWebkitPerspectiveOrigin:
|
| case CSSPropertyWebkitPerspectiveOriginX:
|
| case CSSPropertyWebkitPerspectiveOriginY: {
|
| RefPtrWillBeRawPtr<CSSValue> val1 = nullptr;
|
| RefPtrWillBeRawPtr<CSSValue> val2 = nullptr;
|
| CSSPropertyID propId1, propId2;
|
| - if (parsePerspectiveOrigin(propId, propId1, propId2, val1, val2)) {
|
| + if (parseWebkitPerspectiveOrigin(propId, propId1, propId2, val1, val2)) {
|
| addProperty(propId1, val1.release(), important);
|
| if (val2)
|
| addProperty(propId2, val2.release(), important);
|
| @@ -1550,6 +1575,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
|
| case CSSPropertyTouchActionDelay:
|
| case CSSPropertyVisibility:
|
| case CSSPropertyWebkitAppearance:
|
| + case CSSPropertyBackfaceVisibility:
|
| case CSSPropertyWebkitBackfaceVisibility:
|
| case CSSPropertyWebkitBorderAfterStyle:
|
| case CSSPropertyWebkitBorderBeforeStyle:
|
| @@ -1588,6 +1614,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important)
|
| case CSSPropertyWebkitTextCombine:
|
| case CSSPropertyWebkitTextEmphasisPosition:
|
| case CSSPropertyWebkitTextSecurity:
|
| + case CSSPropertyTransformStyle:
|
| case CSSPropertyWebkitTransformStyle:
|
| case CSSPropertyWebkitUserDrag:
|
| case CSSPropertyWebkitUserModify:
|
| @@ -3100,7 +3127,7 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseAnimationProperty(Anima
|
| return nullptr;
|
| }
|
|
|
| -bool CSSPropertyParser::parseTransformOriginShorthand(RefPtrWillBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2, RefPtrWillBeRawPtr<CSSValue>& value3)
|
| +bool CSSPropertyParser::parseWebkitTransformOriginShorthand(RefPtrWillBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2, RefPtrWillBeRawPtr<CSSValue>& value3)
|
| {
|
| parse2ValuesFillPosition(m_valueList.get(), value1, value2);
|
|
|
| @@ -7229,8 +7256,71 @@ PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseFilter()
|
|
|
| return list.release();
|
| }
|
| +PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseTransformOrigin()
|
| +{
|
| + CSSParserValue* value = m_valueList->current();
|
| + CSSValueID id = value->id;
|
| + RefPtrWillBeRawPtr<CSSValue> xValue;
|
| + RefPtrWillBeRawPtr<CSSValue> yValue;
|
| + RefPtrWillBeRawPtr<CSSValue> zValue;
|
| + if (id == CSSValueLeft || id == CSSValueRight) {
|
| + xValue = cssValuePool().createIdentifierValue(id);
|
| + } else if (id == CSSValueTop || id == CSSValueBottom) {
|
| + yValue = cssValuePool().createIdentifierValue(id);
|
| + } else if (id == CSSValueCenter) {
|
| + // Unresolved as to whether this is X or Y.
|
| + } else if (validUnit(value, FPercent | FLength)) {
|
| + xValue = createPrimitiveNumericValue(value);
|
| + } else {
|
| + return nullptr;
|
| + }
|
| +
|
| + if ((value = m_valueList->next())) {
|
| + id = value->id;
|
| + if (!xValue && (id == CSSValueLeft || id == CSSValueRight)) {
|
| + xValue = cssValuePool().createIdentifierValue(id);
|
| + } else if (!yValue && (id == CSSValueTop || id == CSSValueBottom)) {
|
| + yValue = cssValuePool().createIdentifierValue(id);
|
| + } else if (id == CSSValueCenter) {
|
| + // Resolved below.
|
| + } else if (!yValue && validUnit(value, FPercent | FLength)) {
|
| + yValue = createPrimitiveNumericValue(value);
|
| + } else {
|
| + return nullptr;
|
| + }
|
| +
|
| + // If X or Y have not been resolved, they must be center.
|
| + if (!xValue)
|
| + xValue = cssValuePool().createIdentifierValue(CSSValueCenter);
|
| + if (!yValue)
|
| + yValue = cssValuePool().createIdentifierValue(CSSValueCenter);
|
| +
|
| + if ((value = m_valueList->next())) {
|
| + if (!validUnit(value, FLength))
|
| + return nullptr;
|
| + zValue = createPrimitiveNumericValue(value);
|
| +
|
| + if ((value = m_valueList->next()))
|
| + return nullptr;
|
| + }
|
| + } else if (!xValue) {
|
| + if (yValue) {
|
| + xValue = cssValuePool().createValue(50, CSSPrimitiveValue::CSS_PERCENTAGE);
|
| + } else {
|
| + xValue = cssValuePool().createIdentifierValue(CSSValueCenter);
|
| + }
|
| + }
|
| +
|
| + RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
|
| + list->append(xValue.release());
|
| + if (yValue)
|
| + list->append(yValue.release());
|
| + if (zValue)
|
| + list->append(zValue.release());
|
| + return list.release();
|
| +}
|
|
|
| -bool CSSPropertyParser::parseTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtrWillBeRawPtr<CSSValue>& value, RefPtrWillBeRawPtr<CSSValue>& value2, RefPtrWillBeRawPtr<CSSValue>& value3)
|
| +bool CSSPropertyParser::parseWebkitTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtrWillBeRawPtr<CSSValue>& value, RefPtrWillBeRawPtr<CSSValue>& value2, RefPtrWillBeRawPtr<CSSValue>& value3)
|
| {
|
| propId1 = propId;
|
| propId2 = propId;
|
| @@ -7243,9 +7333,9 @@ bool CSSPropertyParser::parseTransformOrigin(CSSPropertyID propId, CSSPropertyID
|
|
|
| switch (propId) {
|
| case CSSPropertyWebkitTransformOrigin:
|
| - if (!parseTransformOriginShorthand(value, value2, value3))
|
| + if (!parseWebkitTransformOriginShorthand(value, value2, value3))
|
| return false;
|
| - // parseTransformOriginShorthand advances the m_valueList pointer
|
| + // parseWebkitTransformOriginShorthand advances the m_valueList pointer
|
| break;
|
| case CSSPropertyWebkitTransformOriginX: {
|
| value = parseFillPositionX(m_valueList.get());
|
| @@ -7274,7 +7364,7 @@ bool CSSPropertyParser::parseTransformOrigin(CSSPropertyID propId, CSSPropertyID
|
| return value;
|
| }
|
|
|
| -bool CSSPropertyParser::parsePerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtrWillBeRawPtr<CSSValue>& value, RefPtrWillBeRawPtr<CSSValue>& value2)
|
| +bool CSSPropertyParser::parseWebkitPerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtrWillBeRawPtr<CSSValue>& value, RefPtrWillBeRawPtr<CSSValue>& value2)
|
| {
|
| propId1 = propId;
|
| propId2 = propId;
|
|
|