Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp

Issue 1843773003: Move the grid-template shorthand into CSSPropertyParser (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
(...skipping 3097 matching lines...) Expand 10 before | Expand all | Expand 10 after
3108 return consumeIdent(range); 3108 return consumeIdent(range);
3109 if (token.type() == DimensionToken && token.unitType() == CSSPrimitiveVa lue::UnitType::Fraction) { 3109 if (token.type() == DimensionToken && token.unitType() == CSSPrimitiveVa lue::UnitType::Fraction) {
3110 if (range.peek().numericValue() < 0) 3110 if (range.peek().numericValue() < 0)
3111 return nullptr; 3111 return nullptr;
3112 return cssValuePool().createValue(range.consumeIncludingWhitespace() .numericValue(), CSSPrimitiveValue::UnitType::Fraction); 3112 return cssValuePool().createValue(range.consumeIncludingWhitespace() .numericValue(), CSSPrimitiveValue::UnitType::Fraction);
3113 } 3113 }
3114 } 3114 }
3115 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, U nitlessQuirk::Allow); 3115 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, U nitlessQuirk::Allow);
3116 } 3116 }
3117 3117
3118 // TODO(rob.buis): consider adding boolean parameter to disallow <auto-track-lis t> if we keep supporing grid-template.
Timothy Loh 2016/04/11 03:27:32 In any case, this is going to be used by the grid
3118 static CSSValue* consumeGridTrackSize(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackSizeRestriction restriction = AllowAll) 3119 static CSSValue* consumeGridTrackSize(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackSizeRestriction restriction = AllowAll)
3119 { 3120 {
3120 const CSSParserToken& token = range.peek(); 3121 const CSSParserToken& token = range.peek();
3121 if (restriction == AllowAll && identMatches<CSSValueAuto>(token.id())) 3122 if (restriction == AllowAll && identMatches<CSSValueAuto>(token.id()))
3122 return consumeIdent(range); 3123 return consumeIdent(range);
3123 3124
3124 if (token.functionId() == CSSValueMinmax) { 3125 if (token.functionId() == CSSValueMinmax) {
3125 CSSParserTokenRange rangeCopy = range; 3126 CSSParserTokenRange rangeCopy = range;
3126 CSSParserTokenRange args = consumeFunction(rangeCopy); 3127 CSSParserTokenRange args = consumeFunction(rangeCopy);
3127 CSSPrimitiveValue* minTrackBreadth = consumeGridBreadth(args, cssParserM ode, restriction); 3128 CSSPrimitiveValue* minTrackBreadth = consumeGridBreadth(args, cssParserM ode, restriction);
3128 if (!minTrackBreadth || !consumeCommaIncludingWhitespace(args)) 3129 if (!minTrackBreadth || !consumeCommaIncludingWhitespace(args))
3129 return nullptr; 3130 return nullptr;
3130 CSSPrimitiveValue* maxTrackBreadth = consumeGridBreadth(args, cssParserM ode); 3131 CSSPrimitiveValue* maxTrackBreadth = consumeGridBreadth(args, cssParserM ode);
3131 if (!maxTrackBreadth || !args.atEnd()) 3132 if (!maxTrackBreadth || !args.atEnd())
3132 return nullptr; 3133 return nullptr;
3133 range = rangeCopy; 3134 range = rangeCopy;
3134 CSSFunctionValue* result = CSSFunctionValue::create(CSSValueMinmax); 3135 CSSFunctionValue* result = CSSFunctionValue::create(CSSValueMinmax);
3135 result->append(minTrackBreadth); 3136 result->append(minTrackBreadth);
3136 result->append(maxTrackBreadth); 3137 result->append(maxTrackBreadth);
3137 return result; 3138 return result;
3138 } 3139 }
3139 return consumeGridBreadth(range, cssParserMode, restriction); 3140 return consumeGridBreadth(range, cssParserMode, restriction);
3140 } 3141 }
3141 3142
3142 static CSSGridLineNamesValue* consumeGridLineNames(CSSParserTokenRange& range) 3143 // Appends to the passed in CSSGridLineNamesValue if any, otherwise creates a ne w one.
3144 static CSSGridLineNamesValue* consumeGridLineNames(CSSParserTokenRange& range, C SSGridLineNamesValue* lineNames = nullptr)
3143 { 3145 {
3144 CSSParserTokenRange rangeCopy = range; 3146 CSSParserTokenRange rangeCopy = range;
3145 if (rangeCopy.consumeIncludingWhitespace().type() != LeftBracketToken) 3147 if (rangeCopy.consumeIncludingWhitespace().type() != LeftBracketToken)
3146 return nullptr; 3148 return nullptr;
3147 CSSGridLineNamesValue* lineNames = CSSGridLineNamesValue::create(); 3149 if (!lineNames)
3150 lineNames = CSSGridLineNamesValue::create();
3148 while (CSSCustomIdentValue* lineName = consumeCustomIdentForGridLine(rangeCo py)) 3151 while (CSSCustomIdentValue* lineName = consumeCustomIdentForGridLine(rangeCo py))
3149 lineNames->append(lineName); 3152 lineNames->append(lineName);
3150 if (rangeCopy.consumeIncludingWhitespace().type() != RightBracketToken) 3153 if (rangeCopy.consumeIncludingWhitespace().type() != RightBracketToken)
3151 return nullptr; 3154 return nullptr;
3152 range = rangeCopy; 3155 range = rangeCopy;
3153 return lineNames; 3156 return lineNames;
3154 } 3157 }
3155 3158
3156 static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParser Mode cssParserMode, CSSValueList& list, bool& isAutoRepeat) 3159 static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParser Mode cssParserMode, CSSValueList& list, bool& isAutoRepeat)
3157 { 3160 {
(...skipping 1314 matching lines...) Expand 10 before | Expand all | Expand 10 after
4472 if (!columnEndValue) 4475 if (!columnEndValue)
4473 columnEndValue = columnStartValue->isCustomIdentValue() ? columnStartVal ue : cssValuePool().createIdentifierValue(CSSValueAuto); 4476 columnEndValue = columnStartValue->isCustomIdentValue() ? columnStartVal ue : cssValuePool().createIdentifierValue(CSSValueAuto);
4474 4477
4475 addProperty(CSSPropertyGridRowStart, rowStartValue, important); 4478 addProperty(CSSPropertyGridRowStart, rowStartValue, important);
4476 addProperty(CSSPropertyGridColumnStart, columnStartValue, important); 4479 addProperty(CSSPropertyGridColumnStart, columnStartValue, important);
4477 addProperty(CSSPropertyGridRowEnd, rowEndValue, important); 4480 addProperty(CSSPropertyGridRowEnd, rowEndValue, important);
4478 addProperty(CSSPropertyGridColumnEnd, columnEndValue, important); 4481 addProperty(CSSPropertyGridColumnEnd, columnEndValue, important);
4479 return true; 4482 return true;
4480 } 4483 }
4481 4484
4485 bool CSSPropertyParser::consumeGridTemplateRowsAndAreasAndColumns(bool important )
4486 {
4487 NamedGridAreaMap gridAreaMap;
4488 size_t rowCount = 0;
4489 size_t columnCount = 0;
4490 RawPtr<CSSValueList> templateRows = CSSValueList::createSpaceSeparated();
4491
4492 // Persists between loop iterations so we can use the same value for
4493 // consecutive <line-names> values
4494 CSSGridLineNamesValue* lineNames = nullptr;
4495
4496 do {
4497 // Handle leading <custom-ident>*.
4498 bool hasPreviousLineNames = lineNames;
4499 lineNames = consumeGridLineNames(m_range, lineNames);
4500 if (lineNames && !hasPreviousLineNames)
4501 templateRows->append(lineNames);
4502
4503 // Handle a template-area's row.
4504 if (m_range.peek().type() != StringToken || !parseGridTemplateAreasRow(m _range.consumeIncludingWhitespace().value(), gridAreaMap, rowCount, columnCount) )
4505 return false;
4506 ++rowCount;
4507
4508 // Handle template-rows's track-size.
4509 RawPtr<CSSValue> value = consumeGridTrackSize(m_range, m_context.mode()) ;
4510 if (!value)
4511 value = cssValuePool().createIdentifierValue(CSSValueAuto);
4512 templateRows->append(value.release());
4513
4514 // This will handle the trailing/leading <custom-ident>* in the grammar.
4515 lineNames = consumeGridLineNames(m_range);
4516 if (lineNames)
4517 templateRows->append(lineNames);
4518 } while (!m_range.atEnd() && !(m_range.peek().type() == DelimiterToken && m_ range.peek().delimiter() == '/'));
4519
4520 RawPtr<CSSValue> columnsValue = nullptr;
4521 if (!m_range.atEnd()) {
4522 if (!consumeSlashIncludingWhitespace(m_range))
4523 return false;
4524 columnsValue = consumeGridTrackList(m_range, m_context.mode());
4525 if (!columnsValue || !m_range.atEnd())
4526 return false;
4527 } else {
4528 columnsValue = cssValuePool().createIdentifierValue(CSSValueNone);
4529 }
4530 addProperty(CSSPropertyGridTemplateRows, templateRows.release(), important);
4531 addProperty(CSSPropertyGridTemplateColumns, columnsValue.release(), importan t);
4532 addProperty(CSSPropertyGridTemplateAreas, CSSGridTemplateAreasValue::create( gridAreaMap, rowCount, columnCount), important);
4533 return true;
4534 }
4535
4536 bool CSSPropertyParser::consumeGridTemplateShorthand(bool important)
4537 {
4538 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
4539 ASSERT(gridTemplateShorthand().length() == 3);
4540
4541 CSSParserTokenRange rangeCopy = m_range;
4542 RawPtr<CSSValue> rowsValue = consumeIdent<CSSValueNone>(m_range);
4543
4544 // 1- 'none' case.
4545 if (rowsValue && m_range.atEnd()) {
4546 addProperty(CSSPropertyGridTemplateRows, cssValuePool().createIdentifier Value(CSSValueNone), important);
4547 addProperty(CSSPropertyGridTemplateColumns, cssValuePool().createIdentif ierValue(CSSValueNone), important);
4548 addProperty(CSSPropertyGridTemplateAreas, cssValuePool().createIdentifie rValue(CSSValueNone), important);
4549 return true;
4550 }
4551
4552 // 2- <grid-template-rows> / <grid-template-columns>
4553 if (!rowsValue)
4554 rowsValue = consumeGridTrackList(m_range, m_context.mode());
4555
4556 if (rowsValue) {
4557 if (!consumeSlashIncludingWhitespace(m_range))
4558 return false;
4559 RawPtr<CSSValue> columnsValue = consumeGridTemplatesRowsOrColumns(m_rang e, m_context.mode());
4560 if (!columnsValue || !m_range.atEnd())
4561 return false;
4562
4563 addProperty(CSSPropertyGridTemplateRows, rowsValue.release(), important) ;
4564 addProperty(CSSPropertyGridTemplateColumns, columnsValue.release(), impo rtant);
4565 addProperty(CSSPropertyGridTemplateAreas, cssValuePool().createIdentifie rValue(CSSValueNone), important);
4566 return true;
4567 }
4568
4569 // 3- [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <track-lis t> ]?
4570 m_range = rangeCopy;
4571 return consumeGridTemplateRowsAndAreasAndColumns(important);
4572 }
4573
4482 bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im portant) 4574 bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im portant)
4483 { 4575 {
4484 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); 4576 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
4485 4577
4486 CSSPropertyID oldShorthand = m_currentShorthand; 4578 CSSPropertyID oldShorthand = m_currentShorthand;
4487 // TODO(rob.buis): Remove this when the legacy property parser is gone 4579 // TODO(rob.buis): Remove this when the legacy property parser is gone
4488 m_currentShorthand = property; 4580 m_currentShorthand = property;
4489 switch (property) { 4581 switch (property) {
4490 case CSSPropertyWebkitMarginCollapse: { 4582 case CSSPropertyWebkitMarginCollapse: {
4491 CSSValueID id = m_range.consumeIncludingWhitespace().id(); 4583 CSSValueID id = m_range.consumeIncludingWhitespace().id();
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
4654 columnGap = rowGap; 4746 columnGap = rowGap;
4655 addProperty(CSSPropertyGridRowGap, rowGap, important); 4747 addProperty(CSSPropertyGridRowGap, rowGap, important);
4656 addProperty(CSSPropertyGridColumnGap, columnGap, important); 4748 addProperty(CSSPropertyGridColumnGap, columnGap, important);
4657 return true; 4749 return true;
4658 } 4750 }
4659 case CSSPropertyGridColumn: 4751 case CSSPropertyGridColumn:
4660 case CSSPropertyGridRow: 4752 case CSSPropertyGridRow:
4661 return consumeGridItemPositionShorthand(property, important); 4753 return consumeGridItemPositionShorthand(property, important);
4662 case CSSPropertyGridArea: 4754 case CSSPropertyGridArea:
4663 return consumeGridAreaShorthand(important); 4755 return consumeGridAreaShorthand(important);
4756 case CSSPropertyGridTemplate:
4757 return consumeGridTemplateShorthand(important);
4664 default: 4758 default:
4665 m_currentShorthand = oldShorthand; 4759 m_currentShorthand = oldShorthand;
4666 CSSParserValueList valueList(m_range); 4760 CSSParserValueList valueList(m_range);
4667 if (!valueList.size()) 4761 if (!valueList.size())
4668 return false; 4762 return false;
4669 m_valueList = &valueList; 4763 m_valueList = &valueList;
4670 return legacyParseShorthand(unresolvedProperty, important); 4764 return legacyParseShorthand(unresolvedProperty, important);
4671 } 4765 }
4672 } 4766 }
4673 4767
4674 } // namespace blink 4768 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698