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

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

Issue 1168453002: [CSSGridLayout] Switch from parentheses to brackets for grid line names (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Patch for landing v2 Created 5 years, 6 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 /* 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 3064 matching lines...) Expand 10 before | Expand all | Expand 10 after
3075 break; 3075 break;
3076 if (!consumeComma(m_valueList) || !m_valueList->current()) 3076 if (!consumeComma(m_valueList) || !m_valueList->current())
3077 return nullptr; 3077 return nullptr;
3078 } 3078 }
3079 if (propId == CSSPropertyTransitionProperty && !isValidTransitionPropertyLis t(list.get())) 3079 if (propId == CSSPropertyTransitionProperty && !isValidTransitionPropertyLis t(list.get()))
3080 return nullptr; 3080 return nullptr;
3081 ASSERT(list->length()); 3081 ASSERT(list->length());
3082 return list.release(); 3082 return list.release();
3083 } 3083 }
3084 3084
3085 static inline bool isCSSWideKeyword(CSSParserValue& value) 3085 static inline bool isCSSWideKeyword(const CSSParserValue& value)
3086 { 3086 {
3087 return value.id == CSSValueInitial || value.id == CSSValueInherit || value.i d == CSSValueUnset || value.id == CSSValueDefault; 3087 return value.id == CSSValueInitial || value.id == CSSValueInherit || value.i d == CSSValueUnset || value.id == CSSValueDefault;
3088 } 3088 }
3089 3089
3090 static inline bool isValidCustomIdentForGridPositions(CSSParserValue& value) 3090 static inline bool isValidCustomIdentForGridPositions(const CSSParserValue& valu e)
3091 { 3091 {
3092 // FIXME: we need a more general solution for <custom-ident> in all properti es. 3092 // FIXME: we need a more general solution for <custom-ident> in all properti es.
3093 return value.unit == CSSPrimitiveValue::CSS_IDENT && value.id != CSSValueSpa n && value.id != CSSValueAuto && !isCSSWideKeyword(value); 3093 return value.unit == CSSPrimitiveValue::CSS_IDENT && value.id != CSSValueSpa n && value.id != CSSValueAuto && !isCSSWideKeyword(value);
3094 } 3094 }
3095 3095
3096 // The function parses [ <integer> || <custom-ident> ] in <grid-line> (which can be stand alone or with 'span'). 3096 // The function parses [ <integer> || <custom-ident> ] in <grid-line> (which can be stand alone or with 'span').
3097 bool CSSPropertyParser::parseIntegerOrCustomIdentFromGridPosition(RefPtrWillBeRa wPtr<CSSPrimitiveValue>& numericValue, RefPtrWillBeRawPtr<CSSPrimitiveValue>& gr idLineName) 3097 bool CSSPropertyParser::parseIntegerOrCustomIdentFromGridPosition(RefPtrWillBeRa wPtr<CSSPrimitiveValue>& numericValue, RefPtrWillBeRawPtr<CSSPrimitiveValue>& gr idLineName)
3098 { 3098 {
3099 CSSParserValue* value = m_valueList->current(); 3099 CSSParserValue* value = m_valueList->current();
3100 if (validUnit(value, FInteger) && value->fValue) { 3100 if (validUnit(value, FInteger) && value->fValue) {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
3221 size_t columnCount = 0; 3221 size_t columnCount = 0;
3222 bool trailingIdentWasAdded = false; 3222 bool trailingIdentWasAdded = false;
3223 RefPtrWillBeRawPtr<CSSValueList> templateRows = CSSValueList::createSpaceSep arated(); 3223 RefPtrWillBeRawPtr<CSSValueList> templateRows = CSSValueList::createSpaceSep arated();
3224 3224
3225 // At least template-areas strings must be defined. 3225 // At least template-areas strings must be defined.
3226 if (!m_valueList->current()) 3226 if (!m_valueList->current())
3227 return false; 3227 return false;
3228 3228
3229 while (m_valueList->current()) { 3229 while (m_valueList->current()) {
3230 // Handle leading <custom-ident>*. 3230 // Handle leading <custom-ident>*.
3231 if (trailingIdentWasAdded) { 3231 if (!parseGridLineNames(*m_valueList, *templateRows, trailingIdentWasAdd ed ? toCSSGridLineNamesValue(templateRows->item(templateRows->length() - 1)) : n ullptr))
3232 // A row's trailing ident must be concatenated with the next row's l eading one. 3232 return false;
3233 maybeParseGridLineNames(*m_valueList, *templateRows, toCSSGridLineNa mesValue(templateRows->item(templateRows->length() - 1)));
3234 } else {
3235 maybeParseGridLineNames(*m_valueList, *templateRows);
3236 }
3237 3233
3238 // Handle a template-area's row. 3234 // Handle a template-area's row.
3239 if (!parseGridTemplateAreasRow(gridAreaMap, rowCount, columnCount)) 3235 if (!parseGridTemplateAreasRow(gridAreaMap, rowCount, columnCount))
3240 return false; 3236 return false;
3241 ++rowCount; 3237 ++rowCount;
3242 3238
3243 // Handle template-rows's track-size. 3239 // Handle template-rows's track-size.
3244 if (m_valueList->current() && m_valueList->current()->unit != CSSParserV alue::ValueList && m_valueList->current()->unit != CSSPrimitiveValue::CSS_STRING ) { 3240 if (m_valueList->current() && m_valueList->current()->unit != CSSParserV alue::ValueList && m_valueList->current()->unit != CSSPrimitiveValue::CSS_STRING ) {
3245 RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList ); 3241 RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList );
3246 if (!value) 3242 if (!value)
3247 return false; 3243 return false;
3248 templateRows->append(value); 3244 templateRows->append(value);
3249 } else { 3245 } else {
3250 templateRows->append(cssValuePool().createIdentifierValue(CSSValueAu to)); 3246 templateRows->append(cssValuePool().createIdentifierValue(CSSValueAu to));
3251 } 3247 }
3252 3248
3253 // This will handle the trailing/leading <custom-ident>* in the grammar. 3249 // This will handle the trailing/leading <custom-ident>* in the grammar.
3254 const CSSParserValue* current = m_valueList->current(); 3250 const CSSParserValue* current = m_valueList->current();
3255 trailingIdentWasAdded = current && current->unit == CSSParserValue::Valu eList && current->valueList->size() > 0; 3251 trailingIdentWasAdded = current && current->unit == CSSParserValue::Valu eList && current->valueList->size() > 0;
3256 maybeParseGridLineNames(*m_valueList, *templateRows); 3252 if (!parseGridLineNames(*m_valueList, *templateRows))
3253 return false;
3257 } 3254 }
3258 3255
3259 // [<track-list> /]? 3256 // [<track-list> /]?
3260 if (templateColumns) 3257 if (templateColumns)
3261 addProperty(CSSPropertyGridTemplateColumns, templateColumns, important); 3258 addProperty(CSSPropertyGridTemplateColumns, templateColumns, important);
3262 else 3259 else
3263 addProperty(CSSPropertyGridTemplateColumns, cssValuePool().createIdenti fierValue(CSSValueNone), important); 3260 addProperty(CSSPropertyGridTemplateColumns, cssValuePool().createIdenti fierValue(CSSValueNone), important);
3264 3261
3265 // [<line-names>? <string> [<track-size> <line-names>]? ]+ 3262 // [<line-names>? <string> [<track-size> <line-names>]? ]+
3266 RefPtrWillBeRawPtr<CSSValue> templateAreas = CSSGridTemplateAreasValue::crea te(gridAreaMap, rowCount, columnCount); 3263 RefPtrWillBeRawPtr<CSSValue> templateAreas = CSSGridTemplateAreasValue::crea te(gridAreaMap, rowCount, columnCount);
3267 addProperty(CSSPropertyGridTemplateAreas, templateAreas.release(), important ); 3264 addProperty(CSSPropertyGridTemplateAreas, templateAreas.release(), important );
3268 addProperty(CSSPropertyGridTemplateRows, templateRows.release(), important); 3265 addProperty(CSSPropertyGridTemplateRows, templateRows.release(), important);
3269 3266
3270
3271 return true; 3267 return true;
3272 } 3268 }
3273 3269
3274 3270
3275 bool CSSPropertyParser::parseGridTemplateShorthand(bool important) 3271 bool CSSPropertyParser::parseGridTemplateShorthand(bool important)
3276 { 3272 {
3277 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); 3273 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
3278 3274
3279 ShorthandScope scope(this, CSSPropertyGridTemplate); 3275 ShorthandScope scope(this, CSSPropertyGridTemplate);
3280 ASSERT(gridTemplateShorthand().length() == 3); 3276 ASSERT(gridTemplateShorthand().length() == 3);
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
3434 if (!isForwardSlashOperator(m_valueList->current())) 3430 if (!isForwardSlashOperator(m_valueList->current()))
3435 return false; 3431 return false;
3436 3432
3437 if (!m_valueList->next()) 3433 if (!m_valueList->next())
3438 return false; 3434 return false;
3439 3435
3440 property = parseGridPosition(); 3436 property = parseGridPosition();
3441 return true; 3437 return true;
3442 } 3438 }
3443 3439
3444 void CSSPropertyParser::maybeParseGridLineNames(CSSParserValueList& inputList, C SSValueList& valueList, CSSGridLineNamesValue* previousNamedAreaTrailingLineName s) 3440 static inline bool isClosingBracket(const CSSParserValue& value)
3445 { 3441 {
3446 if (!inputList.current() || inputList.current()->unit != CSSParserValue::Val ueList) 3442 return value.unit == CSSParserValue::Operator && value.iValue == ']';
3447 return; 3443 }
3448 3444
3449 CSSParserValueList* identList = inputList.current()->valueList; 3445 bool CSSPropertyParser::parseGridLineNames(CSSParserValueList& inputList, CSSVal ueList& valueList, CSSGridLineNamesValue* previousNamedAreaTrailingLineNames)
3450 if (!identList->size()) { 3446 {
3451 inputList.next(); 3447 if (!inputList.current() || inputList.current()->unit != CSSParserValue::Ope rator || inputList.current()->iValue != '[')
3452 return; 3448 return true;
3453 }
3454 3449
3455 // Need to ensure the identList is at the heading index, since the parserLis t might have been rewound. 3450 // Skip '['
3456 identList->setCurrentIndex(0); 3451 inputList.next();
3457 3452
3458 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = previousNamedAreaTrail ingLineNames; 3453 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = previousNamedAreaTrail ingLineNames;
3459 if (!lineNames) 3454 if (!lineNames)
3460 lineNames = CSSGridLineNamesValue::create(); 3455 lineNames = CSSGridLineNamesValue::create();
3461 while (CSSParserValue* identValue = identList->current()) { 3456
3462 if (identValue->unit != CSSPrimitiveValue::CSS_IDENT) 3457 while (CSSParserValue* identValue = inputList.current()) {
3463 return; 3458 if (isClosingBracket(*identValue))
3459 break;
3460
3461 if (!isValidCustomIdentForGridPositions(*identValue))
3462 return false;
3463
3464 RefPtrWillBeRawPtr<CSSPrimitiveValue> lineName = createPrimitiveCustomId entValue(identValue); 3464 RefPtrWillBeRawPtr<CSSPrimitiveValue> lineName = createPrimitiveCustomId entValue(identValue);
3465 lineNames->append(lineName.release()); 3465 lineNames->append(lineName.release());
3466 identList->next(); 3466 inputList.next();
3467 } 3467 }
3468
3469 if (!inputList.current() || !isClosingBracket(*inputList.current()))
3470 return false;
3471
3468 if (!previousNamedAreaTrailingLineNames) 3472 if (!previousNamedAreaTrailingLineNames)
3469 valueList.append(lineNames.release()); 3473 valueList.append(lineNames.release());
3470 3474
3475 // Consume ']'
3471 inputList.next(); 3476 inputList.next();
3477 return true;
3472 } 3478 }
3473 3479
3474 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTrackList() 3480 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTrackList()
3475 { 3481 {
3476 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); 3482 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
3477 3483
3478 CSSParserValue* value = m_valueList->current(); 3484 CSSParserValue* value = m_valueList->current();
3479 if (value->id == CSSValueNone) { 3485 if (value->id == CSSValueNone) {
3480 m_valueList->next(); 3486 m_valueList->next();
3481 return cssValuePool().createIdentifierValue(CSSValueNone); 3487 return cssValuePool().createIdentifierValue(CSSValueNone);
3482 } 3488 }
3483 3489
3484 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated (); 3490 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated ();
3485 // Handle leading <ident>*. 3491 // Handle leading <custom-ident>*.
3486 maybeParseGridLineNames(*m_valueList, *values); 3492 if (!parseGridLineNames(*m_valueList, *values))
3493 return nullptr;
3487 3494
3488 bool seenTrackSizeOrRepeatFunction = false; 3495 bool seenTrackSizeOrRepeatFunction = false;
3489 while (CSSParserValue* currentValue = m_valueList->current()) { 3496 while (CSSParserValue* currentValue = m_valueList->current()) {
3490 if (isForwardSlashOperator(currentValue)) 3497 if (isForwardSlashOperator(currentValue))
3491 break; 3498 break;
3492 if (currentValue->unit == CSSParserValue::Function && currentValue->func tion->id == CSSValueRepeat) { 3499 if (currentValue->unit == CSSParserValue::Function && currentValue->func tion->id == CSSValueRepeat) {
3493 if (!parseGridTrackRepeatFunction(*values)) 3500 if (!parseGridTrackRepeatFunction(*values))
3494 return nullptr; 3501 return nullptr;
3495 seenTrackSizeOrRepeatFunction = true; 3502 seenTrackSizeOrRepeatFunction = true;
3496 } else { 3503 } else {
3497 RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList ); 3504 RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList );
3498 if (!value) 3505 if (!value)
3499 return nullptr; 3506 return nullptr;
3500 values->append(value); 3507 values->append(value);
3501 seenTrackSizeOrRepeatFunction = true; 3508 seenTrackSizeOrRepeatFunction = true;
3502 } 3509 }
3503 // This will handle the trailing <ident>* in the grammar. 3510 // This will handle the trailing <custom-ident>* in the grammar.
3504 maybeParseGridLineNames(*m_valueList, *values); 3511 if (!parseGridLineNames(*m_valueList, *values))
3512 return nullptr;
3505 } 3513 }
3506 3514
3507 // We should have found a <track-size> or else it is not a valid <track-list > 3515 // We should have found a <track-size> or else it is not a valid <track-list >
3508 if (!seenTrackSizeOrRepeatFunction) 3516 if (!seenTrackSizeOrRepeatFunction)
3509 return nullptr; 3517 return nullptr;
3510 3518
3511 return values; 3519 return values;
3512 } 3520 }
3513 3521
3514 bool CSSPropertyParser::parseGridTrackRepeatFunction(CSSValueList& list) 3522 bool CSSPropertyParser::parseGridTrackRepeatFunction(CSSValueList& list)
3515 { 3523 {
3516 CSSParserValueList* arguments = m_valueList->current()->function->args.get() ; 3524 CSSParserValueList* arguments = m_valueList->current()->function->args.get() ;
3517 if (!arguments || arguments->size() < 3 || !validUnit(arguments->valueAt(0), FPositiveInteger) || !isComma(arguments->valueAt(1))) 3525 if (!arguments || arguments->size() < 3 || !validUnit(arguments->valueAt(0), FPositiveInteger) || !isComma(arguments->valueAt(1)))
3518 return false; 3526 return false;
3519 3527
3520 ASSERT(arguments->valueAt(0)->fValue > 0); 3528 ASSERT(arguments->valueAt(0)->fValue > 0);
3521 size_t repetitions = clampTo<size_t>(arguments->valueAt(0)->fValue, 0, kGrid MaxTracks); 3529 size_t repetitions = clampTo<size_t>(arguments->valueAt(0)->fValue, 0, kGrid MaxTracks);
3522 3530
3523 RefPtrWillBeRawPtr<CSSValueList> repeatedValues = CSSValueList::createSpaceS eparated(); 3531 RefPtrWillBeRawPtr<CSSValueList> repeatedValues = CSSValueList::createSpaceS eparated();
3524 arguments->next(); // Skip the repetition count. 3532 arguments->next(); // Skip the repetition count.
3525 arguments->next(); // Skip the comma. 3533 arguments->next(); // Skip the comma.
3526 3534
3527 // Handle leading <ident>*. 3535 // Handle leading <custom-ident>*.
3528 maybeParseGridLineNames(*arguments, *repeatedValues); 3536 if (!parseGridLineNames(*arguments, *repeatedValues))
3537 return false;
3529 3538
3530 size_t numberOfTracks = 0; 3539 size_t numberOfTracks = 0;
3531 while (arguments->current()) { 3540 while (arguments->current()) {
3532 RefPtrWillBeRawPtr<CSSValue> trackSize = parseGridTrackSize(*arguments); 3541 RefPtrWillBeRawPtr<CSSValue> trackSize = parseGridTrackSize(*arguments);
3533 if (!trackSize) 3542 if (!trackSize)
3534 return false; 3543 return false;
3535 3544
3536 repeatedValues->append(trackSize); 3545 repeatedValues->append(trackSize);
3537 ++numberOfTracks; 3546 ++numberOfTracks;
3538 3547
3539 // This takes care of any trailing <ident>* in the grammar. 3548 // This takes care of any trailing <custom-ident>* in the grammar.
3540 maybeParseGridLineNames(*arguments, *repeatedValues); 3549 if (!parseGridLineNames(*arguments, *repeatedValues))
3550 return false;
3541 } 3551 }
3542 3552
3543 // We should have found at least one <track-size> or else it is not a valid <track-list>. 3553 // We should have found at least one <track-size> or else it is not a valid <track-list>.
3544 if (!numberOfTracks) 3554 if (!numberOfTracks)
3545 return false; 3555 return false;
3546 3556
3547 // We clamp the number of repetitions to a multiple of the repeat() track li st's size, while staying below the max 3557 // We clamp the number of repetitions to a multiple of the repeat() track li st's size, while staying below the max
3548 // grid size. 3558 // grid size.
3549 repetitions = std::min(repetitions, kGridMaxTracks / numberOfTracks); 3559 repetitions = std::min(repetitions, kGridMaxTracks / numberOfTracks);
3550 3560
(...skipping 4834 matching lines...) Expand 10 before | Expand all | Expand 10 after
8385 } 8395 }
8386 } 8396 }
8387 8397
8388 if (!list->length()) 8398 if (!list->length())
8389 return nullptr; 8399 return nullptr;
8390 8400
8391 return list.release(); 8401 return list.release();
8392 } 8402 }
8393 8403
8394 } // namespace blink 8404 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/CSSPropertyParser.h ('k') | Source/core/css/parser/CSSPropertyParserTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698