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 3210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 |
jfernandez
2015/06/04 22:49:56
Unneeded white line.
| |
3232 // A row's trailing ident must be concatenated with the next row's l eading one. | 3232 if (!maybeParseGridLineNames(*m_valueList, *templateRows, trailingIdentW asAdded ? toCSSGridLineNamesValue(templateRows->item(templateRows->length() - 1) ) : nullptr)) |
3233 maybeParseGridLineNames(*m_valueList, *templateRows, toCSSGridLineNa mesValue(templateRows->item(templateRows->length() - 1))); | 3233 return false; |
Julien - ping for review
2015/06/04 23:17:58
Aren't you tightening our parsing here and thus th
svillar
2015/06/05 07:25:43
Actually I acknowledge that it looks like that we
| |
3234 } else { | |
3235 maybeParseGridLineNames(*m_valueList, *templateRows); | |
3236 } | |
3237 | 3234 |
3238 // Handle a template-area's row. | 3235 // Handle a template-area's row. |
3239 if (!parseGridTemplateAreasRow(gridAreaMap, rowCount, columnCount)) | 3236 if (!parseGridTemplateAreasRow(gridAreaMap, rowCount, columnCount)) |
3240 return false; | 3237 return false; |
3241 ++rowCount; | 3238 ++rowCount; |
3242 | 3239 |
3243 // Handle template-rows's track-size. | 3240 // 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 ) { | 3241 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 ); | 3242 RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList ); |
3246 if (!value) | 3243 if (!value) |
3247 return false; | 3244 return false; |
3248 templateRows->append(value); | 3245 templateRows->append(value); |
3249 } else { | 3246 } else { |
3250 templateRows->append(cssValuePool().createIdentifierValue(CSSValueAu to)); | 3247 templateRows->append(cssValuePool().createIdentifierValue(CSSValueAu to)); |
3251 } | 3248 } |
3252 | 3249 |
3253 // This will handle the trailing/leading <custom-ident>* in the grammar. | 3250 // This will handle the trailing/leading <custom-ident>* in the grammar. |
3254 const CSSParserValue* current = m_valueList->current(); | 3251 const CSSParserValue* current = m_valueList->current(); |
3255 trailingIdentWasAdded = current && current->unit == CSSParserValue::Valu eList && current->valueList->size() > 0; | 3252 trailingIdentWasAdded = current && current->unit == CSSParserValue::Valu eList && current->valueList->size() > 0; |
3256 maybeParseGridLineNames(*m_valueList, *templateRows); | 3253 if (!maybeParseGridLineNames(*m_valueList, *templateRows)) |
3254 return false; | |
3257 } | 3255 } |
3258 | 3256 |
3259 // [<track-list> /]? | 3257 // [<track-list> /]? |
3260 if (templateColumns) | 3258 if (templateColumns) |
3261 addProperty(CSSPropertyGridTemplateColumns, templateColumns, important); | 3259 addProperty(CSSPropertyGridTemplateColumns, templateColumns, important); |
3262 else | 3260 else |
3263 addProperty(CSSPropertyGridTemplateColumns, cssValuePool().createIdenti fierValue(CSSValueNone), important); | 3261 addProperty(CSSPropertyGridTemplateColumns, cssValuePool().createIdenti fierValue(CSSValueNone), important); |
3264 | 3262 |
3265 // [<line-names>? <string> [<track-size> <line-names>]? ]+ | 3263 // [<line-names>? <string> [<track-size> <line-names>]? ]+ |
3266 RefPtrWillBeRawPtr<CSSValue> templateAreas = CSSGridTemplateAreasValue::crea te(gridAreaMap, rowCount, columnCount); | 3264 RefPtrWillBeRawPtr<CSSValue> templateAreas = CSSGridTemplateAreasValue::crea te(gridAreaMap, rowCount, columnCount); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3434 if (!isForwardSlashOperator(m_valueList->current())) | 3432 if (!isForwardSlashOperator(m_valueList->current())) |
3435 return false; | 3433 return false; |
3436 | 3434 |
3437 if (!m_valueList->next()) | 3435 if (!m_valueList->next()) |
3438 return false; | 3436 return false; |
3439 | 3437 |
3440 property = parseGridPosition(); | 3438 property = parseGridPosition(); |
3441 return true; | 3439 return true; |
3442 } | 3440 } |
3443 | 3441 |
3444 void CSSPropertyParser::maybeParseGridLineNames(CSSParserValueList& inputList, C SSValueList& valueList, CSSGridLineNamesValue* previousNamedAreaTrailingLineName s) | 3442 static inline bool isClosingBracket(CSSParserValue* value) |
jfernandez
2015/06/04 22:49:56
Shouldn't value argument be 'const' ?
Julien - ping for review
2015/06/04 23:17:58
Even better a constant reference.
svillar
2015/06/05 07:25:43
Acknowledged.
| |
3445 { | 3443 { |
3446 if (!inputList.current() || inputList.current()->unit != CSSParserValue::Val ueList) | 3444 return value->unit == CSSParserValue::Operator && value->iValue == ']'; |
3447 return; | 3445 } |
3448 | 3446 |
3449 CSSParserValueList* identList = inputList.current()->valueList; | 3447 bool CSSPropertyParser::maybeParseGridLineNames(CSSParserValueList& inputList, C SSValueList& valueList, CSSGridLineNamesValue* previousNamedAreaTrailingLineName s) |
3450 if (!identList->size()) { | 3448 { |
3451 inputList.next(); | 3449 if (!inputList.current() || inputList.current()->unit != CSSParserValue::Ope rator || inputList.current()->iValue != '[') |
jfernandez
2015/06/04 22:49:57
Wouldn't be a good idea to define a 'isOpenBracke
svillar
2015/06/05 07:25:43
I don't think so, it'd be just used here.
| |
3452 return; | 3450 return true; |
3453 } | |
3454 | 3451 |
3455 // Need to ensure the identList is at the heading index, since the parserLis t might have been rewound. | 3452 // Skip '[' |
3456 identList->setCurrentIndex(0); | 3453 inputList.next(); |
3457 | 3454 |
3458 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = previousNamedAreaTrail ingLineNames; | 3455 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = previousNamedAreaTrail ingLineNames; |
3459 if (!lineNames) | 3456 if (!lineNames) |
3460 lineNames = CSSGridLineNamesValue::create(); | 3457 lineNames = CSSGridLineNamesValue::create(); |
3461 while (CSSParserValue* identValue = identList->current()) { | 3458 |
3459 while (CSSParserValue* identValue = inputList.current()) { | |
3460 if (isClosingBracket(identValue)) | |
3461 break; | |
3462 | |
3462 if (identValue->unit != CSSPrimitiveValue::CSS_IDENT) | 3463 if (identValue->unit != CSSPrimitiveValue::CSS_IDENT) |
3463 return; | 3464 return false; |
3465 | |
3464 RefPtrWillBeRawPtr<CSSPrimitiveValue> lineName = createPrimitiveCustomId entValue(identValue); | 3466 RefPtrWillBeRawPtr<CSSPrimitiveValue> lineName = createPrimitiveCustomId entValue(identValue); |
3465 lineNames->append(lineName.release()); | 3467 lineNames->append(lineName.release()); |
3466 identList->next(); | 3468 inputList.next(); |
3467 } | 3469 } |
3470 | |
3471 if (!inputList.current() || !isClosingBracket(inputList.current())) | |
3472 return false; | |
3473 | |
3468 if (!previousNamedAreaTrailingLineNames) | 3474 if (!previousNamedAreaTrailingLineNames) |
3469 valueList.append(lineNames.release()); | 3475 valueList.append(lineNames.release()); |
3470 | 3476 |
3477 // Consume ']' | |
3471 inputList.next(); | 3478 inputList.next(); |
3479 return true; | |
3472 } | 3480 } |
3473 | 3481 |
3474 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTrackList() | 3482 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTrackList() |
3475 { | 3483 { |
3476 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | 3484 ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |
3477 | 3485 |
3478 CSSParserValue* value = m_valueList->current(); | 3486 CSSParserValue* value = m_valueList->current(); |
3479 if (value->id == CSSValueNone) { | 3487 if (value->id == CSSValueNone) { |
3480 m_valueList->next(); | 3488 m_valueList->next(); |
3481 return cssValuePool().createIdentifierValue(CSSValueNone); | 3489 return cssValuePool().createIdentifierValue(CSSValueNone); |
3482 } | 3490 } |
3483 | 3491 |
3484 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated (); | 3492 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated (); |
3485 // Handle leading <ident>*. | 3493 // Handle leading <ident>*. |
jfernandez
2015/06/04 22:49:56
Shouldn't be <custom-ident> ?
svillar
2015/06/05 07:25:43
Yes, that's a legacy comment.
| |
3486 maybeParseGridLineNames(*m_valueList, *values); | 3494 if (!maybeParseGridLineNames(*m_valueList, *values)) |
3495 return nullptr; | |
3487 | 3496 |
3488 bool seenTrackSizeOrRepeatFunction = false; | 3497 bool seenTrackSizeOrRepeatFunction = false; |
3489 while (CSSParserValue* currentValue = m_valueList->current()) { | 3498 while (CSSParserValue* currentValue = m_valueList->current()) { |
3490 if (isForwardSlashOperator(currentValue)) | 3499 if (isForwardSlashOperator(currentValue)) |
3491 break; | 3500 break; |
3492 if (currentValue->unit == CSSParserValue::Function && currentValue->func tion->id == CSSValueRepeat) { | 3501 if (currentValue->unit == CSSParserValue::Function && currentValue->func tion->id == CSSValueRepeat) { |
3493 if (!parseGridTrackRepeatFunction(*values)) | 3502 if (!parseGridTrackRepeatFunction(*values)) |
3494 return nullptr; | 3503 return nullptr; |
3495 seenTrackSizeOrRepeatFunction = true; | 3504 seenTrackSizeOrRepeatFunction = true; |
3496 } else { | 3505 } else { |
3497 RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList ); | 3506 RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList ); |
3498 if (!value) | 3507 if (!value) |
3499 return nullptr; | 3508 return nullptr; |
3500 values->append(value); | 3509 values->append(value); |
3501 seenTrackSizeOrRepeatFunction = true; | 3510 seenTrackSizeOrRepeatFunction = true; |
3502 } | 3511 } |
3503 // This will handle the trailing <ident>* in the grammar. | 3512 // This will handle the trailing <ident>* in the grammar. |
3504 maybeParseGridLineNames(*m_valueList, *values); | 3513 if (!maybeParseGridLineNames(*m_valueList, *values)) |
3514 return nullptr; | |
3505 } | 3515 } |
3506 | 3516 |
3507 // We should have found a <track-size> or else it is not a valid <track-list > | 3517 // We should have found a <track-size> or else it is not a valid <track-list > |
3508 if (!seenTrackSizeOrRepeatFunction) | 3518 if (!seenTrackSizeOrRepeatFunction) |
3509 return nullptr; | 3519 return nullptr; |
3510 | 3520 |
3511 return values; | 3521 return values; |
3512 } | 3522 } |
3513 | 3523 |
3514 bool CSSPropertyParser::parseGridTrackRepeatFunction(CSSValueList& list) | 3524 bool CSSPropertyParser::parseGridTrackRepeatFunction(CSSValueList& list) |
3515 { | 3525 { |
3516 CSSParserValueList* arguments = m_valueList->current()->function->args.get() ; | 3526 CSSParserValueList* arguments = m_valueList->current()->function->args.get() ; |
3517 if (!arguments || arguments->size() < 3 || !validUnit(arguments->valueAt(0), FPositiveInteger) || !isComma(arguments->valueAt(1))) | 3527 if (!arguments || arguments->size() < 3 || !validUnit(arguments->valueAt(0), FPositiveInteger) || !isComma(arguments->valueAt(1))) |
3518 return false; | 3528 return false; |
3519 | 3529 |
3520 ASSERT(arguments->valueAt(0)->fValue > 0); | 3530 ASSERT(arguments->valueAt(0)->fValue > 0); |
3521 size_t repetitions = clampTo<size_t>(arguments->valueAt(0)->fValue, 0, kGrid MaxTracks); | 3531 size_t repetitions = clampTo<size_t>(arguments->valueAt(0)->fValue, 0, kGrid MaxTracks); |
3522 | 3532 |
3523 RefPtrWillBeRawPtr<CSSValueList> repeatedValues = CSSValueList::createSpaceS eparated(); | 3533 RefPtrWillBeRawPtr<CSSValueList> repeatedValues = CSSValueList::createSpaceS eparated(); |
3524 arguments->next(); // Skip the repetition count. | 3534 arguments->next(); // Skip the repetition count. |
3525 arguments->next(); // Skip the comma. | 3535 arguments->next(); // Skip the comma. |
3526 | 3536 |
3527 // Handle leading <ident>*. | 3537 // Handle leading <ident>*. |
jfernandez
2015/06/04 22:49:56
Ditto.
| |
3528 maybeParseGridLineNames(*arguments, *repeatedValues); | 3538 if (!maybeParseGridLineNames(*arguments, *repeatedValues)) |
3539 return false; | |
3529 | 3540 |
3530 size_t numberOfTracks = 0; | 3541 size_t numberOfTracks = 0; |
3531 while (arguments->current()) { | 3542 while (arguments->current()) { |
3532 RefPtrWillBeRawPtr<CSSValue> trackSize = parseGridTrackSize(*arguments); | 3543 RefPtrWillBeRawPtr<CSSValue> trackSize = parseGridTrackSize(*arguments); |
3533 if (!trackSize) | 3544 if (!trackSize) |
3534 return false; | 3545 return false; |
3535 | 3546 |
3536 repeatedValues->append(trackSize); | 3547 repeatedValues->append(trackSize); |
3537 ++numberOfTracks; | 3548 ++numberOfTracks; |
3538 | 3549 |
3539 // This takes care of any trailing <ident>* in the grammar. | 3550 // This takes care of any trailing <ident>* in the grammar. |
3540 maybeParseGridLineNames(*arguments, *repeatedValues); | 3551 if (!maybeParseGridLineNames(*arguments, *repeatedValues)) |
Julien - ping for review
2015/06/04 23:17:58
This function is not 'maybe' parsing anymore if we
svillar
2015/06/05 07:25:43
Sure, I also thought about that.
Julien - ping for review
2015/06/05 16:51:20
The comment was basically that with the new parser
| |
3552 return false; | |
3541 } | 3553 } |
3542 | 3554 |
3543 // We should have found at least one <track-size> or else it is not a valid <track-list>. | 3555 // We should have found at least one <track-size> or else it is not a valid <track-list>. |
3544 if (!numberOfTracks) | 3556 if (!numberOfTracks) |
3545 return false; | 3557 return false; |
3546 | 3558 |
3547 // We clamp the number of repetitions to a multiple of the repeat() track li st's size, while staying below the max | 3559 // 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. | 3560 // grid size. |
3549 repetitions = std::min(repetitions, kGridMaxTracks / numberOfTracks); | 3561 repetitions = std::min(repetitions, kGridMaxTracks / numberOfTracks); |
3550 | 3562 |
(...skipping 4834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8385 } | 8397 } |
8386 } | 8398 } |
8387 | 8399 |
8388 if (!list->length()) | 8400 if (!list->length()) |
8389 return nullptr; | 8401 return nullptr; |
8390 | 8402 |
8391 return list.release(); | 8403 return list.release(); |
8392 } | 8404 } |
8393 | 8405 |
8394 } // namespace blink | 8406 } // namespace blink |
OLD | NEW |