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/CSSCalculationValue.h" | 10 #include "core/css/CSSCalculationValue.h" |
(...skipping 4481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4492 ASSERT_NOT_REACHED(); | 4492 ASSERT_NOT_REACHED(); |
4493 } | 4493 } |
4494 if (value == CSSValueInvalid) | 4494 if (value == CSSValueInvalid) |
4495 return false; | 4495 return false; |
4496 | 4496 |
4497 CSSPropertyID genericBreakProperty = mapFromLegacyBreakProperty(property); | 4497 CSSPropertyID genericBreakProperty = mapFromLegacyBreakProperty(property); |
4498 addProperty(genericBreakProperty, cssValuePool().createIdentifierValue(value
), important); | 4498 addProperty(genericBreakProperty, cssValuePool().createIdentifierValue(value
), important); |
4499 return true; | 4499 return true; |
4500 } | 4500 } |
4501 | 4501 |
| 4502 static bool consumeBackgroundPosition(CSSParserTokenRange& range, const CSSParse
rContext& context, UnitlessQuirk unitless, RefPtrWillBeRawPtr<CSSValue>& resultX
, RefPtrWillBeRawPtr<CSSValue>& resultY) |
| 4503 { |
| 4504 do { |
| 4505 RefPtrWillBeRawPtr<CSSValue> positionX = nullptr; |
| 4506 RefPtrWillBeRawPtr<CSSValue> positionY = nullptr; |
| 4507 if (!consumePosition(range, context.mode(), unitless, positionX, positio
nY)) |
| 4508 return false; |
| 4509 addBackgroundValue(resultX, positionX); |
| 4510 addBackgroundValue(resultY, positionY); |
| 4511 } while (consumeCommaIncludingWhitespace(range)); |
| 4512 return true; |
| 4513 } |
| 4514 |
| 4515 static bool consumeRepeatStyleComponent(CSSParserTokenRange& range, RefPtrWillBe
RawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2, bool& implicit) |
| 4516 { |
| 4517 if (consumeIdent<CSSValueRepeatX>(range)) { |
| 4518 value1 = cssValuePool().createIdentifierValue(CSSValueRepeat); |
| 4519 value2 = cssValuePool().createIdentifierValue(CSSValueNoRepeat); |
| 4520 implicit = true; |
| 4521 return true; |
| 4522 } |
| 4523 if (consumeIdent<CSSValueRepeatY>(range)) { |
| 4524 value1 = cssValuePool().createIdentifierValue(CSSValueNoRepeat); |
| 4525 value2 = cssValuePool().createIdentifierValue(CSSValueRepeat); |
| 4526 implicit = true; |
| 4527 return true; |
| 4528 } |
| 4529 value1 = consumeIdent<CSSValueRepeat, CSSValueNoRepeat, CSSValueRound, CSSVa
lueSpace>(range); |
| 4530 if (!value1) |
| 4531 return false; |
| 4532 |
| 4533 value2 = consumeIdent<CSSValueRepeat, CSSValueNoRepeat, CSSValueRound, CSSVa
lueSpace>(range); |
| 4534 if (!value2) { |
| 4535 value2 = value1; |
| 4536 implicit = true; |
| 4537 } |
| 4538 return true; |
| 4539 } |
| 4540 |
| 4541 static bool consumeRepeatStyle(CSSParserTokenRange& range, RefPtrWillBeRawPtr<CS
SValue>& resultX, RefPtrWillBeRawPtr<CSSValue>& resultY, bool& implicit) |
| 4542 { |
| 4543 do { |
| 4544 RefPtrWillBeRawPtr<CSSValue> repeatX = nullptr; |
| 4545 RefPtrWillBeRawPtr<CSSValue> repeatY = nullptr; |
| 4546 if (!consumeRepeatStyleComponent(range, repeatX, repeatY, implicit)) |
| 4547 return false; |
| 4548 addBackgroundValue(resultX, repeatX); |
| 4549 addBackgroundValue(resultY, repeatY); |
| 4550 } while (consumeCommaIncludingWhitespace(range)); |
| 4551 return true; |
| 4552 } |
| 4553 |
4502 bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im
portant) | 4554 bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im
portant) |
4503 { | 4555 { |
4504 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); | 4556 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
4505 | 4557 |
4506 CSSPropertyID oldShorthand = m_currentShorthand; | 4558 CSSPropertyID oldShorthand = m_currentShorthand; |
4507 // TODO(rob.buis): Remove this when the legacy property parser is gone | 4559 // TODO(rob.buis): Remove this when the legacy property parser is gone |
4508 m_currentShorthand = property; | 4560 m_currentShorthand = property; |
4509 switch (property) { | 4561 switch (property) { |
4510 case CSSPropertyWebkitMarginCollapse: { | 4562 case CSSPropertyWebkitMarginCollapse: { |
4511 CSSValueID id = m_range.consumeIncludingWhitespace().id(); | 4563 CSSValueID id = m_range.consumeIncludingWhitespace().id(); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4633 case CSSPropertyBorderImage: | 4685 case CSSPropertyBorderImage: |
4634 case CSSPropertyWebkitMaskBoxImage: | 4686 case CSSPropertyWebkitMaskBoxImage: |
4635 return consumeBorderImage(property, important); | 4687 return consumeBorderImage(property, important); |
4636 case CSSPropertyPageBreakAfter: | 4688 case CSSPropertyPageBreakAfter: |
4637 case CSSPropertyPageBreakBefore: | 4689 case CSSPropertyPageBreakBefore: |
4638 case CSSPropertyPageBreakInside: | 4690 case CSSPropertyPageBreakInside: |
4639 case CSSPropertyWebkitColumnBreakAfter: | 4691 case CSSPropertyWebkitColumnBreakAfter: |
4640 case CSSPropertyWebkitColumnBreakBefore: | 4692 case CSSPropertyWebkitColumnBreakBefore: |
4641 case CSSPropertyWebkitColumnBreakInside: | 4693 case CSSPropertyWebkitColumnBreakInside: |
4642 return consumeLegacyBreakProperty(property, important); | 4694 return consumeLegacyBreakProperty(property, important); |
| 4695 case CSSPropertyWebkitMaskPosition: |
| 4696 case CSSPropertyBackgroundPosition: { |
| 4697 RefPtrWillBeRawPtr<CSSValue> resultX = nullptr; |
| 4698 RefPtrWillBeRawPtr<CSSValue> resultY = nullptr; |
| 4699 if (!consumeBackgroundPosition(m_range, m_context, UnitlessQuirk::Allow,
resultX, resultY) || !m_range.atEnd()) |
| 4700 return false; |
| 4701 addProperty(property == CSSPropertyBackgroundPosition ? CSSPropertyBackg
roundPositionX : CSSPropertyWebkitMaskPositionX, resultX.release(), important); |
| 4702 addProperty(property == CSSPropertyBackgroundPosition ? CSSPropertyBackg
roundPositionY : CSSPropertyWebkitMaskPositionY, resultY.release(), important); |
| 4703 return true; |
| 4704 } |
| 4705 case CSSPropertyBackgroundRepeat: |
| 4706 case CSSPropertyWebkitMaskRepeat: { |
| 4707 RefPtrWillBeRawPtr<CSSValue> resultX = nullptr; |
| 4708 RefPtrWillBeRawPtr<CSSValue> resultY = nullptr; |
| 4709 bool implicit = false; |
| 4710 if (!consumeRepeatStyle(m_range, resultX, resultY, implicit) || !m_range
.atEnd()) |
| 4711 return false; |
| 4712 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro
undRepeatX : CSSPropertyWebkitMaskRepeatX, resultX.release(), important, implici
t); |
| 4713 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro
undRepeatY : CSSPropertyWebkitMaskRepeatY, resultY.release(), important, implici
t); |
| 4714 return true; |
| 4715 } |
4643 default: | 4716 default: |
4644 m_currentShorthand = oldShorthand; | 4717 m_currentShorthand = oldShorthand; |
4645 CSSParserValueList valueList(m_range); | 4718 CSSParserValueList valueList(m_range); |
4646 if (!valueList.size()) | 4719 if (!valueList.size()) |
4647 return false; | 4720 return false; |
4648 m_valueList = &valueList; | 4721 m_valueList = &valueList; |
4649 return legacyParseShorthand(unresolvedProperty, important); | 4722 return legacyParseShorthand(unresolvedProperty, important); |
4650 } | 4723 } |
4651 } | 4724 } |
4652 | 4725 |
4653 } // namespace blink | 4726 } // namespace blink |
OLD | NEW |