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

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

Issue 1676513003: Move background/webkit-mask shorthands into CSSPropertyParser (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Explan a bit more Created 4 years, 9 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/CSSCalculationValue.h" 10 #include "core/css/CSSCalculationValue.h"
(...skipping 4542 matching lines...) Expand 10 before | Expand all | Expand 10 after
4553 RefPtrWillBeRawPtr<CSSValue> repeatX = nullptr; 4553 RefPtrWillBeRawPtr<CSSValue> repeatX = nullptr;
4554 RefPtrWillBeRawPtr<CSSValue> repeatY = nullptr; 4554 RefPtrWillBeRawPtr<CSSValue> repeatY = nullptr;
4555 if (!consumeRepeatStyleComponent(range, repeatX, repeatY, implicit)) 4555 if (!consumeRepeatStyleComponent(range, repeatX, repeatY, implicit))
4556 return false; 4556 return false;
4557 addBackgroundValue(resultX, repeatX); 4557 addBackgroundValue(resultX, repeatX);
4558 addBackgroundValue(resultY, repeatY); 4558 addBackgroundValue(resultY, repeatY);
4559 } while (consumeCommaIncludingWhitespace(range)); 4559 } while (consumeCommaIncludingWhitespace(range));
4560 return true; 4560 return true;
4561 } 4561 }
4562 4562
4563 // Note: consumeBackgroundShorthand assumes y properties (for example background -position-y) follow
4564 // the x properties in the shorthand array.
4565 bool CSSPropertyParser::consumeBackgroundShorthand(const StylePropertyShorthand& shorthand, bool important)
4566 {
4567 const unsigned longhandCount = shorthand.length();
4568 RefPtrWillBeRawPtr<CSSValue> longhands[10];
4569 ASSERT(longhandCount <= 10);
4570 #if ENABLE(OILPAN)
4571 // Zero initialize the array of raw pointers.
4572 memset(&longhands, 0, sizeof(longhands));
4573 #endif
4574 bool seenClip = false;
Timothy Loh 2016/03/02 04:50:27 Doesn't seem right, this should be per-layer. bac
rwlbuis 2016/03/07 02:50:04 Done.
4575 bool implicit = false;
4576 do {
4577 bool parsedLonghand[10] = { false };
4578 do {
4579 bool foundProperty = false;
4580 for (size_t i = 0; i < longhandCount; ++i) {
4581 if (parsedLonghand[i])
4582 continue;
4583
4584 RefPtrWillBeRawPtr<CSSValue> value = nullptr;
4585 RefPtrWillBeRawPtr<CSSValue> valueY = nullptr;
4586 CSSPropertyID property = shorthand.properties()[i];
4587 if (property == CSSPropertyBackgroundRepeatX || property == CSSP ropertyWebkitMaskRepeatX) {
4588 consumeRepeatStyleComponent(m_range, value, valueY, implicit );
4589 } else if (property == CSSPropertyBackgroundPositionX || propert y == CSSPropertyWebkitMaskPositionX) {
4590 CSSParserTokenRange rangeCopy = m_range;
4591 if (!consumePosition(rangeCopy, m_context.mode(), UnitlessQu irk::Forbid, value, valueY))
4592 continue;
4593 m_range = rangeCopy;
4594 } else if (((property == CSSPropertyBackgroundSize || property = = CSSPropertyWebkitMaskSize) && !consumeSlashIncludingWhitespace(m_range))
Timothy Loh 2016/03/02 04:50:27 Slash handling looks wrong here, since we could co
rwlbuis 2016/03/07 02:50:04 Not sure if you meant it the way I implemented it
Timothy Loh 2016/03/07 03:55:07 Wasn't really what I meant, but it works.
4595 || property == CSSPropertyBackgroundPositionY || property == CSSPropertyBackgroundRepeatY
4596 || property == CSSPropertyWebkitMaskPositionY || property == CSSPropertyWebkitMaskRepeatY) {
4597 continue;
4598 }
4599 if (!value)
Timothy Loh 2016/03/02 04:50:27 can this be an else?
rwlbuis 2016/03/07 02:50:04 Done.
4600 value = consumeBackgroundComponent(property, m_range, m_cont ext);
4601 if (value) {
4602 if (property == CSSPropertyBackgroundClip || property == CSS PropertyWebkitMaskClip)
4603 seenClip = true;
4604 parsedLonghand[i] = true;
4605 foundProperty = true;
4606 addBackgroundValue(longhands[i], value.release());
4607 if (valueY) {
4608 parsedLonghand[i + 1] = true;
4609 addBackgroundValue(longhands[i + 1], valueY.release());
4610 }
4611 }
4612 }
4613 if (!foundProperty)
4614 return false;
4615 } while (!m_range.atEnd() && m_range.peek().type() != CommaToken);
4616
4617 // TODO(timloh): This will make invalid longhands, see crbug.com/386459
4618 bool seenPosition = false;
4619 for (size_t i = 0; i < longhandCount; ++i) {
4620 CSSPropertyID property = shorthand.properties()[i];
4621 if (property == CSSPropertyBackgroundColor && m_range.peek().type() == CommaToken) {
Timothy Loh 2016/03/02 04:50:27 maybe clearer to write !m_range.atEnd() instead of
rwlbuis 2016/03/07 02:50:04 Done.
4622 if (parsedLonghand[i])
4623 return false; // Color is not allowed except as the last ite m in a list for backgrounds.
Timothy Loh 2016/03/02 04:50:27 Sounds like it has to be the very last thing. Mayb
rwlbuis 2016/03/07 02:50:04 Done.
4624 continue;
4625 }
4626 if ((property == CSSPropertyBackgroundPositionX || property == CSSPr opertyWebkitMaskPositionX) && parsedLonghand[i])
4627 seenPosition = true;
4628 if ((property == CSSPropertyBackgroundSize || property == CSSPropert yWebkitMaskSize) && parsedLonghand[i] && !seenPosition)
4629 return false;
4630 if (!parsedLonghand[i])
4631 addBackgroundValue(longhands[i], cssValuePool().createImplicitIn itialValue());
4632 parsedLonghand[i] = false;
4633 }
4634 } while (consumeCommaIncludingWhitespace(m_range));
4635 if (!m_range.atEnd())
4636 return false;
4637
4638 RefPtrWillBeRawPtr<CSSValue> originValue = nullptr;
4639 for (size_t i = 0; i < longhandCount; ++i) {
4640 CSSPropertyID property = shorthand.properties()[i];
4641 if (property == CSSPropertyBackgroundOrigin || property == CSSPropertyWe bkitMaskOrigin)
4642 originValue = longhands[i];
4643 if ((property == CSSPropertyBackgroundClip || property == CSSPropertyWeb kitMaskClip) && !seenClip)
4644 addProperty(property, originValue.release(), important, implicit);
4645 else if (property == CSSPropertyBackgroundSize && longhands[i] && m_cont ext.useLegacyBackgroundSizeShorthandBehavior())
4646 continue;
4647 else
4648 addProperty(property, longhands[i].release(), important, implicit);
4649 }
4650 return true;
4651 }
4652
4563 bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im portant) 4653 bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im portant)
4564 { 4654 {
4565 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); 4655 CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
4566 4656
4567 CSSPropertyID oldShorthand = m_currentShorthand; 4657 CSSPropertyID oldShorthand = m_currentShorthand;
4568 // TODO(rob.buis): Remove this when the legacy property parser is gone 4658 // TODO(rob.buis): Remove this when the legacy property parser is gone
4569 m_currentShorthand = property; 4659 m_currentShorthand = property;
4570 switch (property) { 4660 switch (property) {
4571 case CSSPropertyWebkitMarginCollapse: { 4661 case CSSPropertyWebkitMarginCollapse: {
4572 CSSValueID id = m_range.consumeIncludingWhitespace().id(); 4662 CSSValueID id = m_range.consumeIncludingWhitespace().id();
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
4715 case CSSPropertyWebkitMaskRepeat: { 4805 case CSSPropertyWebkitMaskRepeat: {
4716 RefPtrWillBeRawPtr<CSSValue> resultX = nullptr; 4806 RefPtrWillBeRawPtr<CSSValue> resultX = nullptr;
4717 RefPtrWillBeRawPtr<CSSValue> resultY = nullptr; 4807 RefPtrWillBeRawPtr<CSSValue> resultY = nullptr;
4718 bool implicit = false; 4808 bool implicit = false;
4719 if (!consumeRepeatStyle(m_range, resultX, resultY, implicit) || !m_range .atEnd()) 4809 if (!consumeRepeatStyle(m_range, resultX, resultY, implicit) || !m_range .atEnd())
4720 return false; 4810 return false;
4721 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatX : CSSPropertyWebkitMaskRepeatX, resultX.release(), important, implici t); 4811 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatX : CSSPropertyWebkitMaskRepeatX, resultX.release(), important, implici t);
4722 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatY : CSSPropertyWebkitMaskRepeatY, resultY.release(), important, implici t); 4812 addProperty(property == CSSPropertyBackgroundRepeat ? CSSPropertyBackgro undRepeatY : CSSPropertyWebkitMaskRepeatY, resultY.release(), important, implici t);
4723 return true; 4813 return true;
4724 } 4814 }
4815 case CSSPropertyBackground:
4816 return consumeBackgroundShorthand(backgroundShorthand(), important);
4817 case CSSPropertyWebkitMask:
4818 return consumeBackgroundShorthand(webkitMaskShorthand(), important);
4725 default: 4819 default:
4726 m_currentShorthand = oldShorthand; 4820 m_currentShorthand = oldShorthand;
4727 CSSParserValueList valueList(m_range); 4821 CSSParserValueList valueList(m_range);
4728 if (!valueList.size()) 4822 if (!valueList.size())
4729 return false; 4823 return false;
4730 m_valueList = &valueList; 4824 m_valueList = &valueList;
4731 return legacyParseShorthand(unresolvedProperty, important); 4825 return legacyParseShorthand(unresolvedProperty, important);
4732 } 4826 }
4733 } 4827 }
4734 4828
4735 } // namespace blink 4829 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698