OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/css/parser/CSSParserFastPaths.h" | 5 #include "core/css/parser/CSSParserFastPaths.h" |
6 | 6 |
7 #include "core/StylePropertyShorthand.h" | 7 #include "core/StylePropertyShorthand.h" |
8 #include "core/css/CSSColorValue.h" | 8 #include "core/css/CSSColorValue.h" |
9 #include "core/css/CSSFunctionValue.h" | 9 #include "core/css/CSSFunctionValue.h" |
10 #include "core/css/CSSIdentifierValue.h" | 10 #include "core/css/CSSIdentifierValue.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 if (!ok) | 98 if (!ok) |
99 return false; | 99 return false; |
100 number = clampTo<double>(number, -std::numeric_limits<float>::max(), | 100 number = clampTo<double>(number, -std::numeric_limits<float>::max(), |
101 std::numeric_limits<float>::max()); | 101 std::numeric_limits<float>::max()); |
102 return true; | 102 return true; |
103 } | 103 } |
104 | 104 |
105 static CSSValue* parseSimpleLengthValue(CSSPropertyID propertyId, | 105 static CSSValue* parseSimpleLengthValue(CSSPropertyID propertyId, |
106 const String& string, | 106 const String& string, |
107 CSSParserMode cssParserMode) { | 107 CSSParserMode cssParserMode) { |
108 ASSERT(!string.isEmpty()); | 108 DCHECK(!string.isEmpty()); |
109 bool acceptsNegativeNumbers = false; | 109 bool acceptsNegativeNumbers = false; |
110 | 110 |
111 // In @viewport, width and height are shorthands, not simple length values. | 111 // In @viewport, width and height are shorthands, not simple length values. |
112 if (isCSSViewportParsingEnabledForMode(cssParserMode) || | 112 if (isCSSViewportParsingEnabledForMode(cssParserMode) || |
113 !isSimpleLengthPropertyID(propertyId, acceptsNegativeNumbers)) | 113 !isSimpleLengthPropertyID(propertyId, acceptsNegativeNumbers)) |
114 return nullptr; | 114 return nullptr; |
115 | 115 |
116 unsigned length = string.length(); | 116 unsigned length = string.length(); |
117 double number; | 117 double number; |
118 CSSPrimitiveValue::UnitType unit = CSSPrimitiveValue::UnitType::Number; | 118 CSSPrimitiveValue::UnitType unit = CSSPrimitiveValue::UnitType::Number; |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 return false; | 465 return false; |
466 rgb = makeRGB(red, green, blue); | 466 rgb = makeRGB(red, green, blue); |
467 return true; | 467 return true; |
468 } | 468 } |
469 | 469 |
470 return false; | 470 return false; |
471 } | 471 } |
472 | 472 |
473 CSSValue* CSSParserFastPaths::parseColor(const String& string, | 473 CSSValue* CSSParserFastPaths::parseColor(const String& string, |
474 CSSParserMode parserMode) { | 474 CSSParserMode parserMode) { |
475 ASSERT(!string.isEmpty()); | 475 DCHECK(!string.isEmpty()); |
476 CSSValueID valueID = cssValueKeywordID(string); | 476 CSSValueID valueID = cssValueKeywordID(string); |
477 if (StyleColor::isColorKeyword(valueID)) { | 477 if (StyleColor::isColorKeyword(valueID)) { |
478 if (!isValueAllowedInMode(valueID, parserMode)) | 478 if (!isValueAllowedInMode(valueID, parserMode)) |
479 return nullptr; | 479 return nullptr; |
480 return CSSIdentifierValue::create(valueID); | 480 return CSSIdentifierValue::create(valueID); |
481 } | 481 } |
482 | 482 |
483 RGBA32 color; | 483 RGBA32 color; |
484 bool quirksMode = isQuirksModeBehavior(parserMode); | 484 bool quirksMode = isQuirksModeBehavior(parserMode); |
485 | 485 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 case CSSPropertyPosition: | 626 case CSSPropertyPosition: |
627 return valueID == CSSValueStatic || valueID == CSSValueRelative || | 627 return valueID == CSSValueStatic || valueID == CSSValueRelative || |
628 valueID == CSSValueAbsolute || valueID == CSSValueFixed || | 628 valueID == CSSValueAbsolute || valueID == CSSValueFixed || |
629 (RuntimeEnabledFeatures::cssStickyPositionEnabled() && | 629 (RuntimeEnabledFeatures::cssStickyPositionEnabled() && |
630 valueID == CSSValueSticky); | 630 valueID == CSSValueSticky); |
631 case CSSPropertyResize: | 631 case CSSPropertyResize: |
632 return valueID == CSSValueNone || valueID == CSSValueBoth || | 632 return valueID == CSSValueNone || valueID == CSSValueBoth || |
633 valueID == CSSValueHorizontal || valueID == CSSValueVertical || | 633 valueID == CSSValueHorizontal || valueID == CSSValueVertical || |
634 valueID == CSSValueAuto; | 634 valueID == CSSValueAuto; |
635 case CSSPropertyScrollBehavior: | 635 case CSSPropertyScrollBehavior: |
636 ASSERT(RuntimeEnabledFeatures::cssomSmoothScrollEnabled()); | 636 DCHECK(RuntimeEnabledFeatures::cssomSmoothScrollEnabled()); |
637 return valueID == CSSValueAuto || valueID == CSSValueSmooth; | 637 return valueID == CSSValueAuto || valueID == CSSValueSmooth; |
638 case CSSPropertyShapeRendering: | 638 case CSSPropertyShapeRendering: |
639 return valueID == CSSValueAuto || valueID == CSSValueOptimizeSpeed || | 639 return valueID == CSSValueAuto || valueID == CSSValueOptimizeSpeed || |
640 valueID == CSSValueCrispEdges || | 640 valueID == CSSValueCrispEdges || |
641 valueID == CSSValueGeometricPrecision; | 641 valueID == CSSValueGeometricPrecision; |
642 case CSSPropertySpeak: | 642 case CSSPropertySpeak: |
643 return valueID == CSSValueNone || valueID == CSSValueNormal || | 643 return valueID == CSSValueNone || valueID == CSSValueNormal || |
644 valueID == CSSValueSpellOut || valueID == CSSValueDigits || | 644 valueID == CSSValueSpellOut || valueID == CSSValueDigits || |
645 valueID == CSSValueLiteralPunctuation || | 645 valueID == CSSValueLiteralPunctuation || |
646 valueID == CSSValueNoPunctuation; | 646 valueID == CSSValueNoPunctuation; |
(...skipping 12 matching lines...) Expand all Loading... |
659 case CSSPropertyTextAlignLast: | 659 case CSSPropertyTextAlignLast: |
660 return (valueID >= CSSValueLeft && valueID <= CSSValueJustify) || | 660 return (valueID >= CSSValueLeft && valueID <= CSSValueJustify) || |
661 valueID == CSSValueStart || valueID == CSSValueEnd || | 661 valueID == CSSValueStart || valueID == CSSValueEnd || |
662 valueID == CSSValueAuto; | 662 valueID == CSSValueAuto; |
663 case CSSPropertyTextAnchor: | 663 case CSSPropertyTextAnchor: |
664 return valueID == CSSValueStart || valueID == CSSValueMiddle || | 664 return valueID == CSSValueStart || valueID == CSSValueMiddle || |
665 valueID == CSSValueEnd; | 665 valueID == CSSValueEnd; |
666 case CSSPropertyTextCombineUpright: | 666 case CSSPropertyTextCombineUpright: |
667 return valueID == CSSValueNone || valueID == CSSValueAll; | 667 return valueID == CSSValueNone || valueID == CSSValueAll; |
668 case CSSPropertyTextDecorationStyle: | 668 case CSSPropertyTextDecorationStyle: |
669 ASSERT(RuntimeEnabledFeatures::css3TextDecorationsEnabled()); | 669 DCHECK(RuntimeEnabledFeatures::css3TextDecorationsEnabled()); |
670 return valueID == CSSValueSolid || valueID == CSSValueDouble || | 670 return valueID == CSSValueSolid || valueID == CSSValueDouble || |
671 valueID == CSSValueDotted || valueID == CSSValueDashed || | 671 valueID == CSSValueDotted || valueID == CSSValueDashed || |
672 valueID == CSSValueWavy; | 672 valueID == CSSValueWavy; |
673 case CSSPropertyTextJustify: | 673 case CSSPropertyTextJustify: |
674 ASSERT(RuntimeEnabledFeatures::css3TextEnabled()); | 674 DCHECK(RuntimeEnabledFeatures::css3TextEnabled()); |
675 return valueID == CSSValueInterWord || valueID == CSSValueDistribute || | 675 return valueID == CSSValueInterWord || valueID == CSSValueDistribute || |
676 valueID == CSSValueAuto || valueID == CSSValueNone; | 676 valueID == CSSValueAuto || valueID == CSSValueNone; |
677 case CSSPropertyTextOrientation: | 677 case CSSPropertyTextOrientation: |
678 return valueID == CSSValueMixed || valueID == CSSValueUpright || | 678 return valueID == CSSValueMixed || valueID == CSSValueUpright || |
679 valueID == CSSValueSideways || valueID == CSSValueSidewaysRight; | 679 valueID == CSSValueSideways || valueID == CSSValueSidewaysRight; |
680 case CSSPropertyWebkitTextOrientation: | 680 case CSSPropertyWebkitTextOrientation: |
681 return valueID == CSSValueSideways || valueID == CSSValueSidewaysRight || | 681 return valueID == CSSValueSideways || valueID == CSSValueSidewaysRight || |
682 valueID == CSSValueVerticalRight || valueID == CSSValueUpright; | 682 valueID == CSSValueVerticalRight || valueID == CSSValueUpright; |
683 case CSSPropertyTextOverflow: | 683 case CSSPropertyTextOverflow: |
684 return valueID == CSSValueClip || valueID == CSSValueEllipsis; | 684 return valueID == CSSValueClip || valueID == CSSValueEllipsis; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
824 valueID == CSSValueLr || valueID == CSSValueRl || | 824 valueID == CSSValueLr || valueID == CSSValueRl || |
825 valueID == CSSValueTb; | 825 valueID == CSSValueTb; |
826 case CSSPropertyWhiteSpace: | 826 case CSSPropertyWhiteSpace: |
827 return valueID == CSSValueNormal || valueID == CSSValuePre || | 827 return valueID == CSSValueNormal || valueID == CSSValuePre || |
828 valueID == CSSValuePreWrap || valueID == CSSValuePreLine || | 828 valueID == CSSValuePreWrap || valueID == CSSValuePreLine || |
829 valueID == CSSValueNowrap; | 829 valueID == CSSValueNowrap; |
830 case CSSPropertyWordBreak: | 830 case CSSPropertyWordBreak: |
831 return valueID == CSSValueNormal || valueID == CSSValueBreakAll || | 831 return valueID == CSSValueNormal || valueID == CSSValueBreakAll || |
832 valueID == CSSValueKeepAll || valueID == CSSValueBreakWord; | 832 valueID == CSSValueKeepAll || valueID == CSSValueBreakWord; |
833 case CSSPropertyScrollSnapType: | 833 case CSSPropertyScrollSnapType: |
834 ASSERT(RuntimeEnabledFeatures::cssScrollSnapPointsEnabled()); | 834 DCHECK(RuntimeEnabledFeatures::cssScrollSnapPointsEnabled()); |
835 return valueID == CSSValueNone || valueID == CSSValueMandatory || | 835 return valueID == CSSValueNone || valueID == CSSValueMandatory || |
836 valueID == CSSValueProximity; | 836 valueID == CSSValueProximity; |
837 default: | 837 default: |
838 ASSERT_NOT_REACHED(); | 838 NOTREACHED(); |
839 return false; | 839 return false; |
840 } | 840 } |
841 } | 841 } |
842 | 842 |
843 bool CSSParserFastPaths::isKeywordPropertyID(CSSPropertyID propertyId) { | 843 bool CSSParserFastPaths::isKeywordPropertyID(CSSPropertyID propertyId) { |
844 switch (propertyId) { | 844 switch (propertyId) { |
845 case CSSPropertyAlignmentBaseline: | 845 case CSSPropertyAlignmentBaseline: |
846 case CSSPropertyAll: | 846 case CSSPropertyAll: |
847 case CSSPropertyMixBlendMode: | 847 case CSSPropertyMixBlendMode: |
848 case CSSPropertyIsolation: | 848 case CSSPropertyIsolation: |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 case CSSPropertyAlignSelf: | 953 case CSSPropertyAlignSelf: |
954 return !RuntimeEnabledFeatures::cssGridLayoutEnabled(); | 954 return !RuntimeEnabledFeatures::cssGridLayoutEnabled(); |
955 default: | 955 default: |
956 return false; | 956 return false; |
957 } | 957 } |
958 } | 958 } |
959 | 959 |
960 static CSSValue* parseKeywordValue(CSSPropertyID propertyId, | 960 static CSSValue* parseKeywordValue(CSSPropertyID propertyId, |
961 const String& string, | 961 const String& string, |
962 CSSParserMode parserMode) { | 962 CSSParserMode parserMode) { |
963 ASSERT(!string.isEmpty()); | 963 DCHECK(!string.isEmpty()); |
964 | 964 |
965 if (!CSSParserFastPaths::isKeywordPropertyID(propertyId)) { | 965 if (!CSSParserFastPaths::isKeywordPropertyID(propertyId)) { |
966 // All properties accept the values of "initial" and "inherit". | 966 // All properties accept the values of "initial" and "inherit". |
967 if (!equalIgnoringASCIICase(string, "initial") && | 967 if (!equalIgnoringASCIICase(string, "initial") && |
968 !equalIgnoringASCIICase(string, "inherit")) | 968 !equalIgnoringASCIICase(string, "inherit")) |
969 return nullptr; | 969 return nullptr; |
970 | 970 |
971 // Parse initial/inherit shorthands using the CSSPropertyParser. | 971 // Parse initial/inherit shorthands using the CSSPropertyParser. |
972 if (shorthandForProperty(propertyId).length()) | 972 if (shorthandForProperty(propertyId).length()) |
973 return nullptr; | 973 return nullptr; |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 return nullptr; | 1184 return nullptr; |
1185 if (!transformList) | 1185 if (!transformList) |
1186 transformList = CSSValueList::createSpaceSeparated(); | 1186 transformList = CSSValueList::createSpaceSeparated(); |
1187 transformList->append(*transformValue); | 1187 transformList->append(*transformValue); |
1188 } | 1188 } |
1189 return transformList; | 1189 return transformList; |
1190 } | 1190 } |
1191 | 1191 |
1192 static CSSValue* parseSimpleTransform(CSSPropertyID propertyID, | 1192 static CSSValue* parseSimpleTransform(CSSPropertyID propertyID, |
1193 const String& string) { | 1193 const String& string) { |
1194 ASSERT(!string.isEmpty()); | 1194 DCHECK(!string.isEmpty()); |
1195 | 1195 |
1196 if (propertyID != CSSPropertyTransform) | 1196 if (propertyID != CSSPropertyTransform) |
1197 return nullptr; | 1197 return nullptr; |
1198 if (string.is8Bit()) | 1198 if (string.is8Bit()) |
1199 return parseSimpleTransformList(string.characters8(), string.length()); | 1199 return parseSimpleTransformList(string.characters8(), string.length()); |
1200 return parseSimpleTransformList(string.characters16(), string.length()); | 1200 return parseSimpleTransformList(string.characters16(), string.length()); |
1201 } | 1201 } |
1202 | 1202 |
1203 CSSValue* CSSParserFastPaths::maybeParseValue(CSSPropertyID propertyID, | 1203 CSSValue* CSSParserFastPaths::maybeParseValue(CSSPropertyID propertyID, |
1204 const String& string, | 1204 const String& string, |
1205 CSSParserMode parserMode) { | 1205 CSSParserMode parserMode) { |
1206 if (CSSValue* length = parseSimpleLengthValue(propertyID, string, parserMode)) | 1206 if (CSSValue* length = parseSimpleLengthValue(propertyID, string, parserMode)) |
1207 return length; | 1207 return length; |
1208 if (isColorPropertyID(propertyID)) | 1208 if (isColorPropertyID(propertyID)) |
1209 return parseColor(string, parserMode); | 1209 return parseColor(string, parserMode); |
1210 if (CSSValue* keyword = parseKeywordValue(propertyID, string, parserMode)) | 1210 if (CSSValue* keyword = parseKeywordValue(propertyID, string, parserMode)) |
1211 return keyword; | 1211 return keyword; |
1212 if (CSSValue* transform = parseSimpleTransform(propertyID, string)) | 1212 if (CSSValue* transform = parseSimpleTransform(propertyID, string)) |
1213 return transform; | 1213 return transform; |
1214 return nullptr; | 1214 return nullptr; |
1215 } | 1215 } |
1216 | 1216 |
1217 } // namespace blink | 1217 } // namespace blink |
OLD | NEW |