Chromium Code Reviews| Index: Source/core/css/CSSComputedStyleDeclaration.cpp |
| diff --git a/Source/core/css/CSSComputedStyleDeclaration.cpp b/Source/core/css/CSSComputedStyleDeclaration.cpp |
| index 1c1eb5780f5380fa6fc7e183fc073d7bb97ed3fa..e53518fc553e876e5a2541c38528b53363d86d34 100644 |
| --- a/Source/core/css/CSSComputedStyleDeclaration.cpp |
| +++ b/Source/core/css/CSSComputedStyleDeclaration.cpp |
| @@ -136,6 +136,7 @@ static const CSSPropertyID staticComputableProperties[] = { |
| CSSPropertyHeight, |
| CSSPropertyImageRendering, |
| CSSPropertyIsolation, |
| + CSSPropertyJustifyItems, |
| CSSPropertyJustifySelf, |
| CSSPropertyLeft, |
| CSSPropertyLetterSpacing, |
| @@ -1554,15 +1555,22 @@ Node* CSSComputedStyleDeclaration::styledNode() const |
| return m_node.get(); |
| } |
| -static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlignment(ItemPosition itemPosition, OverflowAlignment overflowAlignment) |
| +static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlignment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, bool isLegacy) |
|
Julien - ping for review
2014/06/24 19:04:56
PLEASE NO BOOLEAN PARAMETERS!
You can either add
jfernandez
2014/06/26 12:58:44
I finally implemented an enumeration.
|
| { |
| RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated(); |
| + if (isLegacy) |
| + result->append(CSSPrimitiveValue::createIdentifier(CSSValueLegacy)); |
| result->append(CSSPrimitiveValue::create(itemPosition)); |
| if (itemPosition >= ItemPositionCenter && overflowAlignment != OverflowAlignmentDefault) |
| result->append(CSSPrimitiveValue::create(overflowAlignment)); |
|
Julien - ping for review
2014/06/24 19:04:56
ASSERT(result.size() <= 2); as you make the assump
jfernandez
2014/06/26 12:58:44
"result->length() <= 2", instead, but I've got the
|
| return result.release(); |
| } |
| +static bool isDisplayFlexibleOrGridBox(EDisplay display) |
| +{ |
| + return display == FLEX || display == INLINE_FLEX || display == GRID || display == INLINE_GRID; |
|
Julien - ping for review
2014/06/24 19:04:56
RenderStyle has some similar checks, maybe we coul
jfernandez
2014/06/26 12:58:44
I've finally implemented a new method "isDisplayFl
|
| +} |
| + |
| PassRefPtrWillBeRawPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropertyID propertyID, EUpdateLayout updateLayout) const |
| { |
| Node* styledNode = this->styledNode(); |
| @@ -1886,7 +1894,7 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValu |
| case CSSPropertyAlignContent: |
| return cssValuePool().createValue(style->alignContent()); |
| case CSSPropertyAlignItems: |
| - return valueForItemPositionWithOverflowAlignment(style->alignItems(), style->alignItemsOverflowAlignment()); |
| + return valueForItemPositionWithOverflowAlignment(style->alignItems(), style->alignItemsOverflowAlignment(), false); |
| case CSSPropertyAlignSelf: { |
| ItemPosition alignSelf = style->alignSelf(); |
| if (alignSelf == ItemPositionAuto) { |
| @@ -1896,7 +1904,7 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValu |
| else |
| alignSelf = ItemPositionStretch; |
| } |
| - return valueForItemPositionWithOverflowAlignment(alignSelf, style->alignSelfOverflowAlignment()); |
| + return valueForItemPositionWithOverflowAlignment(alignSelf, style->alignSelfOverflowAlignment(), false); |
| } |
| case CSSPropertyFlex: |
| return valuesForShorthandProperty(flexShorthand()); |
| @@ -2027,8 +2035,43 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValu |
| return CSSPrimitiveValue::create(style->imageRendering()); |
| case CSSPropertyIsolation: |
| return cssValuePool().createValue(style->isolation()); |
| - case CSSPropertyJustifySelf: |
| - return valueForItemPositionWithOverflowAlignment(style->justifySelf(), style->justifySelfOverflowAlignment()); |
| + case CSSPropertyJustifyItems: { |
| + ItemPosition justifyItems = style->justifyItems(); |
| + bool isLegacy = style->justifyItemsIsLegacy(); |
| + if (justifyItems == ItemPositionAuto) { |
| + Node* parent = styledNode->parentNode(); |
| + // If the inherited value of justify-items includes the legacy keyword, 'auto' |
| + // computes to the the inherited value. |
| + if (parent && parent->computedStyle() && parent->computedStyle()->justifyItemsIsLegacy()) { |
| + justifyItems = parent->computedStyle()->justifyItems(); |
| + isLegacy = parent->computedStyle()->justifyItemsIsLegacy(); |
| + // Otherwise, auto computes to: |
| + } else if (isDisplayFlexibleOrGridBox(style->display())) { |
| + // 'stretch' for flex containers and grid containers. |
| + justifyItems = ItemPositionStretch; |
| + } else { |
| + // 'start' for everything else. |
| + justifyItems = ItemPositionStart; |
| + } |
| + } |
| + return valueForItemPositionWithOverflowAlignment(justifyItems, style->justifyItemsOverflowAlignment(), isLegacy); |
| + } |
| + case CSSPropertyJustifySelf: { |
| + ItemPosition justifySelf = style->justifySelf(); |
| + if (justifySelf == ItemPositionAuto) { |
| + // The auto keyword computes to stretch on absolutely-positioned elements, |
| + if (style->position() == AbsolutePosition) { |
| + justifySelf = ItemPositionStretch; |
| + } else { |
| + // and to the computed value of justify-items on the parent (minus |
| + // any legacy keywords) on all other boxes. |
| + Node* parent = styledNode->parentNode(); |
| + if (parent && parent->computedStyle()) |
| + justifySelf = parent->computedStyle()->justifyItems(); |
| + } |
| + } |
| + return valueForItemPositionWithOverflowAlignment(justifySelf, style->justifySelfOverflowAlignment(), false); |
| + } |
| case CSSPropertyLeft: |
| return valueForPositionOffset(*style, CSSPropertyLeft, renderer); |
| case CSSPropertyLetterSpacing: |