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

Side by Side Diff: Source/core/css/CSSComputedStyleDeclaration.cpp

Issue 363133003: [CSS Grid Layout] Adapting align-self, align-items and justify-self to the last CSS 3 spec. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Resolve grid and flex cases during cascade, the rest will wait for layout. Created 6 years, 4 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 /* 1 /*
2 * Copyright (C) 2004 Zack Rusin <zack@kde.org> 2 * Copyright (C) 2004 Zack Rusin <zack@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
6 * Copyright (C) 2011 Sencha, Inc. All rights reserved. 6 * Copyright (C) 2011 Sencha, Inc. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public 9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 { 1549 {
1550 if (!m_node) 1550 if (!m_node)
1551 return 0; 1551 return 0;
1552 if (m_node->isElementNode()) { 1552 if (m_node->isElementNode()) {
1553 if (PseudoElement* element = toElement(m_node)->pseudoElement(m_pseudoEl ementSpecifier)) 1553 if (PseudoElement* element = toElement(m_node)->pseudoElement(m_pseudoEl ementSpecifier))
1554 return element; 1554 return element;
1555 } 1555 }
1556 return m_node.get(); 1556 return m_node.get();
1557 } 1557 }
1558 1558
1559 static ItemPosition resolveAlignmentAuto(ItemPosition position, Node* element)
1560 {
1561 if (position != ItemPositionAuto)
1562 return position;
1563
1564 bool isFlexOrGrid = element && element->computedStyle()
1565 && element->computedStyle()->isDisplayFlexibleOrGridBox();
1566
1567 return isFlexOrGrid ? ItemPositionStretch : ItemPositionStart;
1568 }
1569
1559 static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlig nment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, ItemPositi onType positionType) 1570 static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlig nment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, ItemPositi onType positionType)
1560 { 1571 {
1561 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated (); 1572 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated ();
1562 if (positionType == LegacyPosition) 1573 if (positionType == LegacyPosition)
1563 result->append(CSSPrimitiveValue::createIdentifier(CSSValueLegacy)); 1574 result->append(CSSPrimitiveValue::createIdentifier(CSSValueLegacy));
1564 result->append(CSSPrimitiveValue::create(itemPosition)); 1575 result->append(CSSPrimitiveValue::create(itemPosition));
1565 if (itemPosition >= ItemPositionCenter && overflowAlignment != OverflowAlign mentDefault) 1576 if (itemPosition >= ItemPositionCenter && overflowAlignment != OverflowAlign mentDefault)
1566 result->append(CSSPrimitiveValue::create(overflowAlignment)); 1577 result->append(CSSPrimitiveValue::create(overflowAlignment));
1567 ASSERT(result->length() <= 2); 1578 ASSERT(result->length() <= 2);
1568 return result.release(); 1579 return result.release();
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 } 1890 }
1880 case CSSPropertyDirection: 1891 case CSSPropertyDirection:
1881 return cssValuePool().createValue(style->direction()); 1892 return cssValuePool().createValue(style->direction());
1882 case CSSPropertyDisplay: 1893 case CSSPropertyDisplay:
1883 return cssValuePool().createValue(style->display()); 1894 return cssValuePool().createValue(style->display());
1884 case CSSPropertyEmptyCells: 1895 case CSSPropertyEmptyCells:
1885 return cssValuePool().createValue(style->emptyCells()); 1896 return cssValuePool().createValue(style->emptyCells());
1886 case CSSPropertyAlignContent: 1897 case CSSPropertyAlignContent:
1887 return cssValuePool().createValue(style->alignContent()); 1898 return cssValuePool().createValue(style->alignContent());
1888 case CSSPropertyAlignItems: 1899 case CSSPropertyAlignItems:
1889 return valueForItemPositionWithOverflowAlignment(style->alignItems() , style->alignItemsOverflowAlignment(), NonLegacyPosition); 1900 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAut o(style->alignItems(), styledNode), style->alignItemsOverflowAlignment(), NonLeg acyPosition);
1890 case CSSPropertyAlignSelf: { 1901 case CSSPropertyAlignSelf:
1891 ItemPosition alignSelf = style->alignSelf(); 1902 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAut o(style->alignSelf(), styledNode->parentNode()), style->alignSelfOverflowAlignme nt(), NonLegacyPosition);
1892 if (alignSelf == ItemPositionAuto) {
1893 Node* parent = styledNode->parentNode();
1894 if (parent && parent->computedStyle())
1895 alignSelf = parent->computedStyle()->alignItems();
1896 else
1897 alignSelf = ItemPositionStretch;
1898 }
1899 return valueForItemPositionWithOverflowAlignment(alignSelf, style->a lignSelfOverflowAlignment(), NonLegacyPosition);
1900 }
1901 case CSSPropertyFlex: 1903 case CSSPropertyFlex:
1902 return valuesForShorthandProperty(flexShorthand()); 1904 return valuesForShorthandProperty(flexShorthand());
1903 case CSSPropertyFlexBasis: 1905 case CSSPropertyFlexBasis:
1904 return zoomAdjustedPixelValueForLength(style->flexBasis(), *style); 1906 return zoomAdjustedPixelValueForLength(style->flexBasis(), *style);
1905 case CSSPropertyFlexDirection: 1907 case CSSPropertyFlexDirection:
1906 return cssValuePool().createValue(style->flexDirection()); 1908 return cssValuePool().createValue(style->flexDirection());
1907 case CSSPropertyFlexFlow: 1909 case CSSPropertyFlexFlow:
1908 return valuesForShorthandProperty(flexFlowShorthand()); 1910 return valuesForShorthandProperty(flexFlowShorthand());
1909 case CSSPropertyFlexGrow: 1911 case CSSPropertyFlexGrow:
1910 return cssValuePool().createValue(style->flexGrow()); 1912 return cssValuePool().createValue(style->flexGrow());
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2054 return cssValuePool().createIdentifierValue(CSSValueAuto); 2056 return cssValuePool().createIdentifierValue(CSSValueAuto);
2055 return cssValuePool().createValue(style->hyphenationString(), CSSPri mitiveValue::CSS_STRING); 2057 return cssValuePool().createValue(style->hyphenationString(), CSSPri mitiveValue::CSS_STRING);
2056 case CSSPropertyWebkitBorderFit: 2058 case CSSPropertyWebkitBorderFit:
2057 if (style->borderFit() == BorderFitBorder) 2059 if (style->borderFit() == BorderFitBorder)
2058 return cssValuePool().createIdentifierValue(CSSValueBorder); 2060 return cssValuePool().createIdentifierValue(CSSValueBorder);
2059 return cssValuePool().createIdentifierValue(CSSValueLines); 2061 return cssValuePool().createIdentifierValue(CSSValueLines);
2060 case CSSPropertyImageRendering: 2062 case CSSPropertyImageRendering:
2061 return CSSPrimitiveValue::create(style->imageRendering()); 2063 return CSSPrimitiveValue::create(style->imageRendering());
2062 case CSSPropertyIsolation: 2064 case CSSPropertyIsolation:
2063 return cssValuePool().createValue(style->isolation()); 2065 return cssValuePool().createValue(style->isolation());
2064 case CSSPropertyJustifyItems: { 2066 case CSSPropertyJustifyItems:
2065 // FIXME: I would like this to be tested; is not possible with a lay out test but it 2067 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAut o(style->justifyItems(), styledNode), style->justifyItemsOverflowAlignment(), st yle->justifyItemsPositionType());
2066 // should be possible using a method similar to https://codereview.c hromium.org/351973004 2068 case CSSPropertyJustifySelf:
2067 ItemPosition justifyItems = style->justifyItems(); 2069 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAut o(style->justifySelf(), styledNode->parentNode()), style->justifySelfOverflowAli gnment(), NonLegacyPosition);
2068 ItemPositionType positionType = style->justifyItemsPositionType();
2069 if (justifyItems == ItemPositionAuto) {
2070 Node* parent = styledNode->parentNode();
2071 // If the inherited value of justify-items includes the legacy k eyword, 'auto'
2072 // computes to the the inherited value.
2073 if (parent && parent->computedStyle() && parent->computedStyle() ->justifyItemsPositionType()) {
2074 justifyItems = parent->computedStyle()->justifyItems();
2075 positionType = parent->computedStyle()->justifyItemsPosition Type();
2076 // Otherwise, auto computes to:
2077 } else if (style->isDisplayFlexibleOrGridBox()) {
2078 // 'stretch' for flex containers and grid containers.
2079 justifyItems = ItemPositionStretch;
2080 } else {
2081 // 'start' for everything else.
2082 justifyItems = ItemPositionStart;
2083 }
2084 }
2085 return valueForItemPositionWithOverflowAlignment(justifyItems, style ->justifyItemsOverflowAlignment(), positionType);
2086 }
2087 case CSSPropertyJustifySelf: {
2088 // FIXME: I would like this to be tested; is not possible with a lay out test but it
2089 // should be possible using a method similar to https://codereview.c hromium.org/351973004
2090 ItemPosition justifySelf = style->justifySelf();
2091 if (justifySelf == ItemPositionAuto) {
2092 // The auto keyword computes to stretch on absolutely-positioned elements,
2093 if (style->position() == AbsolutePosition) {
2094 justifySelf = ItemPositionStretch;
2095 } else {
2096 // and to the computed value of justify-items on the parent (minus
2097 // any legacy keywords) on all other boxes.
2098 Node* parent = styledNode->parentNode();
2099 if (parent && parent->computedStyle())
2100 justifySelf = parent->computedStyle()->justifyItems();
2101 }
2102 }
2103 return valueForItemPositionWithOverflowAlignment(justifySelf, style- >justifySelfOverflowAlignment(), NonLegacyPosition);
2104 }
2105 case CSSPropertyLeft: 2070 case CSSPropertyLeft:
2106 return valueForPositionOffset(*style, CSSPropertyLeft, renderer); 2071 return valueForPositionOffset(*style, CSSPropertyLeft, renderer);
2107 case CSSPropertyLetterSpacing: 2072 case CSSPropertyLetterSpacing:
2108 if (!style->letterSpacing()) 2073 if (!style->letterSpacing())
2109 return cssValuePool().createIdentifierValue(CSSValueNormal); 2074 return cssValuePool().createIdentifierValue(CSSValueNormal);
2110 return zoomAdjustedPixelValue(style->letterSpacing(), *style); 2075 return zoomAdjustedPixelValue(style->letterSpacing(), *style);
2111 case CSSPropertyWebkitLineClamp: 2076 case CSSPropertyWebkitLineClamp:
2112 if (style->lineClamp().isNone()) 2077 if (style->lineClamp().isNone())
2113 return cssValuePool().createIdentifierValue(CSSValueNone); 2078 return cssValuePool().createIdentifierValue(CSSValueNone);
2114 return cssValuePool().createValue(style->lineClamp().value(), style- >lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveVa lue::CSS_NUMBER); 2079 return cssValuePool().createValue(style->lineClamp().value(), style- >lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveVa lue::CSS_NUMBER);
(...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after
3129 return list.release(); 3094 return list.release();
3130 } 3095 }
3131 3096
3132 void CSSComputedStyleDeclaration::trace(Visitor* visitor) 3097 void CSSComputedStyleDeclaration::trace(Visitor* visitor)
3133 { 3098 {
3134 visitor->trace(m_node); 3099 visitor->trace(m_node);
3135 CSSStyleDeclaration::trace(visitor); 3100 CSSStyleDeclaration::trace(visitor);
3136 } 3101 }
3137 3102
3138 } // namespace blink 3103 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698