author | Boris Zbarsky <bzbarsky@mit.edu> |
Tue, 08 Dec 2015 14:56:04 -0500 | |
changeset 275920 | 6196e9f9d1392798458a1dc060afa5b2be49b002 |
parent 275919 | f4eaab30e7e73b74ca3e5a82fbecf157b6084ac8 |
child 275921 | 38fbb8418ffcddc43061ec9b1e347efaede8e72f |
push id | 68982 |
push user | bzbarsky@mozilla.com |
push date | Tue, 08 Dec 2015 20:10:01 +0000 |
treeherder | mozilla-inbound@38fbb8418ffc [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | dbaron |
bugs | 930218 |
milestone | 45.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 @@ -4190,16 +4190,22 @@ static bool GetAbsoluteCoord(const nsSty if (eStyleUnit_Coord != aStyle.GetUnit()) return false; aResult = aStyle.GetCoordValue(); NS_ASSERTION(aResult >= 0, "negative widths not allowed"); return true; } +static nscoord +GetBSizeTakenByBoxSizing(StyleBoxSizing aBoxSizing, + nsIFrame* aFrame, + bool aHorizontalAxis, + bool aIgnorePadding); + // Only call on style coords for which GetAbsoluteCoord returned false. static bool GetPercentBSize(const nsStyleCoord& aStyle, nsIFrame* aFrame, nscoord& aResult) { if (eStyleUnit_Percent != aStyle.GetUnit() && !aStyle.IsCalcUnit()) @@ -4281,16 +4287,69 @@ GetPercentBSize(const nsStyleCoord& aSty aResult = std::max(nsRuleNode::ComputeComputedCalc(aStyle, h), 0); return true; } aResult = NSToCoordRound(aStyle.GetPercentValue() * h); return true; } +// Get the amount of vertical space taken out of aFrame's content area due to +// its borders and paddings given the box-sizing value in aBoxSizing. We don't +// get aBoxSizing from the frame because some callers want to compute this for +// specific box-sizing values. aHorizontalAxis is true if our inline direction +// is horisontal and our block direction is vertical. aIgnorePadding is true if +// padding should be ignored. +static nscoord +GetBSizeTakenByBoxSizing(StyleBoxSizing aBoxSizing, + nsIFrame* aFrame, + bool aHorizontalAxis, + bool aIgnorePadding) +{ + nscoord bSizeTakenByBoxSizing = 0; + switch (aBoxSizing) { + case StyleBoxSizing::Border: { + const nsStyleBorder* styleBorder = aFrame->StyleBorder(); + bSizeTakenByBoxSizing += + aHorizontalAxis ? styleBorder->GetComputedBorder().TopBottom() + : styleBorder->GetComputedBorder().LeftRight(); + // fall through + } + case StyleBoxSizing::Padding: { + if (!aIgnorePadding) { + const nsStyleSides& stylePadding = + aFrame->StylePadding()->mPadding; + const nsStyleCoord& paddingStart = + stylePadding.Get(aHorizontalAxis ? NS_SIDE_TOP : NS_SIDE_LEFT); + const nsStyleCoord& paddingEnd = + stylePadding.Get(aHorizontalAxis ? NS_SIDE_BOTTOM : NS_SIDE_RIGHT); + nscoord pad; + // XXXbz Calling GetPercentBSize on padding values looks bogus, since + // percent padding is always a percentage of the inline-size of the + // containing block. We should perhaps just treat non-absolute paddings + // here as 0 instead, except that in some cases the width may in fact be + // known. See bug 1231059. + if (GetAbsoluteCoord(paddingStart, pad) || + GetPercentBSize(paddingStart, aFrame, pad)) { + bSizeTakenByBoxSizing += pad; + } + if (GetAbsoluteCoord(paddingEnd, pad) || + GetPercentBSize(paddingEnd, aFrame, pad)) { + bSizeTakenByBoxSizing += pad; + } + } + // fall through + } + case StyleBoxSizing::Content: + default: + break; + } + return bSizeTakenByBoxSizing; +} + // Handles only -moz-max-content and -moz-min-content, and // -moz-fit-content for min-width and max-width, since the others // (-moz-fit-content for width, and -moz-available) have no effect on // intrinsic widths. enum eWidthProperty { PROP_WIDTH, PROP_MAX_WIDTH, PROP_MIN_WIDTH }; static bool GetIntrinsicCoord(const nsStyleCoord& aStyle, nsRenderingContext* aRenderingContext, @@ -4641,49 +4700,19 @@ nsLayoutUtils::IntrinsicForAxis(Physical nsSize ratio(aFrame->GetIntrinsicRatio()); nscoord ratioISize = (horizontalAxis ? ratio.width : ratio.height); nscoord ratioBSize = (horizontalAxis ? ratio.height : ratio.width); if (ratioBSize != 0) { AddStateBitToAncestors(aFrame, NS_FRAME_DESCENDANT_INTRINSIC_ISIZE_DEPENDS_ON_BSIZE); - nscoord bSizeTakenByBoxSizing = 0; - switch (boxSizing) { - case StyleBoxSizing::Border: { - const nsStyleBorder* styleBorder = aFrame->StyleBorder(); - bSizeTakenByBoxSizing += - horizontalAxis ? styleBorder->GetComputedBorder().TopBottom() - : styleBorder->GetComputedBorder().LeftRight(); - // fall through - } - case StyleBoxSizing::Padding: { - if (!(aFlags & IGNORE_PADDING)) { - const nsStyleSides& stylePadding = - aFrame->StylePadding()->mPadding; - const nsStyleCoord& paddingStart = - stylePadding.Get(horizontalAxis ? NS_SIDE_TOP : NS_SIDE_LEFT); - const nsStyleCoord& paddingEnd = - stylePadding.Get(horizontalAxis ? NS_SIDE_BOTTOM : NS_SIDE_RIGHT); - nscoord pad; - if (GetAbsoluteCoord(paddingStart, pad) || - GetPercentBSize(paddingStart, aFrame, pad)) { - bSizeTakenByBoxSizing += pad; - } - if (GetAbsoluteCoord(paddingEnd, pad) || - GetPercentBSize(paddingEnd, aFrame, pad)) { - bSizeTakenByBoxSizing += pad; - } - } - // fall through - } - case StyleBoxSizing::Content: - default: - break; - } + nscoord bSizeTakenByBoxSizing = + GetBSizeTakenByBoxSizing(boxSizing, aFrame, horizontalAxis, + aFlags & IGNORE_PADDING); nscoord h; if (GetAbsoluteCoord(styleBSize, h) || GetPercentBSize(styleBSize, aFrame, h)) { h = std::max(0, h - bSizeTakenByBoxSizing); result = NSCoordMulDiv(h, ratioISize, ratioBSize); }