Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/CSSPropertyParser.h" | 5 #include "core/css/parser/CSSPropertyParser.h" |
| 6 | 6 |
| 7 #include "core/StylePropertyShorthand.h" | 7 #include "core/StylePropertyShorthand.h" |
| 8 #include "core/css/CSSBasicShapeValues.h" | 8 #include "core/css/CSSBasicShapeValues.h" |
| 9 #include "core/css/CSSBorderImage.h" | 9 #include "core/css/CSSBorderImage.h" |
| 10 #include "core/css/CSSContentDistributionValue.h" | 10 #include "core/css/CSSContentDistributionValue.h" |
| 11 #include "core/css/CSSCounterValue.h" | 11 #include "core/css/CSSCounterValue.h" |
| 12 #include "core/css/CSSCrossfadeValue.h" | 12 #include "core/css/CSSCrossfadeValue.h" |
| 13 #include "core/css/CSSCursorImageValue.h" | 13 #include "core/css/CSSCursorImageValue.h" |
| 14 #include "core/css/CSSCustomIdentValue.h" | 14 #include "core/css/CSSCustomIdentValue.h" |
| 15 #include "core/css/CSSFontFaceSrcValue.h" | 15 #include "core/css/CSSFontFaceSrcValue.h" |
| 16 #include "core/css/CSSFontFeatureValue.h" | 16 #include "core/css/CSSFontFeatureValue.h" |
| 17 #include "core/css/CSSFunctionValue.h" | 17 #include "core/css/CSSFunctionValue.h" |
| 18 #include "core/css/CSSGradientValue.h" | 18 #include "core/css/CSSGradientValue.h" |
| 19 #include "core/css/CSSGridAutoRepeatValue.h" | |
| 20 #include "core/css/CSSGridLineNamesValue.h" | |
| 19 #include "core/css/CSSImageSetValue.h" | 21 #include "core/css/CSSImageSetValue.h" |
| 20 #include "core/css/CSSPaintValue.h" | 22 #include "core/css/CSSPaintValue.h" |
| 21 #include "core/css/CSSPathValue.h" | 23 #include "core/css/CSSPathValue.h" |
| 22 #include "core/css/CSSPrimitiveValueMappings.h" | 24 #include "core/css/CSSPrimitiveValueMappings.h" |
| 23 #include "core/css/CSSQuadValue.h" | 25 #include "core/css/CSSQuadValue.h" |
| 24 #include "core/css/CSSReflectValue.h" | 26 #include "core/css/CSSReflectValue.h" |
| 25 #include "core/css/CSSSVGDocumentValue.h" | 27 #include "core/css/CSSSVGDocumentValue.h" |
| 26 #include "core/css/CSSShadowValue.h" | 28 #include "core/css/CSSShadowValue.h" |
| 27 #include "core/css/CSSStringValue.h" | 29 #include "core/css/CSSStringValue.h" |
| 28 #include "core/css/CSSTimingFunctionValue.h" | 30 #include "core/css/CSSTimingFunctionValue.h" |
| (...skipping 3066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3095 return nullptr; | 3097 return nullptr; |
| 3096 range = rangeCopy; | 3098 range = rangeCopy; |
| 3097 RefPtrWillBeRawPtr<CSSFunctionValue> result = CSSFunctionValue::create(C SSValueMinmax); | 3099 RefPtrWillBeRawPtr<CSSFunctionValue> result = CSSFunctionValue::create(C SSValueMinmax); |
| 3098 result->append(minTrackBreadth.release()); | 3100 result->append(minTrackBreadth.release()); |
| 3099 result->append(maxTrackBreadth.release()); | 3101 result->append(maxTrackBreadth.release()); |
| 3100 return result.release(); | 3102 return result.release(); |
| 3101 } | 3103 } |
| 3102 return consumeGridBreadth(range, cssParserMode, restriction); | 3104 return consumeGridBreadth(range, cssParserMode, restriction); |
| 3103 } | 3105 } |
| 3104 | 3106 |
| 3107 static PassRefPtrWillBeRawPtr<CSSGridLineNamesValue> consumeGridLineNames(CSSPar serTokenRange& range) | |
| 3108 { | |
| 3109 if (range.peek().type() != LeftBracketToken) | |
| 3110 return nullptr; | |
| 3111 CSSParserTokenRange rangeCopy = range; | |
| 3112 rangeCopy.consumeIncludingWhitespace(); // Skip '['. | |
|
Timothy Loh
2016/03/29 02:47:39
Not a fan of the two comments here, at least becau
rwlbuis
2016/03/29 21:15:51
Done.
| |
| 3113 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = CSSGridLineNamesValue: :create(); | |
| 3114 while (RefPtrWillBeRawPtr<CSSCustomIdentValue> lineName = consumeCustomIdent ForGridLine(rangeCopy)) | |
| 3115 lineNames->append(lineName.release()); | |
| 3116 if (rangeCopy.peek().type() != RightBracketToken) | |
| 3117 return nullptr; | |
| 3118 rangeCopy.consumeIncludingWhitespace(); // Consume ']'. | |
| 3119 range = rangeCopy; | |
| 3120 return lineNames.release(); | |
| 3121 } | |
| 3122 | |
| 3123 static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParser Mode cssParserMode, CSSValueList& list, bool& isAutoRepeat) | |
| 3124 { | |
| 3125 CSSParserTokenRange args = consumeFunction(range); | |
| 3126 // The number of repetitions for <auto-repeat> is not important at parsing l evel | |
| 3127 // because it will be computed later, let's set it to 1. | |
| 3128 size_t repetitions = 1; | |
| 3129 isAutoRepeat = identMatches<CSSValueAutoFill, CSSValueAutoFit>(args.peek().i d()); | |
| 3130 RefPtrWillBeRawPtr<CSSValueList> repeatedValues; | |
| 3131 if (isAutoRepeat) { | |
| 3132 repeatedValues = CSSGridAutoRepeatValue::create(args.consumeIncludingWhi tespace().id()); | |
| 3133 } else { | |
| 3134 if (args.peek().type() != NumberToken || args.peek().numericValueType() != IntegerValueType) | |
| 3135 return false; | |
| 3136 double repetition = args.consumeIncludingWhitespace().numericValue(); | |
| 3137 if (repetition < 1) | |
| 3138 return false; | |
| 3139 repetitions = clampTo<size_t>(repetition, 0, kGridMaxTracks); | |
| 3140 repeatedValues = CSSValueList::createSpaceSeparated(); | |
| 3141 } | |
| 3142 if (!consumeCommaIncludingWhitespace(args)) | |
| 3143 return false; | |
| 3144 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = consumeGridLineNames(a rgs); | |
| 3145 if (lineNames) | |
| 3146 repeatedValues->append(lineNames.release()); | |
| 3147 | |
| 3148 size_t numberOfTracks = 0; | |
| 3149 TrackSizeRestriction restriction = isAutoRepeat ? FixedSizeOnly : AllowAll; | |
| 3150 while (!args.atEnd()) { | |
| 3151 if (isAutoRepeat && numberOfTracks) | |
| 3152 return false; | |
| 3153 RefPtrWillBeRawPtr<CSSValue> trackSize = consumeGridTrackSize(args, cssP arserMode, restriction); | |
| 3154 if (!trackSize) | |
| 3155 return false; | |
| 3156 repeatedValues->append(trackSize.release()); | |
| 3157 ++numberOfTracks; | |
| 3158 lineNames = consumeGridLineNames(args); | |
| 3159 if (lineNames) | |
| 3160 repeatedValues->append(lineNames.release()); | |
| 3161 } | |
| 3162 // We should have found at least one <track-size> or else it is not a valid <track-list>. | |
| 3163 if (!numberOfTracks) | |
| 3164 return false; | |
| 3165 | |
| 3166 if (isAutoRepeat) { | |
| 3167 list.append(repeatedValues.release()); | |
| 3168 } else { | |
| 3169 // We clamp the repetitions to a multiple of the repeat() track list's s ize, while staying below the max grid size. | |
| 3170 repetitions = std::min(repetitions, kGridMaxTracks / numberOfTracks); | |
| 3171 for (size_t i = 0; i < repetitions; ++i) { | |
| 3172 for (size_t j = 0; j < repeatedValues->length(); ++j) | |
| 3173 list.append(repeatedValues->item(j)); | |
| 3174 } | |
| 3175 } | |
| 3176 return true; | |
| 3177 } | |
| 3178 | |
| 3179 static PassRefPtrWillBeRawPtr<CSSValue> consumeGridTrackList(CSSParserTokenRange & range, CSSParserMode cssParserMode) | |
| 3180 { | |
| 3181 if (range.peek().id() == CSSValueNone) | |
|
Timothy Loh
2016/03/29 02:47:39
I think you forgot to remove this from here since
rwlbuis
2016/03/29 21:15:50
Done.
| |
| 3182 return consumeIdent(range); | |
| 3183 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated (); | |
| 3184 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = consumeGridLineNames(r ange); | |
| 3185 if (lineNames) | |
| 3186 values->append(lineNames.release()); | |
| 3187 | |
| 3188 bool seenAutoRepeat = false; | |
| 3189 do { | |
|
Timothy Loh
2016/03/29 02:47:39
This allows <line-names> directly before <auto-rep
svillar
2016/03/29 08:27:36
That's right. If we specify <line-names> then ther
rwlbuis
2016/03/29 21:15:51
Done.
Timothy Loh
2016/03/30 00:15:39
Not sure the TODO is accurate, or I'm misunderstan
| |
| 3190 bool isAutoRepeat; | |
| 3191 if (range.peek().functionId() == CSSValueRepeat) { | |
| 3192 if (!consumeGridTrackRepeatFunction(range, cssParserMode, *values, i sAutoRepeat) || (isAutoRepeat && seenAutoRepeat)) | |
|
svillar
2016/03/29 08:27:36
I would prefer this to be in two different conditi
rwlbuis
2016/03/29 21:15:50
Done.
| |
| 3193 return nullptr; | |
| 3194 seenAutoRepeat = seenAutoRepeat || isAutoRepeat; | |
| 3195 } else if (RefPtrWillBeRawPtr<CSSValue> value = consumeGridTrackSize(ran ge, cssParserMode, seenAutoRepeat ? FixedSizeOnly : AllowAll)) { | |
| 3196 values->append(value.release()); | |
| 3197 } else { | |
| 3198 return nullptr; | |
| 3199 } | |
| 3200 lineNames = consumeGridLineNames(range); | |
| 3201 if (lineNames) | |
| 3202 values->append(lineNames.release()); | |
| 3203 } while (!range.atEnd() && range.peek().type() != DelimiterToken); | |
| 3204 // <auto-repeat> requires definite minimum track sizes in order to compute t he number of repetitions. | |
| 3205 // The above while loop detects those appearances after the <auto-repeat> bu t not the ones before. | |
| 3206 if (seenAutoRepeat && !allTracksAreFixedSized(*values)) | |
| 3207 return nullptr; | |
| 3208 return values.release(); | |
| 3209 } | |
| 3210 | |
| 3211 static PassRefPtrWillBeRawPtr<CSSValue> consumeGridTemplatesRowsOrColumns(CSSPar serTokenRange& range, CSSParserMode cssParserMode) | |
| 3212 { | |
| 3213 if (range.peek().id() == CSSValueNone) | |
| 3214 return consumeIdent(range); | |
| 3215 return consumeGridTrackList(range, cssParserMode); | |
| 3216 } | |
| 3217 | |
| 3105 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID unresolvedProperty) | 3218 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID unresolvedProperty) |
| 3106 { | 3219 { |
| 3107 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); | 3220 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
| 3108 if (CSSParserFastPaths::isKeywordPropertyID(property)) { | 3221 if (CSSParserFastPaths::isKeywordPropertyID(property)) { |
| 3109 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(property, m_rang e.peek().id())) | 3222 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(property, m_rang e.peek().id())) |
| 3110 return nullptr; | 3223 return nullptr; |
| 3111 return consumeIdent(m_range); | 3224 return consumeIdent(m_range); |
| 3112 } | 3225 } |
| 3113 switch (property) { | 3226 switch (property) { |
| 3114 case CSSPropertyWillChange: | 3227 case CSSPropertyWillChange: |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3467 case CSSPropertyGridColumnEnd: | 3580 case CSSPropertyGridColumnEnd: |
| 3468 case CSSPropertyGridColumnStart: | 3581 case CSSPropertyGridColumnStart: |
| 3469 case CSSPropertyGridRowEnd: | 3582 case CSSPropertyGridRowEnd: |
| 3470 case CSSPropertyGridRowStart: | 3583 case CSSPropertyGridRowStart: |
| 3471 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | 3584 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |
| 3472 return consumeGridLine(m_range); | 3585 return consumeGridLine(m_range); |
| 3473 case CSSPropertyGridAutoColumns: | 3586 case CSSPropertyGridAutoColumns: |
| 3474 case CSSPropertyGridAutoRows: | 3587 case CSSPropertyGridAutoRows: |
| 3475 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | 3588 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |
| 3476 return consumeGridTrackSize(m_range, m_context.mode()); | 3589 return consumeGridTrackSize(m_range, m_context.mode()); |
| 3590 case CSSPropertyGridTemplateColumns: | |
| 3591 case CSSPropertyGridTemplateRows: | |
| 3592 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | |
| 3593 return consumeGridTemplatesRowsOrColumns(m_range, m_context.mode()); | |
| 3477 default: | 3594 default: |
| 3478 CSSParserValueList valueList(m_range); | 3595 CSSParserValueList valueList(m_range); |
| 3479 if (valueList.size()) { | 3596 if (valueList.size()) { |
| 3480 m_valueList = &valueList; | 3597 m_valueList = &valueList; |
| 3481 if (RefPtrWillBeRawPtr<CSSValue> result = legacyParseValue(unresolve dProperty)) { | 3598 if (RefPtrWillBeRawPtr<CSSValue> result = legacyParseValue(unresolve dProperty)) { |
| 3482 while (!m_range.atEnd()) | 3599 while (!m_range.atEnd()) |
| 3483 m_range.consume(); | 3600 m_range.consume(); |
| 3484 return result.release(); | 3601 return result.release(); |
| 3485 } | 3602 } |
| 3486 } | 3603 } |
| (...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4480 m_currentShorthand = oldShorthand; | 4597 m_currentShorthand = oldShorthand; |
| 4481 CSSParserValueList valueList(m_range); | 4598 CSSParserValueList valueList(m_range); |
| 4482 if (!valueList.size()) | 4599 if (!valueList.size()) |
| 4483 return false; | 4600 return false; |
| 4484 m_valueList = &valueList; | 4601 m_valueList = &valueList; |
| 4485 return legacyParseShorthand(unresolvedProperty, important); | 4602 return legacyParseShorthand(unresolvedProperty, important); |
| 4486 } | 4603 } |
| 4487 } | 4604 } |
| 4488 | 4605 |
| 4489 } // namespace blink | 4606 } // namespace blink |
| OLD | NEW |