author | Daniel Holbert <dholbert@cs.stanford.edu> |
Tue, 22 Jul 2014 08:24:35 -0700 (2014-07-22) | |
changeset 195504 | fc15aa6922065e4396084fb2d87e4486549a8bf6 |
parent 195503 | e776a7beb9ea5f20440e1b13a2acc80241b3e5da |
child 195505 | 24c2f03786ac671248e6497d985a8eb11246901a |
push id | 27184 |
push user | kwierso@gmail.com |
push date | Wed, 23 Jul 2014 00:39:18 +0000 (2014-07-23) |
treeherder | mozilla-central@0ad20ad7b70a [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 984711, 848539 |
milestone | 34.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3586,17 +3586,18 @@ GetPercentHeight(const nsStyleCoord& aSt } nscoord minh; if (GetAbsoluteCoord(pos->mMinHeight, minh) || GetPercentHeight(pos->mMinHeight, f, minh)) { if (minh > h) h = minh; } else { - NS_ASSERTION(pos->mMinHeight.HasPercent(), + NS_ASSERTION(pos->mMinHeight.HasPercent() || + pos->mMinHeight.GetUnit() == eStyleUnit_Auto, "unknown min-height unit"); } if (aStyle.IsCalcUnit()) { aResult = std::max(nsRuleNode::ComputeComputedCalc(aStyle, h), 0); return true; } @@ -3747,22 +3748,28 @@ nsLayoutUtils::IntrinsicForContainer(nsR nsFrame::IndentBy(stderr, gNoiseIndent); static_cast<nsFrame*>(aFrame)->ListTag(stderr); printf_stderr(" %s intrinsic width from frame is %d.\n", aType == MIN_WIDTH ? "min" : "pref", result); #endif // Handle elements with an intrinsic ratio (or size) and a specified // height, min-height, or max-height. + // NOTE: We treat "min-height:auto" as "0" for the purpose of this code, + // since that's what it means in all cases except for on flex items -- and + // even there, we're supposed to ignore it (i.e. treat it as 0) until the + // flex container explicitly considers it. const nsStyleCoord &styleHeight = stylePos->mHeight; const nsStyleCoord &styleMinHeight = stylePos->mMinHeight; const nsStyleCoord &styleMaxHeight = stylePos->mMaxHeight; + if (styleHeight.GetUnit() != eStyleUnit_Auto || - !(styleMinHeight.GetUnit() == eStyleUnit_Coord && - styleMinHeight.GetCoordValue() == 0) || + !(styleMinHeight.GetUnit() == eStyleUnit_Auto || + (styleMinHeight.GetUnit() == eStyleUnit_Coord && + styleMinHeight.GetCoordValue() == 0)) || styleMaxHeight.GetUnit() != eStyleUnit_None) { nsSize ratio = aFrame->GetIntrinsicRatio(); if (ratio.height != 0) { nscoord heightTakenByBoxSizing = 0; switch (boxSizing) { case NS_STYLE_BOX_SIZING_BORDER: {
--- a/layout/generic/nsHTMLReflowState.cpp +++ b/layout/generic/nsHTMLReflowState.cpp @@ -2622,18 +2622,23 @@ nsHTMLReflowState::ComputeMinMaxValues(n // Check for percentage based values and a containing block height that // depends on the content height. Treat them like 'auto' // Likewise, check for calc() with percentages on internal table elements; // that's treated as 'auto' too. // Likewise, if we're a child of a flex container who's measuring our // intrinsic height, then we want to disregard our min-height. + // NOTE: We treat "min-height:auto" as "0" for the purpose of this code, + // since that's what it means in all cases except for on flex items -- and + // even there, we're supposed to ignore it (i.e. treat it as 0) until the + // flex container explicitly considers it. const nsStyleCoord &minHeight = mStylePosition->mMinHeight; - if ((NS_AUTOHEIGHT == aContainingBlockHeight && + if (eStyleUnit_Auto == minHeight.GetUnit() || + (NS_AUTOHEIGHT == aContainingBlockHeight && minHeight.HasPercent()) || (mFrameType == NS_CSS_FRAME_TYPE_INTERNAL_TABLE && minHeight.IsCalcUnit() && minHeight.CalcHasPercent()) || mFlags.mIsFlexContainerMeasuringHeight) { ComputedMinHeight() = 0; } else { ComputedMinHeight() = ComputeHeightValue(aContainingBlockHeight, mStylePosition->mBoxSizing,
--- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -4098,17 +4098,27 @@ nsComputedDOMStyle::DoGetMaxWidth() nsCSSProps::kWidthKTable); return val; } CSSValue* nsComputedDOMStyle::DoGetMinHeight() { nsROCSSPrimitiveValue *val = new nsROCSSPrimitiveValue; - SetValueToCoord(val, StylePosition()->mMinHeight, true, + nsStyleCoord minHeight = StylePosition()->mMinHeight; + + if (eStyleUnit_Auto == minHeight.GetUnit()) { + // In non-flexbox contexts, "min-height: auto" means "min-height: 0" + // XXXdholbert For flex items, we should set |minHeight| to the + // -moz-min-content keyword, instead of 0, once we support -moz-min-content + // as a height value. + minHeight.SetCoordValue(0); + } + + SetValueToCoord(val, minHeight, true, &nsComputedDOMStyle::GetCBContentHeight); return val; } CSSValue* nsComputedDOMStyle::DoGetMinWidth() { nsROCSSPrimitiveValue *val = new nsROCSSPrimitiveValue;
--- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -7448,21 +7448,16 @@ nsRuleNode::ComputePositionData(void* aS SETCOORD_LPAH | SETCOORD_INITIAL_AUTO | SETCOORD_STORE_CALC | SETCOORD_UNSET_INITIAL, aContext, mPresContext, canStoreInRuleTree); SetCoord(*aRuleData->ValueForMaxHeight(), pos->mMaxHeight, parentPos->mMaxHeight, SETCOORD_LPOH | SETCOORD_INITIAL_NONE | SETCOORD_STORE_CALC | SETCOORD_UNSET_INITIAL, aContext, mPresContext, canStoreInRuleTree); - // Make 'auto' values for min-height compute to 0 - if (pos->mMinHeight.GetUnit() == eStyleUnit_Auto) { - pos->mMinHeight.SetCoordValue(0); - } - // box-sizing: enum, inherit, initial SetDiscrete(*aRuleData->ValueForBoxSizing(), pos->mBoxSizing, canStoreInRuleTree, SETDSC_ENUMERATED | SETDSC_UNSET_INITIAL, parentPos->mBoxSizing, NS_STYLE_BOX_SIZING_CONTENT, 0, 0, 0, 0); // align-content: enum, inherit, initial
--- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -1229,17 +1229,17 @@ nsStylePosition::nsStylePosition(void) mOffset.SetLeft(autoCoord); mOffset.SetTop(autoCoord); mOffset.SetRight(autoCoord); mOffset.SetBottom(autoCoord); mWidth.SetAutoValue(); mMinWidth.SetAutoValue(); mMaxWidth.SetNoneValue(); mHeight.SetAutoValue(); - mMinHeight.SetCoordValue(0); + mMinHeight.SetAutoValue(); mMaxHeight.SetNoneValue(); mFlexBasis.SetAutoValue(); // The initial value of grid-auto-columns and grid-auto-rows is 'auto', // which computes to 'minmax(min-content, max-content)'. mGridAutoColumnsMin.SetIntValue(NS_STYLE_GRID_TRACK_BREADTH_MIN_CONTENT, eStyleUnit_Enumerated); mGridAutoColumnsMax.SetIntValue(NS_STYLE_GRID_TRACK_BREADTH_MAX_CONTENT,
--- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -1376,34 +1376,37 @@ struct nsStylePosition { // Note that these functions count 'auto' as depending on the // container since that's the case for absolutely positioned elements. // However, some callers do not care about this case and should check // for it, since it is the most common case. // FIXME: We should probably change the assumption to be the other way // around. bool HeightDependsOnContainer() const - { return HeightCoordDependsOnContainer(mHeight); } + { + return mHeight.GetUnit() == eStyleUnit_Auto || // CSS 2.1, 10.6.4, item (5) + HeightCoordDependsOnContainer(mHeight); + } + + // NOTE: The comment above MinWidthDependsOnContainer about flex items + // applies here, too. bool MinHeightDependsOnContainer() const { return HeightCoordDependsOnContainer(mMinHeight); } bool MaxHeightDependsOnContainer() const { return HeightCoordDependsOnContainer(mMaxHeight); } bool OffsetHasPercent(mozilla::css::Side aSide) const { return mOffset.Get(aSide).HasPercent(); } private: static bool WidthCoordDependsOnContainer(const nsStyleCoord &aCoord); static bool HeightCoordDependsOnContainer(const nsStyleCoord &aCoord) - { - return aCoord.GetUnit() == eStyleUnit_Auto || // CSS 2.1, 10.6.4, item (5) - aCoord.HasPercent(); - } + { return aCoord.HasPercent(); } }; struct nsStyleTextOverflowSide { nsStyleTextOverflowSide() : mType(NS_STYLE_TEXT_OVERFLOW_CLIP) {} bool operator==(const nsStyleTextOverflowSide& aOther) const { return mType == aOther.mType && (mType != NS_STYLE_TEXT_OVERFLOW_STRING ||