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

Unified Diff: Source/core/css/ComputedStyleCSSValueMapping.cpp

Issue 1136283006: [CSS Grid Layout] Avoid using StyleAdjuster to resolve 'auto' values. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixed some layout tests failures. Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: Source/core/css/ComputedStyleCSSValueMapping.cpp
diff --git a/Source/core/css/ComputedStyleCSSValueMapping.cpp b/Source/core/css/ComputedStyleCSSValueMapping.cpp
index 82532dc88963bb1740096e99e70aa4047022c1e8..176df509d6c67e8cca9a65dc035ac4d44507d09c 100644
--- a/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -382,12 +382,40 @@ static PassRefPtrWillBeRawPtr<CSSValue> valueForReflection(const StyleReflection
return CSSReflectValue::create(direction.release(), offset.release(), valueForNinePieceImage(reflection->mask(), style));
}
-static ItemPosition resolveAlignmentAuto(ItemPosition position, Node* element)
+static ItemPosition resolveContainerAlignmentAuto(ItemPosition position, const LayoutObject* element)
{
- if (position != ItemPositionAuto)
+ if (position != ItemPositionAuto || !element)
return position;
- return isFlexOrGrid(element) ? ItemPositionStretch : ItemPositionStart;
+ LayoutBlock* container = element->containingBlock();
+ if (container && container->style()->justifyItemsPositionType() == LegacyPosition)
+ return container->style()->justifyItemsPosition();
+
+ return element->style()->isDisplayFlexibleOrGridBox() ? ItemPositionStretch : ItemPositionStart;
+}
+
+static ItemPosition resolveSelfAlignmentAuto(ItemPosition position, OverflowAlignment& overflow, const LayoutObject* element)
+{
+ if (position != ItemPositionAuto || !element || element->isOutOfFlowPositioned())
+ return position;
+
+ LayoutBlock* parent = element->containingBlock();
+ if (!parent)
+ return ItemPositionStart;
+
+ overflow = parent->style()->alignItemsOverflowAlignment();
+ return resolveContainerAlignmentAuto(parent->style()->alignItemsPosition(), parent);
+}
+
+static void resolveContentAlignmentAuto(ContentPosition& position, ContentDistributionType& distribution, const LayoutObject* element)
+{
+ if (position != ContentPositionAuto || distribution != ContentDistributionDefault)
+ return;
+
+ if (element && element->style()->isDisplayFlexibleBox())
+ distribution = ContentDistributionStretch;
+ else
+ position = ContentPositionStart;
}
static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlignment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, ItemPositionType positionType)
@@ -451,17 +479,6 @@ static PassRefPtrWillBeRawPtr<CSSValueList> valuesForBackgroundShorthand(const C
return ret.release();
}
-static ContentPosition resolveContentAlignmentAuto(ContentPosition position, ContentDistributionType distribution, Node* element)
-{
- if (position != ContentPositionAuto || distribution != ContentDistributionDefault)
- return position;
-
- bool isFlex = element && element->ensureComputedStyle()
- && element->ensureComputedStyle()->isDisplayFlexibleBox();
-
- return isFlex ? ContentPositionFlexStart : ContentPositionStart;
-}
-
static PassRefPtrWillBeRawPtr<CSSValueList> valueForContentPositionAndDistributionWithOverflowAlignment(ContentPosition position, OverflowAlignment overflowAlignment, ContentDistributionType distribution)
{
RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated();
@@ -1553,12 +1570,19 @@ PassRefPtrWillBeRawPtr<CSSValue> ComputedStyleCSSValueMapping::get(CSSPropertyID
return cssValuePool().createValue(style.display());
case CSSPropertyEmptyCells:
return cssValuePool().createValue(style.emptyCells());
- case CSSPropertyAlignContent:
- return valueForContentPositionAndDistributionWithOverflowAlignment(resolveContentAlignmentAuto(style.alignContentPosition(), style.alignContentDistribution(), styledNode), style.alignContentOverflowAlignment(), style.alignContentDistribution());
+ case CSSPropertyAlignContent: {
+ ContentPosition position = style.alignContentPosition();
+ ContentDistributionType distribution = style.alignContentDistribution();
+ resolveContentAlignmentAuto(position, distribution, layoutObject);
+ return valueForContentPositionAndDistributionWithOverflowAlignment(position, style.alignContentOverflowAlignment(), distribution);
+ }
case CSSPropertyAlignItems:
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.alignItemsPosition(), styledNode), style.alignItemsOverflowAlignment(), NonLegacyPosition);
- case CSSPropertyAlignSelf:
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.alignSelfPosition(), styledNode->parentNode()), style.alignSelfOverflowAlignment(), NonLegacyPosition);
+ return valueForItemPositionWithOverflowAlignment(resolveContainerAlignmentAuto(style.alignItemsPosition(), layoutObject), style.alignItemsOverflowAlignment(), NonLegacyPosition);
+ case CSSPropertyAlignSelf: {
+ OverflowAlignment overflow = style.alignSelfOverflowAlignment();
+ ItemPosition alignSelf = resolveSelfAlignmentAuto(style.alignSelfPosition(), overflow, layoutObject);
+ return valueForItemPositionWithOverflowAlignment(alignSelf, overflow, NonLegacyPosition);
+ }
case CSSPropertyFlex:
return valuesForShorthandProperty(flexShorthand(), style, layoutObject, styledNode, allowVisitedStyle);
case CSSPropertyFlexBasis:
@@ -1573,8 +1597,12 @@ PassRefPtrWillBeRawPtr<CSSValue> ComputedStyleCSSValueMapping::get(CSSPropertyID
return cssValuePool().createValue(style.flexShrink());
case CSSPropertyFlexWrap:
return cssValuePool().createValue(style.flexWrap());
- case CSSPropertyJustifyContent:
- return valueForContentPositionAndDistributionWithOverflowAlignment(resolveContentAlignmentAuto(style.justifyContentPosition(), style.justifyContentDistribution(), styledNode), style.justifyContentOverflowAlignment(), style.justifyContentDistribution());
+ case CSSPropertyJustifyContent: {
+ ContentPosition position = style.justifyContentPosition();
+ ContentDistributionType distribution = style.justifyContentDistribution();
+ resolveContentAlignmentAuto(position, distribution, layoutObject);
+ return valueForContentPositionAndDistributionWithOverflowAlignment(position, style.justifyContentOverflowAlignment(), distribution);
+ }
case CSSPropertyOrder:
return cssValuePool().createValue(style.order(), CSSPrimitiveValue::CSS_NUMBER);
case CSSPropertyFloat:
@@ -1710,9 +1738,12 @@ PassRefPtrWillBeRawPtr<CSSValue> ComputedStyleCSSValueMapping::get(CSSPropertyID
case CSSPropertyIsolation:
return cssValuePool().createValue(style.isolation());
case CSSPropertyJustifyItems:
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.justifyItemsPosition(), styledNode), style.justifyItemsOverflowAlignment(), style.justifyItemsPositionType());
- case CSSPropertyJustifySelf:
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.justifySelfPosition(), styledNode->parentNode()), style.justifySelfOverflowAlignment(), NonLegacyPosition);
+ return valueForItemPositionWithOverflowAlignment(resolveContainerAlignmentAuto(style.justifyItemsPosition(), layoutObject), style.justifyItemsOverflowAlignment(), style.justifyItemsPositionType());
+ case CSSPropertyJustifySelf: {
+ OverflowAlignment overflow = style.justifySelfOverflowAlignment();
+ ItemPosition justifySelf = resolveSelfAlignmentAuto(style.justifySelfPosition(), overflow, layoutObject);
+ return valueForItemPositionWithOverflowAlignment(justifySelf, overflow, NonLegacyPosition);
+ }
case CSSPropertyLeft:
return valueForPositionOffset(style, CSSPropertyLeft, layoutObject);
case CSSPropertyLetterSpacing:

Powered by Google App Engine
This is Rietveld 408576698