OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. |
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> | 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |
6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> | 6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> |
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. | 8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. |
9 * Copyright (C) 2012 Intel Corporation. All rights reserved. | 9 * Copyright (C) 2012 Intel Corporation. All rights reserved. |
10 * | 10 * |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 else | 766 else |
767 validPrimitive = validUnit(value, FLength | FPercent | FNonNeg); | 767 validPrimitive = validUnit(value, FLength | FPercent | FNonNeg); |
768 break; | 768 break; |
769 case CSSPropertyFlexGrow: | 769 case CSSPropertyFlexGrow: |
770 case CSSPropertyFlexShrink: | 770 case CSSPropertyFlexShrink: |
771 validPrimitive = validUnit(value, FNumber | FNonNeg); | 771 validPrimitive = validUnit(value, FNumber | FNonNeg); |
772 break; | 772 break; |
773 case CSSPropertyOrder: | 773 case CSSPropertyOrder: |
774 validPrimitive = validUnit(value, FInteger); | 774 validPrimitive = validUnit(value, FInteger); |
775 break; | 775 break; |
776 case CSSPropertyTransform: | |
777 if (id == CSSValueNone) | |
778 validPrimitive = true; | |
779 else | |
780 parsedValue = parseTransform(unresolvedProperty == CSSPropertyAliasW
ebkitTransform); | |
781 break; | |
782 case CSSPropertyTransformOrigin: { | 776 case CSSPropertyTransformOrigin: { |
783 RefPtrWillBeRawPtr<CSSValueList> list = parseTransformOrigin(); | 777 RefPtrWillBeRawPtr<CSSValueList> list = parseTransformOrigin(); |
784 if (!list) | 778 if (!list) |
785 return false; | 779 return false; |
786 // These values are added to match gecko serialization. | 780 // These values are added to match gecko serialization. |
787 if (list->length() == 1) | 781 if (list->length() == 1) |
788 list->append(cssValuePool().createValue(50, CSSPrimitiveValue::UnitT
ype::Percentage)); | 782 list->append(cssValuePool().createValue(50, CSSPrimitiveValue::UnitT
ype::Percentage)); |
789 if (list->length() == 2) | 783 if (list->length() == 2) |
790 list->append(cssValuePool().createValue(0, CSSPrimitiveValue::UnitTy
pe::Pixels)); | 784 list->append(cssValuePool().createValue(0, CSSPrimitiveValue::UnitTy
pe::Pixels)); |
791 addProperty(propId, list.release(), important); | 785 addProperty(propId, list.release(), important); |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 case CSSPropertyWebkitBorderEndWidth: | 1159 case CSSPropertyWebkitBorderEndWidth: |
1166 case CSSPropertyWebkitBorderBeforeWidth: | 1160 case CSSPropertyWebkitBorderBeforeWidth: |
1167 case CSSPropertyWebkitBorderAfterWidth: | 1161 case CSSPropertyWebkitBorderAfterWidth: |
1168 case CSSPropertyWebkitBorderStart: | 1162 case CSSPropertyWebkitBorderStart: |
1169 case CSSPropertyWebkitBorderEnd: | 1163 case CSSPropertyWebkitBorderEnd: |
1170 case CSSPropertyWebkitBorderBefore: | 1164 case CSSPropertyWebkitBorderBefore: |
1171 case CSSPropertyWebkitBorderAfter: | 1165 case CSSPropertyWebkitBorderAfter: |
1172 case CSSPropertyWebkitTextStroke: | 1166 case CSSPropertyWebkitTextStroke: |
1173 case CSSPropertyWebkitTextStrokeColor: | 1167 case CSSPropertyWebkitTextStrokeColor: |
1174 case CSSPropertyWebkitTextStrokeWidth: | 1168 case CSSPropertyWebkitTextStrokeWidth: |
| 1169 case CSSPropertyTransform: |
1175 validPrimitive = false; | 1170 validPrimitive = false; |
1176 break; | 1171 break; |
1177 | 1172 |
1178 case CSSPropertyScrollSnapPointsX: | 1173 case CSSPropertyScrollSnapPointsX: |
1179 case CSSPropertyScrollSnapPointsY: | 1174 case CSSPropertyScrollSnapPointsY: |
1180 parsedValue = parseScrollSnapPoints(); | 1175 parsedValue = parseScrollSnapPoints(); |
1181 break; | 1176 break; |
1182 case CSSPropertyScrollSnapCoordinate: | 1177 case CSSPropertyScrollSnapCoordinate: |
1183 parsedValue = parseScrollSnapCoordinate(); | 1178 parsedValue = parseScrollSnapCoordinate(); |
1184 break; | 1179 break; |
(...skipping 4500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5685 paintOrderList->append(stroke.release()); | 5680 paintOrderList->append(stroke.release()); |
5686 } | 5681 } |
5687 break; | 5682 break; |
5688 default: | 5683 default: |
5689 ASSERT_NOT_REACHED(); | 5684 ASSERT_NOT_REACHED(); |
5690 } | 5685 } |
5691 | 5686 |
5692 return paintOrderList.release(); | 5687 return paintOrderList.release(); |
5693 } | 5688 } |
5694 | 5689 |
5695 class TransformOperationInfo { | |
5696 public: | |
5697 TransformOperationInfo(CSSValueID id) | |
5698 : m_validID(true) | |
5699 , m_allowSingleArgument(false) | |
5700 , m_argCount(1) | |
5701 , m_unit(CSSPropertyParser::FUnknown) | |
5702 { | |
5703 switch (id) { | |
5704 case CSSValueSkew: | |
5705 m_unit = CSSPropertyParser::FAngle; | |
5706 m_allowSingleArgument = true; | |
5707 m_argCount = 3; | |
5708 break; | |
5709 case CSSValueScale: | |
5710 m_unit = CSSPropertyParser::FNumber; | |
5711 m_allowSingleArgument = true; | |
5712 m_argCount = 3; | |
5713 break; | |
5714 case CSSValueSkewX: | |
5715 m_unit = CSSPropertyParser::FAngle; | |
5716 break; | |
5717 case CSSValueSkewY: | |
5718 m_unit = CSSPropertyParser::FAngle; | |
5719 break; | |
5720 case CSSValueMatrix: | |
5721 m_unit = CSSPropertyParser::FNumber; | |
5722 m_argCount = 11; | |
5723 break; | |
5724 case CSSValueRotate: | |
5725 m_unit = CSSPropertyParser::FAngle; | |
5726 break; | |
5727 case CSSValueScaleX: | |
5728 m_unit = CSSPropertyParser::FNumber; | |
5729 break; | |
5730 case CSSValueScaleY: | |
5731 m_unit = CSSPropertyParser::FNumber; | |
5732 break; | |
5733 case CSSValueScaleZ: | |
5734 m_unit = CSSPropertyParser::FNumber; | |
5735 break; | |
5736 case CSSValueScale3d: | |
5737 m_unit = CSSPropertyParser::FNumber; | |
5738 m_argCount = 5; | |
5739 break; | |
5740 case CSSValueRotateX: | |
5741 m_unit = CSSPropertyParser::FAngle; | |
5742 break; | |
5743 case CSSValueRotateY: | |
5744 m_unit = CSSPropertyParser::FAngle; | |
5745 break; | |
5746 case CSSValueRotateZ: | |
5747 m_unit = CSSPropertyParser::FAngle; | |
5748 break; | |
5749 case CSSValueMatrix3d: | |
5750 m_unit = CSSPropertyParser::FNumber; | |
5751 m_argCount = 31; | |
5752 break; | |
5753 case CSSValueRotate3d: | |
5754 m_unit = CSSPropertyParser::FNumber; | |
5755 m_argCount = 7; | |
5756 break; | |
5757 case CSSValueTranslate: | |
5758 m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent; | |
5759 m_allowSingleArgument = true; | |
5760 m_argCount = 3; | |
5761 break; | |
5762 case CSSValueTranslateX: | |
5763 m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent; | |
5764 break; | |
5765 case CSSValueTranslateY: | |
5766 m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent; | |
5767 break; | |
5768 case CSSValueTranslateZ: | |
5769 m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent; | |
5770 break; | |
5771 case CSSValuePerspective: | |
5772 m_unit = CSSPropertyParser::FNumber; | |
5773 break; | |
5774 case CSSValueTranslate3d: | |
5775 m_unit = CSSPropertyParser::FLength | CSSPropertyParser::FPercent; | |
5776 m_argCount = 5; | |
5777 break; | |
5778 default: | |
5779 m_validID = false; | |
5780 break; | |
5781 } | |
5782 } | |
5783 | |
5784 bool validID() const { return m_validID; } | |
5785 unsigned argCount() const { return m_argCount; } | |
5786 CSSPropertyParser::Units unit() const { return m_unit; } | |
5787 | |
5788 bool hasCorrectArgCount(unsigned argCount) { return m_argCount == argCount |
| (m_allowSingleArgument && argCount == 1); } | |
5789 | |
5790 private: | |
5791 bool m_validID; | |
5792 bool m_allowSingleArgument; | |
5793 unsigned m_argCount; | |
5794 CSSPropertyParser::Units m_unit; | |
5795 }; | |
5796 | |
5797 PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseTransform(bool useL
egacyParsing) | |
5798 { | |
5799 if (!m_valueList) | |
5800 return nullptr; | |
5801 | |
5802 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
5803 for (CSSParserValue* value = m_valueList->current(); value; value = m_valueL
ist->next()) { | |
5804 RefPtrWillBeRawPtr<CSSValue> parsedTransformValue = parseTransformValue(
useLegacyParsing, value); | |
5805 if (!parsedTransformValue) | |
5806 return nullptr; | |
5807 | |
5808 list->append(parsedTransformValue.release()); | |
5809 } | |
5810 | |
5811 return list.release(); | |
5812 } | |
5813 | |
5814 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseTransformValue(bool use
LegacyParsing, CSSParserValue *value) | |
5815 { | |
5816 if (value->m_unit != CSSParserValue::Function || !value->function) | |
5817 return nullptr; | |
5818 | |
5819 // Every primitive requires at least one argument. | |
5820 CSSParserValueList* args = value->function->args.get(); | |
5821 if (!args) | |
5822 return nullptr; | |
5823 | |
5824 // See if the specified primitive is one we understand. | |
5825 CSSValueID type = value->function->id; | |
5826 TransformOperationInfo info(type); | |
5827 if (!info.validID()) | |
5828 return nullptr; | |
5829 | |
5830 if (!info.hasCorrectArgCount(args->size())) | |
5831 return nullptr; | |
5832 | |
5833 // The transform is a list of functional primitives that specify transform o
perations. | |
5834 // We collect a list of CSSFunctionValues, where each value specifies a sing
le operation. | |
5835 | |
5836 // Create the new CSSFunctionValue for this operation and add it to our list
. | |
5837 RefPtrWillBeRawPtr<CSSFunctionValue> transformValue = CSSFunctionValue::crea
te(type); | |
5838 | |
5839 // Snag our values. | |
5840 CSSParserValue* a = args->current(); | |
5841 unsigned argNumber = 0; | |
5842 while (a) { | |
5843 CSSPropertyParser::Units unit = info.unit(); | |
5844 | |
5845 if (type == CSSValueRotate3d && argNumber == 3) { | |
5846 // 4th param of rotate3d() is an angle rather than a bare number, va
lidate it as such | |
5847 if (!validUnit(a, FAngle, HTMLStandardMode)) | |
5848 return nullptr; | |
5849 } else if (type == CSSValueTranslate3d && argNumber == 2) { | |
5850 // 3rd param of translate3d() cannot be a percentage | |
5851 if (!validUnit(a, FLength, HTMLStandardMode)) | |
5852 return nullptr; | |
5853 } else if (type == CSSValueTranslateZ && !argNumber) { | |
5854 // 1st param of translateZ() cannot be a percentage | |
5855 if (!validUnit(a, FLength, HTMLStandardMode)) | |
5856 return nullptr; | |
5857 } else if (type == CSSValuePerspective && !argNumber) { | |
5858 // 1st param of perspective() must be a non-negative number (depreca
ted) or length. | |
5859 if (!validUnit(a, FLength | FNonNeg, HTMLStandardMode)) { | |
5860 if (useLegacyParsing && validUnit(a, FNumber | FNonNeg, HTMLStan
dardMode)) { | |
5861 a->setUnit(CSSPrimitiveValue::UnitType::Pixels); | |
5862 } else { | |
5863 return nullptr; | |
5864 } | |
5865 } | |
5866 } else if (!validUnit(a, unit, HTMLStandardMode)) { | |
5867 return nullptr; | |
5868 } | |
5869 | |
5870 // Add the value to the current transform operation. | |
5871 transformValue->append(createPrimitiveNumericValue(a)); | |
5872 | |
5873 a = args->next(); | |
5874 if (!a) | |
5875 break; | |
5876 if (!isComma(a)) | |
5877 return nullptr; | |
5878 a = args->next(); | |
5879 | |
5880 argNumber++; | |
5881 } | |
5882 | |
5883 return transformValue.release(); | |
5884 } | |
5885 | |
5886 } // namespace blink | 5690 } // namespace blink |
OLD | NEW |