From 668bee9c72c0d3bfe11f228733955e5b1a3f4c8b Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 8 Dec 2015 14:56:20 -0500 Subject: [PATCH] Bug 930218 part 2. Account for the parent's box-sizing whe figuring out the percentage height of a kid with an intrinsic ratio for purposes of determining the parent's shrink-wrap width. r=dbaron --- layout/base/nsLayoutUtils.cpp | 29 +++++++++++++------- layout/reftests/box-sizing/intrinsic-1g.html | 9 ++++++ layout/reftests/box-sizing/intrinsic-1h.html | 9 ++++++ layout/reftests/box-sizing/intrinsic-1i.html | 12 ++++++++ layout/reftests/box-sizing/intrinsic-1j.html | 10 +++++++ layout/reftests/box-sizing/intrinsic-1k.html | 10 +++++++ layout/reftests/box-sizing/intrinsic-1l.html | 13 +++++++++ layout/reftests/box-sizing/intrinsic-1m.html | 10 +++++++ layout/reftests/box-sizing/intrinsic-1n.html | 10 +++++++ layout/reftests/box-sizing/intrinsic-1o.html | 13 +++++++++ layout/reftests/box-sizing/reftest.list | 9 ++++++ 11 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 layout/reftests/box-sizing/intrinsic-1g.html create mode 100644 layout/reftests/box-sizing/intrinsic-1h.html create mode 100644 layout/reftests/box-sizing/intrinsic-1i.html create mode 100644 layout/reftests/box-sizing/intrinsic-1j.html create mode 100644 layout/reftests/box-sizing/intrinsic-1k.html create mode 100644 layout/reftests/box-sizing/intrinsic-1l.html create mode 100644 layout/reftests/box-sizing/intrinsic-1m.html create mode 100644 layout/reftests/box-sizing/intrinsic-1n.html create mode 100644 layout/reftests/box-sizing/intrinsic-1o.html diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 2d288d04e78..cb893d44c2b 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -4204,8 +4204,9 @@ GetBSizeTakenByBoxSizing(StyleBoxSizing aBoxSizing, // Only call on style coords for which GetAbsoluteCoord returned false. static bool GetPercentBSize(const nsStyleCoord& aStyle, - nsIFrame* aFrame, - nscoord& aResult) + nsIFrame* aFrame, + bool aHorizontalAxis, + nscoord& aResult) { if (eStyleUnit_Percent != aStyle.GetUnit() && !aStyle.IsCalcUnit()) @@ -4231,7 +4232,7 @@ GetPercentBSize(const nsStyleCoord& aStyle, const nsStyleCoord& bSizeCoord = pos->BSize(wm); nscoord h; if (!GetAbsoluteCoord(bSizeCoord, h) && - !GetPercentBSize(bSizeCoord, f, h)) { + !GetPercentBSize(bSizeCoord, f, aHorizontalAxis, h)) { NS_ASSERTION(bSizeCoord.GetUnit() == eStyleUnit_Auto || bSizeCoord.HasPercent(), "unknown block-size unit"); @@ -4261,7 +4262,7 @@ GetPercentBSize(const nsStyleCoord& aStyle, nscoord maxh; if (GetAbsoluteCoord(maxBSizeCoord, maxh) || - GetPercentBSize(maxBSizeCoord, f, maxh)) { + GetPercentBSize(maxBSizeCoord, f, aHorizontalAxis, maxh)) { if (maxh < h) h = maxh; } else { @@ -4274,7 +4275,7 @@ GetPercentBSize(const nsStyleCoord& aStyle, nscoord minh; if (GetAbsoluteCoord(minBSizeCoord, minh) || - GetPercentBSize(minBSizeCoord, f, minh)) { + GetPercentBSize(minBSizeCoord, f, aHorizontalAxis, minh)) { if (minh > h) h = minh; } else { @@ -4283,6 +4284,14 @@ GetPercentBSize(const nsStyleCoord& aStyle, "unknown min block-size unit"); } + // Now adjust h for box-sizing styles on the parent. We never ignore padding + // here. That could conceivably cause some problems with fieldsets (which are + // the one place that wants to ignore padding), but solving that here without + // hardcoding a check for f being a fieldset-content frame is a bit of a pain. + nscoord bSizeTakenByBoxSizing = + GetBSizeTakenByBoxSizing(pos->mBoxSizing, f, aHorizontalAxis, false); + h = std::max(0, h - bSizeTakenByBoxSizing); + if (aStyle.IsCalcUnit()) { aResult = std::max(nsRuleNode::ComputeComputedCalc(aStyle, h), 0); return true; @@ -4328,11 +4337,11 @@ GetBSizeTakenByBoxSizing(StyleBoxSizing aBoxSizing, // 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)) { + GetPercentBSize(paddingStart, aFrame, aHorizontalAxis, pad)) { bSizeTakenByBoxSizing += pad; } if (GetAbsoluteCoord(paddingEnd, pad) || - GetPercentBSize(paddingEnd, aFrame, pad)) { + GetPercentBSize(paddingEnd, aFrame, aHorizontalAxis, pad)) { bSizeTakenByBoxSizing += pad; } } @@ -4711,13 +4720,13 @@ nsLayoutUtils::IntrinsicForAxis(PhysicalAxis aAxis, nscoord h; if (GetAbsoluteCoord(styleBSize, h) || - GetPercentBSize(styleBSize, aFrame, h)) { + GetPercentBSize(styleBSize, aFrame, horizontalAxis, h)) { h = std::max(0, h - bSizeTakenByBoxSizing); result = NSCoordMulDiv(h, ratioISize, ratioBSize); } if (GetAbsoluteCoord(styleMaxBSize, h) || - GetPercentBSize(styleMaxBSize, aFrame, h)) { + GetPercentBSize(styleMaxBSize, aFrame, horizontalAxis, h)) { h = std::max(0, h - bSizeTakenByBoxSizing); nscoord maxISize = NSCoordMulDiv(h, ratioISize, ratioBSize); if (maxISize < result) @@ -4725,7 +4734,7 @@ nsLayoutUtils::IntrinsicForAxis(PhysicalAxis aAxis, } if (GetAbsoluteCoord(styleMinBSize, h) || - GetPercentBSize(styleMinBSize, aFrame, h)) { + GetPercentBSize(styleMinBSize, aFrame, horizontalAxis, h)) { h = std::max(0, h - bSizeTakenByBoxSizing); nscoord minISize = NSCoordMulDiv(h, ratioISize, ratioBSize); if (minISize > result) diff --git a/layout/reftests/box-sizing/intrinsic-1g.html b/layout/reftests/box-sizing/intrinsic-1g.html new file mode 100644 index 00000000000..272d76720e8 --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1g.html @@ -0,0 +1,9 @@ + + +
+ +
+ diff --git a/layout/reftests/box-sizing/intrinsic-1h.html b/layout/reftests/box-sizing/intrinsic-1h.html new file mode 100644 index 00000000000..f063add0aae --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1h.html @@ -0,0 +1,9 @@ + + +
+ +
+ diff --git a/layout/reftests/box-sizing/intrinsic-1i.html b/layout/reftests/box-sizing/intrinsic-1i.html new file mode 100644 index 00000000000..6d46b3d4886 --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1i.html @@ -0,0 +1,12 @@ + + +
+
+ +
+
+ diff --git a/layout/reftests/box-sizing/intrinsic-1j.html b/layout/reftests/box-sizing/intrinsic-1j.html new file mode 100644 index 00000000000..ca398338ab5 --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1j.html @@ -0,0 +1,10 @@ + + +
+ + +
+ diff --git a/layout/reftests/box-sizing/intrinsic-1k.html b/layout/reftests/box-sizing/intrinsic-1k.html new file mode 100644 index 00000000000..00adb1cba10 --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1k.html @@ -0,0 +1,10 @@ + + +
+ + +
+ diff --git a/layout/reftests/box-sizing/intrinsic-1l.html b/layout/reftests/box-sizing/intrinsic-1l.html new file mode 100644 index 00000000000..38f4cef8b7a --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1l.html @@ -0,0 +1,13 @@ + + +
+
+ + +
+
+ diff --git a/layout/reftests/box-sizing/intrinsic-1m.html b/layout/reftests/box-sizing/intrinsic-1m.html new file mode 100644 index 00000000000..09dbc75bb9e --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1m.html @@ -0,0 +1,10 @@ + + +
+ + +
+ diff --git a/layout/reftests/box-sizing/intrinsic-1n.html b/layout/reftests/box-sizing/intrinsic-1n.html new file mode 100644 index 00000000000..edae6a69fc4 --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1n.html @@ -0,0 +1,10 @@ + + +
+ + +
+ diff --git a/layout/reftests/box-sizing/intrinsic-1o.html b/layout/reftests/box-sizing/intrinsic-1o.html new file mode 100644 index 00000000000..a463307057e --- /dev/null +++ b/layout/reftests/box-sizing/intrinsic-1o.html @@ -0,0 +1,13 @@ + + +
+
+ + +
+
+ diff --git a/layout/reftests/box-sizing/reftest.list b/layout/reftests/box-sizing/reftest.list index c8faf5176a1..db1e69a6655 100644 --- a/layout/reftests/box-sizing/reftest.list +++ b/layout/reftests/box-sizing/reftest.list @@ -4,4 +4,13 @@ == intrinsic-1d.html intrinsic-1-ref.html == intrinsic-1e.html intrinsic-1-ref.html == intrinsic-1f.html intrinsic-1-ref.html +== intrinsic-1g.html intrinsic-1-ref.html +== intrinsic-1h.html intrinsic-1-ref.html +== intrinsic-1i.html intrinsic-1-ref.html +== intrinsic-1j.html intrinsic-1-ref.html +== intrinsic-1k.html intrinsic-1-ref.html +== intrinsic-1l.html intrinsic-1-ref.html +== intrinsic-1m.html intrinsic-1-ref.html +== intrinsic-1n.html intrinsic-1-ref.html +== intrinsic-1o.html intrinsic-1-ref.html == computed-size-reporting.html computed-size-reporting-ref.html